MyBatis架構概述
mybatis是一個優秀的基于java的持久層架構,它内部封裝了jdbc,使開發者隻需要關注sql語句本身,而不需要花費精力去處理加載驅動、建立連接配接、建立statement等繁雜的過程。
mybatis通過xml或注解的方式将要執行的各種statement配置起來,并通過java對象和statement中sql的動态參數進行映射生成最終執行的sql語句,最後由mybatis架構執行sql并将結果映射為java對象并傳回。
采用ORM思想解決了實體和資料庫映射的問題,對jdbc進行了封裝,屏蔽了jdbc api底層通路細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作。 為了我們能夠更好掌握架構運作的内部過程,并且有更好的體驗,下面我們将從自定義Mybatis架構開始來學習架構。此時我們将會體驗架構從無到有的過程體驗,也能夠很好的綜合前面階段所學的基礎。
本文是Mybatis 使用代理dao的方式實作增删改查的原理
首先編寫一個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>
<!--配置Mybatis的環境-->
<environments default="mysql">
<!--配置mysql環境-->
<environment id="mysql">
<!--配置事務類型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置資料源,也就是連接配接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm?
characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--配置mybatis映射的位置-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
在resources目錄下 建立一個mappers目錄,在然後建立一個UserMapper.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="com.jd.dao.UserMapper">
<select id="findUser" resultType="com.jd.domain.User">
select id ,userName as userName,birthday as birthday,sex as sex,
address as address FROM user where yn=1
</select>
</mapper>
建立一個實體類
@Data
public class User {
private Integer id;
private Date birthday;
private String userName;
private String sex;
private String address;
private Integer yn;
}
建立一個接口類
public interface UserMapper {
/**
* 查詢所用使用者
*/
public List<User> findUser();
}
編寫測試類
public class MybatisTest {
@Test
public void test() throws IOException {
//1、讀取配置檔案
InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
//2、建立SqlSessionFactory的建構者對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、使用建構者建立工廠對象SqlSessionFactory
SqlSessionFactory factory= builder.build(in);
//4、使用SqlSessionFactory建立SqlSession
SqlSession session=factory.openSession();
//5、使用SqlSession建立dao接口的代理對象
UserMapper userDao =session.getMapper(UserMapper.class);
//6、使用代理對象執行查詢方法
List<User> list=userDao.findUser();
for (User user:list){
System.out.println(user);
}
//7、釋放資源
session.close();
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下來分析這個查詢的過程,這其中使用的建構者設計模式、工廠模式、代理模式
1、 InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml"); 此處使用的是dom4j 解析xml檔案,擷取驅動 連接配接 賬号 密碼 和映射配置檔案
2、//2、建立SqlSessionFactory的建構者對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、使用建構者建立工廠對象SqlSessionFactory
SqlSessionFactory factory= builder.build(in);
此處使用的是建構者設計模式,優勢:把對象的建立細節隐藏,使用者直接調用方法即可拿到對象
3、//4、使用SqlSessionFactory建立SqlSession
SqlSession session=factory.openSession();
此處使用的是工廠設計模式,生産SqlSession使用了工廠設計模式,優勢:解耦(降低了類之間的依賴關系)
4、//5、使用SqlSession建立dao接口的代理對象
UserMapper userDao =session.getMapper(UserMapper.class);
建立dao層的接口實作類使用的是代理設計模式,優勢,不修改源碼的基礎上對已有方法的增強
5、根據之前的配置檔案,執行sql語句
<mapper namespace="com.jd.dao.UserMapper">
<select id="findUser" resultType="com.jd.domain.User">
select id ,userName as userName,birthday as birthday,sex as sex,
address as address FROM user where yn=1
</select>
</mapper>
namespace ,是接口類相同
id 是接口類裡的方法,
resultType,對傳回的結果進行封裝
本文章寫的是使用代理對象方式,調用接口類的方法,執行sql語句
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6FkaNpXV610dNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4QTO1AzMyITMwIjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
接下來總結一下:Mybatis 使用代理dao的方式實作增删改查的原理,無非就是做了兩件事
1、解析xml,把資料進行封裝
2、建立代理對象,調用selectList方法