Mybatis 源码(一):源码编译准备

  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

  问题截图如下

0

  解决方案原文链接:https://blog.csdn.net/u013267916/article/details/111870228

问题原因:

  源码项目使用了 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&amp;characterEncoding=utf-8&amp;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源码的学习之旅了。

 

posted @ 2023-03-01 20:10  无虑的小猪  阅读(889)  评论(0编辑  收藏  举报