MyBatis入門學習
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
MyBatis是一個優秀的持久層架構,它對jdbc的操作資料庫的過程進行封裝,使開發者隻需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、建立connection、建立statement、手動設定參數、結果集檢索等jdbc繁雜的過程代碼。
架構圖:
1、 mybatis配置
SqlMapConfig.xml,此檔案作為mybatis的全局配置檔案,配置了mybatis的運作環境等資訊。
mapper.xml檔案即sql映射檔案,檔案中配置了操作資料庫的sql語句。此檔案需要在SqlMapConfig.xml中加載。
2、 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠
3、 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
4、 mybatis底層自定義了Executor執行器接口操作資料庫,Executor接口有兩個實作,一個是基本執行器、一個是緩存執行器。
5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置資訊及sql映射資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
6、 Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前将輸入的java對象映射至sql中,輸入參數映射就是jdbc程式設計中對preparedStatement設定參數。
7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後将輸出結果映射至java對象中,輸出結果映射過程相當于jdbc程式設計中對結果的解析處理過程。
入門案例:
mybaits的代碼由github.com管理
下載下傳位址:https://github.com/mybatis/mybatis-3/releases
1.1.1. 建立java工程
1.1.2. 加入jar包
1.1.3. 加入配置檔案
如下圖建立資源檔案夾config,加入log4j.properties和SqlMapConfig.xml配置檔案
1.1.4. log4j.properties(用來輸出日志)
在config下建立log4j.properties如下:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
1.1.5. SqlMapConfig.xml (SqlMapConfig.xml是mybatis核心配置檔案,配置檔案内容為資料源、事務管理。)
在config下建立SqlMapConfig.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>
<!-- 和spring整合後 environments配置将廢除 -->
<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/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
1.1.6. 建立pojo
pojo類作為mybatis進行sql映射使用,po類通常與資料庫表對應,
User.java如下:
Public class User {
private Integer id;
private String username;// 使用者姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 位址
get/set……
1.1.7. sql映射檔案
在config下的sqlmap目錄下建立sql映射檔案User.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">
<!-- namespace:命名空間,用于隔離sql,還有一個很重要的作用,後面會講 -->
<mapper namespace="test">
</mapper>
1.1.7. 第七步:加載映射檔案
mybatis架構需要加載Mapper.xml映射檔案
将users.xml添加在SqlMapConfig.xml,如下:
1.1.8. 映射檔案:
在user.xml中添加select标簽,編寫sql:
<?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">
<!-- namespace:命名空間,用于隔離sql,還有一個很重要的作用,後面會講 -->
<mapper namespace="test">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:聲明輸入參數的類型 -->
<!-- resultType:聲明輸出結果的類型,應該填寫pojo的全路徑 -->
<!-- #{}:輸入參數的占位符,相當于jdbc的? -->
<select id="queryUserById" parameterType="int"
resultType="cn.itcast.mybatis.pojo.User">
SELECT * FROM `user` WHERE id = #{id}
</select>
</mapper>
1.1.9. 測試程式:
測試程式步驟:
1. 建立SqlSessionFactoryBuilder對象
2. 加載SqlMapConfig.xml配置檔案
3. 建立SqlSessionFactory對象
4. 建立SqlSession對象
5. 執行SqlSession對象執行查詢,擷取結果User
6. 列印結果
7. 釋放資源
MybatisTest編寫測試程式如下:
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void init() throws Exception {
// 1. 建立SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加載SqlMapConfig.xml配置檔案
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 3. 建立SqlSessionFactory對象
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() throws Exception {
// 4. 建立SqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 執行SqlSession對象執行查詢,擷取結果User
// 第一個參數是User.xml的statement的id,第二個參數是執行sql需要的參數;
Object user = sqlSession.selectOne("queryUserById", 1);
// 6. 列印結果
System.out.println(user);
// 7. 釋放資源
sqlSession.close();
}
}
運作結果: