==>>MyBatis中文網 1、第一個 mybastis程式 1.1 導入jar包 <mybatis.version>3.4.1</mybatis.version> <mysql.version>5.1.47</mysql.version> <!-- mybatis begin --> <depe ...
==>>MyBatis中文網
1、第一個 mybastis程式
1.1 導入jar包
<mybatis.version>3.4.1</mybatis.version>
<mysql.version>5.1.47</mysql.version>
<!-- mybatis begin -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis end -->
<!-- mysql begin -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- mysql end -->
1.2 jdcb.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8
username=root
password=root
1.3 mybatis-config.xml
數據配置信息可以直接在mybatis-config.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="jdbc.properties"></properties>
<typeAliases>
<!-- 給所有的實體類 批量取別名 -->
<package name="com.kgc.mybatis.bean"/>
</typeAliases>
<!-- 是指資料庫配置環境,可以直接寫值也可以引入外部配置文件 -->
<environments default="development">
<environment id="development">
<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>
<package name="com.kgc.mybatis.mapper"/>
</mappers>
</configuration>
1.4 xxxMapper.xml
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">
<!--
SQl語句映射文件:
namespace :名稱空間
1.單獨使用SqlSession的方法,可以隨意的定義,僅限於全限定名的方式,指定sql語句唯一標識字元串使用
2.再面向介面開發時,不可以隨便寫了,必須時某個介面的全類名(全路徑名:包名+類名)
-->
<!-- <mapper namespace="huayu"> 隨意定義命名空間 -->
<mapper namespace="com.kgc.mybatis.mapper.AnimeMapper"> <!-- 介面開發 -->
<!--
select標簽:查詢標簽
id屬性:select標簽的唯一標識,再面向開發時,對應的時namespace指定介面的某個方法名
resultType 屬性: 返回值類型
#{id} :獲取調用介面,獲取參數值
-->
<select id="selectAnime" parameterType="int" resultType="com.kgc.mybatis.bean.Anime">
select * from animes where id = #{id}
</select>
</mapper>
1.5 獲取 SqlSession 並執行SQL
1.5.1 獲取 SqlSessionFactory
- 指定mybatis的核心配置文件 “mybatis-config.xml”;
- 使用mybatis提供的Resources 工具類讀取核心配置文件,轉為輸入流對象;
- 使用SqlSessionFactoryBuilder對象的build方法,獲取到DefaultSqlSessionFactory;
//指定mybatis的核心配置文件路徑
String resource = "mybatis-config.xml";
//使用mybatis提供的Resources 工具類讀取核心配置文件,轉為輸入流對象
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder對象的build方法,基於上一步的輸入流對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//獲取到的是 DefaultSqlSessionFactory
System.out.println(sqlSessionFactory);
//org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@45c8e616
1.5.2 sqlSessionFactory 獲取 SqlSession 實例
SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法,拿到SqlSession 就可以執行;
session.selectOne(statement,parameter); 方法參數分析
參數 | 說明 |
---|---|
statement | 準備要執行的SQL語句的唯一標識符(mybatis可以識別,目的是可以通過此標識,查找到要執行的SQL語句) |
parameter | 準備要執行的SQL語句的參數值 |
//將實例化SqlSession放在 try()中,會自動關閉資源
try (SqlSession session = sqlSessionFactory.openSession()) {
//通過獲取的SqlSession的實例,執行查詢操作
//根據動漫編號,查詢動漫詳情
//<mapper namespace="huayu">單獨使用SqlSession的方法,namespace可以隨意的定義
//namespace.方法名,通過sql語句唯一標識字元串,找到執行SQL
Anime anime = (Anime) session.selectOne("huayu.selectAnime", 101);
System.out.println(anime);
}
1.5.3 面向介面開發
註意在resource下建立文件夾的時候需要 com/kcg/mybatis ,中間的分隔符要使用反斜杠,不能用點;
- 創建介面xxxMapper.java(註意路徑要與xxxMapper.xml的包名結構一致;)
- 通過session.getMapper(xxxMapper.class); 獲取介面代理類
- 使用介面代理類,調用介面方法
try (SqlSession session = sqlSessionFactory.openSession()) {
//面向介面開發
//推薦的方式
AnimeMapper animeMapper = session.getMapper(AnimeMapper.class);
System.out.println(animeMapper);
//代理對象 org.apache.ibatis.binding.MapperProxy@4cc0edeb
//直接就可以通過調用介面的方法,執行對象的SQl語句,並返回介面,不需要關心mybatis底層是調用那個方法
Anime anime = animeMapper.selectAnime(101);
System.out.println(anime);
}
try()中實例化對象報錯問題
https://www.cnblogs.com/xiaoqigui/p/16598100.html
指定maven版本就可以
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
2、配置
2.1 所有配置 和 順序
註意
:配置的順序不能錯,可以少寫,但是不能順序錯
- configuration(配置)
- properties(屬性)
- settings(設置)
- typeAliases(類型別名)
- typeHandlers(類型處理器)
- objectFactory(對象工廠)
- plugins(插件)
- environments(環境配置)
- environment(環境變數)
- transactionManager(事務管理器)
- dataSource(數據源)
- environment(環境變數)
- databaseIdProvider(資料庫廠商標識)
- mappers(映射器)
2.2 properties 屬性
1、properties 屬性:自定義核心屬性配置,也可以引入外部的屬性文件,比如jdbc.properties;
- resource 屬性:指定外部配置文件,優先順序高於property子標簽屬性配置,可以以單獨使用,如果二者同時存在,優先以外部為主
//resource屬性引入的外部配置文件,優先順序高於property子標簽屬性
<properties resource="jdbc.properties">
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="17585273765"/>-->
</properties>
2.3 settings 設置
一些設置的開啟;
下麵是簡單舉例,設置用很多,可以直接看官網;
<settings>
<!-- 開啟駝峰自動映射 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- mybatis自帶日誌 -->
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/> -->
<!-- LOG4J日誌 -->
<!-- <setting name="logImpl" value="LOG4J"/> -->
</settings>
2.4 typeAliases 類型別名
在SQL的xml文件中,resultType 可以使用 別名,不區分大小寫;
- 單個取別名,在SQL的xml文件中,resultType 可以使用 別名,不區分大小寫
- 批量取別名 :指定實體所在的父包路徑,自動指定包及子包中所有的實體批量取別名,預設的類名是首字母小寫,不區分大小寫;
- 建議,如果沒有安裝插件,從SQL映射xml文件中,無法自動定位到目標實體,不利於代碼的可讀性;
- mybatis對 Java 的基本數據類型 有 內建的類型別名;
<typeAliases>
<!-- 單個實體類設置別名 -->
<!-- <typeAlias type="com.kgc.mybatis.bean.Anime" alias="Anime"></typeAlias>-->
<!-- 對整個個實體包下的實體類設置別名 -->
<package name="com.kgc.mybatis.bean"/>
</typeAliases>
2.5 environments 環境配置
MyBatis 可以配置成適應多種環境;
不過要記住:儘管可以配置多個環境,但每個 SqlSessionFactory 實例只能選擇一種環境。
<environments default="development_test">
<!-- 開發環境 -->
<environment id="development_dev">
<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>
<!-- 測試環境 -->
<environment id="development_test">
......
</environment>
<!-- 生產環境 -->
<environment id="development_prod">
.......
</environment>
</environments>
2.5.1 transactionManager 事務管理
environment 標簽的子標簽 transactionManager;
- transactionManager:事務管理,使用的是jdbc的數據管理,以後框架整合會個Spring處理;
- MyBatis 中有兩種類型的事務管理器(也就是 type="[JDBC|MANAGED]");
JDBC – 這個配置直接使用了 JDBC 的提交和回滾設施,它依賴從數據源獲得的連接來管理事務作用域。 - MANAGED – 這個配置幾乎沒做什麼。它從不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連接。然而一些容器並不希望連接被關閉,因此需要將 closeConnection 屬性設置為 false 來阻止預設的關閉行為
- 如果使用Spring + mybatis :事務管理,交給Spring處理;
<transactionManager type="JDBC"/>
2.5.2 dataSource 數據源
- 數據源配置:有三種內建的數據源類型(也就是 type="[UNPOOLED|POOLED|JNDI]")
以後由Spring處理;
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
2.6 mappers 映射器
- 用於指定SQL文件的載入,作用:告訴MySql 到哪裡去找 映射文件;
2.6.1 單個SQL映射文件的載入
- resource
<mappers>
<mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
</mappers>
- 通過介面
<mappers>
<mapper class="com.kgc.mybatis.mapper.AnimeMapper"></mapper>
</mappers>
2.6.2 批量SQL映射文件載入
只需要指定mapper介面的所在包;
<mappers>
<package name="com.kgc.mybatis.mapper"/>
</mappers>
3、MyBatis 執行過程
3.1 代碼分析執行過程
//1、載入全局配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2、實例化 SqlSessionFactoryBuilder 構建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//3、解析 配置信息文件流,並返回 defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//4、實例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
System.out.println(sqlSession);
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c
//5、獲取介面的代理實現類
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
//調用介面的 代理類,執行方法
Anime anime = animeMapper.selectAnimeById(101);
System.out.println(anime);
//Anime(id=101, cid=1, name=鬥破蒼穹, author=土豆, actor=蕭炎, produce=玄機科技, createDate=Sun Aug 07 00:00:00 CST 2022)
3.2 源碼分析執行過程分析
3.2.1 Resources 載入全局配置文件
//載入全局配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
3.2.2 SqlSessionFactoryBuilder 構建器
//實例化 SqlSessionFactoryBuilder 構建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
3.2.3 sqlSessionFactoryBuilder.build(inputStream);
解析 配置信息文件流,並返回 defaultSessionFactory;
//解析 配置信息文件流,並返回 defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
手動實現,體驗實例化Configuration;
//手動解析配置文件流,實例化Configuration,體驗Mybatsi自動實例化Configuration;
//實例化 XMLConfigBuilder 參數:配置文件流,環境名字,Properties實例
//XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(inputStream, "development_dev", new Properties());
//解析配置文件流
//Configuration configuration = xmlConfigBuilder.parse();
`SqlSessionFactoryBuilder源碼分析:
sqlSessionFactoryBuilder.build(inputStream)方法,首先進入sqlSessionFactoryBuilder類,
調用當前類的SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)方法;
其中,又調用當前類的一個build方法,解析配置文件,並實例化DefaultSqlSessionFactory;
3.2.4 defaultSessionFactory.openSession();
//實例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c
DefaultSqlSessionFactory源碼分析:
openSession方法調用openSessionFromConnection;
openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) 方法:方法:
3.2.5 sqlSession.getMapper(xxx.class);
//獲取到介面的代理實現類
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
//org.apache.ibatis.binding.MapperProxy@5abca1e0
//也可以通過,解析配置文件流 創建配置對象,並通過配置對象直接getMapper,前提是獲得了sqlSession
//Configuration configuration = xmlConfigBuilder.parse();
//AnimeMapper animeMapper = configuration.getMapper(AnimeMapper.class, sqlSession);
3.2.6 animeMapper.selectAnimeById(101);
//調用介面代理類,執行方法
Anime anime = animeMapper.selectAnimeById(101);
//Anime(id=101, cid=1, name=鬥破蒼穹, author=土豆, actor=蕭炎, produce=玄機科技, createDate=Sun Aug 07 00:00:00 CST 2022)