jdk8以上版本需要用mybatis3.5.3以後的版本,之前用Mybatis-3.5.12、Mybatis-parent-36,這個版本的Myabtis需要JDK11以上的版本,因為本地JDK版本為1.8,所以導致編譯一直報錯,降低了myabtis的版本即可編譯成功,本次源碼學習選擇mybatis-3.5.0。

1、源碼下載

1、下載Mybatis源碼

  下載地址:https://github.com/mybatis/mybatis-3。下載zip壓縮包,完成後解壓,查看pom文件中的相關依賴

1 <parent>
2     <groupId>org.mybatis</groupId>
3     <artifactId>mybatis-parent</artifactId>
4     <version>31</version>
5     <relativePath />
6 </parent>

mybatis源碼依賴 mybatis-parent 所以編譯前要先下載mybatis-parent。

2、下載Mybatis-parent源碼

  下載myabtis對應的依賴版本,為避免版本衝突,依賴版本最好一致,否則可能會出現‘cannot resolve plugins xxx’某些類無法被識別到的問題。

  下載地址:https://github.com/mybatis/parent。下載zip壓縮包,下載完成後解壓。

2、源碼編譯

1、Mybatis-parent編譯

1、執行編譯命令

  切換到Mybatis-parent的解壓目錄,執行如下命令進行編譯

mvn clean install

首次編譯出現如下問題:

java.lang.RuntimeException: Could not compute the year of the last git commit for file
D:\Source\mybatis_source\mybatis-parent-31\src\site\site.xml

問題截圖如下

rewriteBatchedStatements 源碼位置 mybatisplus_apache

  解決方案原文鏈接:

問題原因:

  源碼項目使用了 license-maven-plugin 插件,會給源文件添加 license 聲明,聲明裏面有一個表達式 ${license.git.copyrightYears} 無法被替換, 從而報錯 因為源碼是從tag裏面下載的zip壓縮包,不含 .git 配置信息,所以插件拿不到正確的值,無法完成替換。

解決方案:

  解決辦法就是在mybatis-parent源碼目錄下創建一個新的git倉庫即可:git init。

再次進行編輯編譯,Mybatis-parent編譯成功,編譯結果如下   

  

rewriteBatchedStatements 源碼位置 mybatisplus_User_02

2、Mybatis編譯

1、創建git倉庫

git init

2、執行編譯命令

mvn clean install

3、編譯問題

Error during document generation: Error parsing D:\Source\mybatis_source\mybatis-3.5.0\target\pdf\site.tmp\xdoc\getting-started.xml: 
Error parsing the model: only whitespace content allowed before start tag and not \ufeff (position: COMMENT seen ...rning permissions and\n       
limitations under the License.\n\n-->\n\ufeff... @18:2)

rewriteBatchedStatements 源碼位置 mybatisplus_xml_03

解決方案:
  註釋掉mybatis-3.5.0工程pom文件中的pdf插件即可。

 

rewriteBatchedStatements 源碼位置 mybatisplus_xml_04

 再次編譯執行編譯命令,編譯結果如下

 

rewriteBatchedStatements 源碼位置 mybatisplus_User_05

3、debug前的代碼準備

1、表及數據準備

  創建user表

