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
問題截圖如下
解決方案原文鏈接:
問題原因:
源碼項目使用了 license-maven-plugin 插件,會給源文件添加 license 聲明,聲明裏面有一個表達式 ${license.git.copyrightYears} 無法被替換, 從而報錯 因為源碼是從tag裏面下載的zip壓縮包,不含 .git 配置信息,所以插件拿不到正確的值,無法完成替換。
解決方案:
解決辦法就是在mybatis-parent源碼目錄下創建一個新的git倉庫即可:git init。
再次進行編輯編譯,Mybatis-parent編譯成功,編譯結果如下
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)
解決方案:
註釋掉mybatis-3.5.0工程pom文件中的pdf插件即可。
再次編譯執行編譯命令,編譯結果如下
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 }
最終的代碼結構如下:
7、執行測試代碼
執行測試代碼MybatisTest,出現數據庫驅動無法解析的問題,原因是沒有導入mysql的驅動包。
解決方案:在mybatis的源碼包中,添加mysql的驅動依賴。
1 <dependency>
2 <groupId>mysql</groupId>
3 <artifactId>mysql-connector-java</artifactId>
4 <version>5.1.46</version>
5 </dependency>
再次執行測試代碼MybatisTest,執行結果如下:
發現創建時間與更新時間並未獲取到,因為creaetDate與updateDate是駝峯模式,所以mybatis的配置中需要開啓駝峯模式。
1 <!--開啓駝峯模式-->
2 <settings>
3 <setting name="mapUnderscoreToCamelCase" value="true"/>
4 </settings>
再次執行測試代碼MybatisTest,執行結果如下:
到此,環境已準備完成,可以開啓mybatis源碼的學習之旅了。