MyBatis(一) 入門
ORM模型
java中的物件和資料庫中的表建立對映關係,通過pojo物件能夠訪問到資料庫中的表,而且資料庫的中表能
對映為pojo物件。
Hibernate缺點
* 做為全表對映框架,比如更新時候需要傳送所有的欄位更新
* 無法根據不同的條件組裝不同的SQL
* 多表關聯的查詢支援較差,並不支援儲存過程呼叫
* 雖然有HQL,但效能較差。大型網際網路系統需要優化SQL,而hibernate做不到。
MyBatis
為了解決Hibernate的不足,一個半自動對映的框架產生。mybatis的對映檔案包含以下三個部分
* SQL
* 對映規則
* PJO
MyBatis的基本構成
MyBatis的核心元件
* SqlSessionFactoryBuilder(構造器): 它會根據配置資訊或者程式碼來生成SqlSessionFactory(工廠介面)
* SqlSessionFactory: 依靠工廠來生成SqlSession(會話)。
* SqlSession: 是一個既可以傳送SQL去執行並返回結果,也可以獲取Mapper的介面
* SQL Mapper: 它是MyBatis新設計的元件,由一個Java介面和XML檔案構成,需要給出對應的SQL和對映規則。
負責傳送SQL去執行,並返回出結果。
構建SqlSessionFactory
每個MyBatis的應用都是以SqlSessionFactory的例項為中心的,SqlSessionFactory的例項可以通過
SqlSessionFactoryBuilder獲得,SqlSessionFactory是一個工程介面而不是一個實現類,它的任務是建立
SqlSession.SqlSession類似於一個JDBC的Connection物件。
Configuration類物件中存放配置了Mybatis的資訊,在MyBatis中提供了兩個實現類,DefaultSQLSessionFactory(預設使用)和SqlSessionManager
* 使用xml方式構建
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<!-- 採用JDBC的事務管理方式 -->
<transactionManager type="JDBC"/>
<!-- 配置資料庫的連結資訊 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 定義對映器,引入的xml檔案的作用是,提供了SQL和SQL對POJO的對映規則定義,
它包含了對映器裡面的資訊,Mybatis將會為我們解析這個xml生成對映器
-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
可以自己建立一個流讀取xml檔案,交給builder
public static SqlSessionFactory getSqlSessionFactory(){
InputStream input = null;
SqlSessionFactory factory = null;
try {
input = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
return factory;
}
實際上,MyBatis解析程式將會將這個配置檔案讀取到configuration物件中,然後利用sqlsessionfactorybuilder讀取這個物件來建立
SQLSessionFactory。
* 使用程式碼的方式進行構建(不建議)
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
構建SqlSession
類似於jdbc的Connection的物件,SqlSession是一個介面類,真正執行的是Executor介面,SqlSession只是接受資訊並返回結果。
SqlSession session = null;
try{
session = factory.openSession();
//some code ...
session.commit();
}catch(Exception e){
e.printStackTrace();
session.rollback();
}finally{
//確保資源被關閉
if(session!=null){
session.close();
}
}
對映器對映器是由Java介面和XML檔案(或者註解),它的作用如下:
* 定義引數型別
* 描述快取
* 描述SQL語句
* 定義查詢結果和pojo對映關係
xml建立
1. 建立介面
public interface StudentService {
public Student queryStudentInfo(Integer id);
}
2. 建立xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bing.mapper.StudentMapper">
<select id="queryStudentInfo" resultType="student">
select stu_id as stuId,stu_age as stuAge,stu_sex as stuSex,stu_name as stuName
from student_info where stu_id = #{id}
</select>
</mapper>
* namespace的值,必須和定義的介面的全限定名一致
* id 表示介面的方法名,resultType表示返回的資料型別,可以是物件的全限定名或者是別名
在mybatis-config.xml中定義別名,上面的就可以改為resultType= "Student"
<!-- 定義別名 -->
<typeAliases>
<typeAlias alias="Student" type="cn.bing.pojo.Student"/>
</typeAliases>
* parameterType:定義傳入引數的型別
* 定義的pojo,必須符合javaBean的規範
* SQL列的列名和pojo的屬性名保持一致,就會將結果對映到屬性上,在這裡都是使用了和pojo物件屬性相同的別名
生命週期
1. SqlSessionFactoryBuilder
builder負責利用讀取的xml檔案資訊來構建SqlSessionFactory,一旦構建完畢就可以回收,因而它的生命週期只是存在方法的區域性,作用只是用來建立factory物件。
2. SqlSessionFactory
SqlSessionFactory的作用就是建立SqlSession,而SqlSession就是一個會話,每次訪問資料庫都需要通過SqlSessionFactory來建立SqlSession,因而SqlSessionFactory是存在MyBatis的整個生命週期內的,並且SqlSessionFactory的建立設計為單例的
3. SqlSession
SqlSession是一個會話,生命週期是資料庫的一個事務請求過程中,而且每次使用完畢,都必須關閉,如前面在finally中關閉。
4. Mapper
Mapper是一個介面,它的作用就是傳送SQL,然後返回我們需要的結果。因而它的生命週期在一個SqlSession的事務方法之內,最大的範圍和SqlSession一致。當SqlSession銷燬的時候,對應的Mapper也會去銷燬
相關文章
- MyBatis從入門到精通(一):MyBatis入門MyBatis
- MyBatis系列(一):MyBatis入門MyBatis
- MyBatis入門學習(一)MyBatis
- MyBatis入門基礎(一)MyBatis
- Mybatis入門及第一個Mybatis程式MyBatis
- 【Mybatis】Mybatis快速入門MyBatis
- 【mybatis學習之入門(一)】MyBatis
- MyBatis 入門MyBatis
- Mybatis入門MyBatis
- MyBatis1:MyBatis入門MyBatis
- 深入淺出Mybatis原始碼系列(一)---Mybatis入門MyBatis原始碼
- MyBatis(二)MyBatis入門程式(MyBatis demo)MyBatis
- mybatis入門程式MyBatis
- mybatis快速入門MyBatis
- mybatis入門教程MyBatis
- MyBatis基礎:MyBatis入門(1)MyBatis
- 入門MyBatis框架我一點都不慌MyBatis框架
- mybatis 學習--mybatis基本用法入門MyBatis
- mybatis入門學習MyBatis
- Mybatis極速入門MyBatis
- MyBatis--快速入門MyBatis
- 轉載:mybatis入門MyBatis
- Mybatis 入門介紹MyBatis
- 30分鐘入門MyBatisMyBatis
- MyBatis入門——瞭解配置MyBatis
- Mybatis框架 入門學習MyBatis框架
- MyBatis研習錄(01)——MyBatis概述與入門MyBatis
- Mybatis入門看這一篇就夠了MyBatis
- MyBatis 框架之快速入門程式MyBatis框架
- Mybatis-Plus入門實踐MyBatis
- MyBatis-Plus筆記(入門)MyBatis筆記
- Java持久層框架Mybatis入門Java框架MyBatis
- 【MyBatis】3:MyBatis環境搭建及入門程式示例MyBatis
- MyBatis從入門到精通(九):MyBatis高階結果對映之一對一對映MyBatis
- mybatis入門基礎(七)----延遲載入MyBatis
- MyBatis基於Maven入門例項MyBatisMaven
- MyBatis入門——瞭解基本概念MyBatis
- Mybatis註解開發案例(入門)MyBatis