#1-> 配置文件MyBatisConfg.xml
在配置文件中的<configuration>裏的標籤有嚴格的標籤擺放順序,如果順序不對,會報錯。
例如,我之前把<settings>標籤放在了<properties>標籤之前,系統報錯如下
<configuration>標籤裏的嚴格順序應該是:
properties -> settings -> typeAliases -> typeHandlers -> objectFactory -> objectWrapperFactory -> reflectorFactory -> plugins -> environments -> databaseIdProvider -> mappers
-> MyBatisConfg.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>
<!--引入外部配置文件-->
<properties resource="mysqlconfg.properties"/>
<!--日誌配置-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--配置mysql的環境-->
<environments default="mysql">
<environment id="mysql">
<!--配置事務類型-->
<transactionManager type="JDBC"/>
<!--配置連接池/數據源類型-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--配置映射關係-->
<mappers>
<mapper resource="com/yy/dao/IUserMapper.xml"/>
</mappers>
</configuration>
-> mysqlconfg.properties
注意MySQL6以後的driver寫法和5之前的有點區別。
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost/maven_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username = root
password = 1007
#2-> 映射文件IUserMapper.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.yy.dao.IUserMapper">
<select id="findAll" resultType="com.yy.domain.User">
select * from user;
</select>
</mapper>
需要注意的是這裏的resultType必須指定全限定類名,不能寫別稱,之前的項目可以寫別稱是因爲添加了掃描機制。
#3-> mybatis框架執行過程中對應的設計模式
這是一個@Test類mybatisTest(),一個完整的通過mybatis框架從數據庫中獲取數據放到List<User>並打印輸出的demo。
@Test
public void mybatisTest() throws IOException {
// 1.讀取配置文件
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");
// 2.創建SQLSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
// 3.使用工廠生產SQLSession對象
SqlSession session = factory.openSession();
// 4.使用sqlsession創建Dao接口(Mapper)的代理對象
IUserMapper userMapper = session.getMapper(IUserMapper.class);
// 5.使用代理對象執行方法
List<User> users = userMapper.findAll();
for (User user : users) {
System.out.println(user);
}
// 6.釋放資源
session.close();
inputStream.close();
}
(1)讀取配置文件
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");
#-> 關於讀取配置文件的傳統方式,(現在開發中一般都不用)
絕對路徑:E:\IdeaProjects\MyBatis\mybatis_01\src\main\resources\MyBatisConfg.xml
相對路徑:src\main\resources\MyBatisConfg.xml
#-> 開發中採取的方式是
第一個:使用類加載器,它只能讀取類路徑的配置文件
第二個:使用ServletContext對象的getRealPath()
(2)創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
創建SqlSessionFactory工廠mybatis使用了[構建者模式],builder就是構建者。
構建者模式-優點:把對象的創建細節隱藏,讓使用者直接調用方法即可拿到對象。
(3)使用工廠生產SqlSession對象
SqlSession session = factory.openSession();
生產SqlSession使用了[工廠模式]。
工廠模式-優點:解耦——降低類之間的依賴關係。
(4)使用sqlsession創建Dao接口(Mapper)的代理對象
IUserMapper userMapper = session.getMapper(IUserMapper.class);
創建Dao接口實現類使用了[代理模式]。
代理模式-優點:不修改源碼的基礎上對已有方法增強。
完整的MyBatisTest()
package com.yy.test;
import com.yy.dao.IUserMapper;
import com.yy.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest {
@Test
public void mybatisTest() throws IOException {
// 1.讀取配置文件
/* #-> 關於讀取配置文件的傳統方式,開發中一般都不用
* 絕對路徑:E:\IdeaProjects\MyBatis\mybatis_01\src\main\resources\MyBatisConfg.xml
* 相對路徑:src\main\resources\MyBatisConfg.xml
* #-> 開發中採取的方式是
* 第一個:使用類加載器,它只能讀取類路徑的配置文件
* 第二個:使用ServletContext對象的getRealPath()
* */
InputStream inputStream = Resources.getResourceAsStream("MyBatisConfg.xml");
// 2.創建SQLSessionFactory工廠
/* 創建工廠mybatis使用了[構建者模式],builder就是構建者。
* 構建者模式-優點:把對象的創建細節隱藏,讓使用者直接調用方法即可拿到對象 */
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
// 3.使用工廠生產SQLSession對象
/* 生產SqlSession使用了工廠模式,
* 工廠模式-優點:解耦——降低類之間的依賴關係 */
SqlSession session = factory.openSession();
// 4.使用sqlsession創建Dao接口(Mapper)的代理對象
/* 創建Dao接口實現類使用了[代理模式]
* 代理模式-優點:不修改源碼的基礎上對已有方法增強 */
IUserMapper userMapper = session.getMapper(IUserMapper.class);
// 5.使用代理對象執行方法
List<User> users = userMapper.findAll();
for (User user : users) {
System.out.println(user);
}
// 6.釋放資源
session.close();
inputStream.close();
}
}