MyBatis學習(三)–Mybatis編寫方式
標籤(空格分隔): MyBatis學習
MyBatis有兩種編寫模式,分別是傳統的DAO模式和Mapper模式。在介紹這兩者編寫方式之前,先簡單介紹下兩個比較關鍵的對象,分別是:SqlSessionFactory和SqlSession
SqlSessionFactory
SqlSessionFactory是一個接口,接口中定義了不同的openSession方法用來創建會話工廠。
單例模式,一旦創建作用於整個應用運行期間,主要通過全局配置文件SqlMaperConfig.xml創建
SqlSession
會話工程,是一個面向用戶(程序員)的接口,定義了很多數據庫操作方法,默認的實現是DefaultSqlSession。
執行過程如下:
1、加載數據源等配置信息
2、創建數據庫對象
3、創建事務
4、創建Executor,執行數據庫操作每一個線程都有一個自己的SqlSession實例。是一個線程不安全的類,每次打開一個sqlSession。都需要執行關閉sqlsession
MyBatis環境搭建
1、導入依賴jar包
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
2、創建全局配置文件
<?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="mysql" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="/mapper/User.xml"/>
</mappers>
</configuration>
3、創建mapper文件
<mapper namespace="test">
<!-- 根據id獲取用戶信息 -->
<select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select * from user where id = #{id}
</select>
<!-- 自定義條件查詢用戶列表 -->
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="cn.itcast.mybatis.po.User">
select * from user where username like '%${value}%'
</select>
</mapper>
開發方式一:原始Dao的開發方式
需要編寫一個Dao接口類和一個Dao實現類
創建DAO接口和實現類
接口:
Public interface UserDao {
public User getUserById(int id) throws Exception;
}
實現類:
Public class UserDaoImpl implements UserDao {
//注入SqlSessionFactory
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.setSqlSessionFactory(sqlSessionFactory);
}
private SqlSessionFactory sqlSessionFactory;
@Override
public User getUserById(int id) throws Exception {
SqlSession session = sqlSessionFactory.openSession();
User user = null;
try {
//通過sqlsession調用selectOne方法獲取一條結果集
//參數1:指定定義的statement的id,參數2:指定向statement中傳遞的參數
user = session.selectOne("test.findUserById", 1);
System.out.println(user);
} finally{
session.close();
}
return user;
}
}
總結
存在以下問題:
1、Dao方法存在重複代碼,通過SqlSessionFactory創建會話,以及關閉會話等操作
2、在數據庫操作方法中,明確指定了執行方法的statement id。存在硬編碼操作,不利於維護
開發方式二:Mapper動態代理
實現原理
Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由MyBatis框架根據接口定義創建接口的動態代理對象,代理對象方法如同Dao的實現類。但是要實現接口的動態代理對象,我們需要遵循一定的規範,如下:
1、Mapper.xml文件中的namespace於mapper接口的類路徑相同
2、Mapper的方法名和Mapper.xml中定義的statement id相同
3、Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql的輸入參數類型相同
4、接口中定義的輸入參數和mapper.xml的sql的輸出參數也保持相同
舉例說明
在上述的環境搭建中,已經創建了一個接口和mapper.xml。只需要保證遵循了上述規範,即可測試。
總結
selectOne和selectList
動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。namespace
mybatis官方推薦使用mapper代理方法開發mapper接口,程序員不用編寫mapper接口實現類,使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。