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
问题截图如下
解决方案原文链接: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&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源码的学习之旅了。