1 DROP TABLE IF EXISTS `user`;
2 CREATE TABLE `user` (
3   `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
4   `name` varchar(32) CHARACTER SET latin1 DEFAULT NULL COMMENT '名稱',
5   `create_date` datetime DEFAULT NULL COMMENT '創建時間',
6   `update_date` datetime DEFAULT NULL COMMENT '更新時間',
7   PRIMARY KEY (`id`)
8 ) ENGINE=INNODB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8;

初始化數據

1 insert into `user` values('101', 'zs', now(), now());
2 insert into `user` values('102', 'ls', now(), now());
3 insert into `user` values('103', 'ww', now(), now());
4 commit;

2、測試代碼編寫

1、新建debug包

  在目錄org.apache.ibatis下新建debug包,用於編寫做debug代碼的包。

2、新建User實體類

1 package org.apache.ibatis.debug.entity;
 2 
 3 import java.util.Date;
 4 
 5 public class User {
 6     private Integer id;
 7     private String name;
 8     private Date createDate;
 9     private Date updateDate;
10     public Integer getId() {
11         return id;
12     }
13     public void setId(Integer id) {
14         this.id = id;
15     }
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22     public Date getCreateDate() {
23         return createDate;
24     }
25     public void setCreateDate(Date createDate) {
26         this.createDate = createDate;
27     }
28     public Date getUpdateDate() {
29         return updateDate;
30     }
31     public void setUpdateDate(Date updateDate) {
32         this.updateDate = updateDate;
33     }
34     @Override
35     public String toString() {
36         return "User{" +
37                 "id=" + id +
38                 ", name='" + name + '\'' +
39                 ", createDate=" + createDate +
40                 ", updateDate=" + updateDate +
41                 '}';
42     }
43 }

3、新建UserMapper接口

1 package org.apache.ibatis.debug.mapper;
 2 
 3 import org.apache.ibatis.debug.entity.User;
 4 
 5 public interface UserMapper {
 6     // 根據id查詢用户信息
 7     User selectUserById(String id);
 8 
 9     // 新增用户
10     int insertUserInfo(User user);
11 
12     // 更新用户
13     int updateUserInfo(User user);
14 
15     // 刪除用户
16     int deleteUserInfo(User user);
17 }

4、新建UserMapper.xml

  新建資源跟根路徑resources,新建mapper包,在mapper包下新建UserMapper.xml文件。

1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="org.apache.ibatis.debug.mapper.UserMapper">
 6     <select id="selectUserById" resultType="org.apache.ibatis.debug.entity.User">
 7         select * from user where id = #{id}
 8     </select>
 9 
10     <insert id="insertUserInfo" parameterType="org.apache.ibatis.debug.entity.User">
11         insert into user(id, name, create_date, update_date) values (#{id}, #{name}, now(), now())
12     </insert>
13 
14     <update id="updateUserInfo" parameterType="org.apache.ibatis.debug.entity.User">
15         update user set name = #{name} where id = #{id}
16     </update>
17 
18     <delete id="deleteUserInfo" parameterType="org.apache.ibatis.debug.entity.User">
19         delete from user where id = #{id}
20     </delete>
21 </mapper>

5、新建mybatis的配置文件

1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!--數據庫屬性-->
 7     <properties>
 8         <property name="driver" value="com.mysql.jdbc.Driver"/>
 9         <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8"/>
10         <property name="username" value="root"/>
11         <property name="password" value="root"/>
12     </properties>
13     <!--開啓駝峯模式-->
14     <settings>
15         <setting name="mapUnderscoreToCamelCase" value="true"/>
16     </settings>
17     <!--數據庫連接環境設置-->
18     <environments default="development">
19         <environment id="development">
20             <transactionManager type="JDBC"/>
21             <dataSource type="POOLED">
22                 <property name="driver" value="${driver}"/>
23                 <property name="url" value="${url}"/>
24                 <property name="username" value="${username}"/>
25                 <property name="password" value="${password}"/>
26             </dataSource>
27         </environment>
28     </environments>
29     <!--加載xml文件配置-->
30     <mappers>
31         <mapper resource="mapper/UserMapper.xml"/>
32     </mappers>
33 </configuration>

6、測試源碼 - MybatisTest

1 package org.apache.ibatis.debug;
 2 
 3 import org.apache.ibatis.debug.entity.User;
 4 import org.apache.ibatis.debug.mapper.UserMapper;
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.util.Date;
13 
14 public class MybatisTest {
15 
16     public static void main(String[] args) throws IOException {
17         String resource = "mybatis-config.xml";
18         // 加載mybatis的配置文件
19         InputStream inputStream = Resources.getResourceAsStream(resource);
20         // 獲取sqlSessionFactory
21         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
22         // 獲取sqlSession
23         SqlSession sqlSession = sqlSessionFactory.openSession();
24 
25         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
26         // 查詢用户
27 //        User user02 = mapper.selectUserById("101");
28 //        System.out.println("user02: " + user02);
29 
30         // 新增用户
31 //        User user = new User();
32 //        user.setId(105);
33 //        user.setName("insert");
34 //        user.setCreateDate(new Date());
35 //        user.setUpdateDate(new Date());
36 //        int addUser = mapper.insertUserInfo(user);
37 //        System.out.println("新增用户結果: " + addUser);
38 
39         // 更新用户
40 //        User user03 = new User();
41 //        user03.setId(105);
42 //        user03.setName("insert-U");
43 //        user03.setUpdateDate(new Date());
44 //        int updateUser = mapper.updateUserInfo(user03);
45 //        System.out.println("更新用户結果:" + updateUser);
46 
47         // 刪除用户
48         User user04 = new User();
49         user04.setId(105);
50         int deleteUser = mapper.deleteUserInfo(user04);
51         System.out.println("刪除用户結果:" + deleteUser);
52     }
53 }

最終的代碼結構如下:

 

rewriteBatchedStatements 源碼位置 mybatisplus_User_06

 

rewriteBatchedStatements 源碼位置 mybatisplus_apache_07

7、執行測試代碼

  執行測試代碼MybatisTest,出現數據庫驅動無法解析的問題,原因是沒有導入mysql的驅動包。

 

rewriteBatchedStatements 源碼位置 mybatisplus_apache_08

  解決方案:在mybatis的源碼包中,添加mysql的驅動依賴。

 

1 <dependency>
2   <groupId>mysql</groupId>
3   <artifactId>mysql-connector-java</artifactId>
4   <version>5.1.46</version>
5 </dependency>

再次執行測試代碼MybatisTest,執行結果如下:

 

rewriteBatchedStatements 源碼位置 mybatisplus_apache_09

發現創建時間與更新時間並未獲取到,因為creaetDate與updateDate是駝峯模式,所以mybatis的配置中需要開啓駝峯模式。

1 <!--開啓駝峯模式-->
2 <settings>
3     <setting name="mapUnderscoreToCamelCase" value="true"/>
4 </settings>

再次執行測試代碼MybatisTest,執行結果如下:

rewriteBatchedStatements 源碼位置 mybatisplus_apache_10

到此,環境已準備完成,可以開啓mybatis源碼的學習之旅了。