Mybatis随笔(一) 构建源码调试环境
2020-03-15 本文已影响0人
sunyelw
1. 源码下载
mybatis-3 github
mybatis 带中文注释版
我下的是最新的,中文注释的版本目前最高是 3.3.0-SNAPSHOT
git clone --depth 1 git@github.com:mybatis/mybatis-3.git
只下载最新一个提交,这样比较快。
然后处理pom.xml
-
true
tofalse
本地调试不需要额外依赖引用
<optional>true</optional>
-> :%s/true/false/g
<optional>false</optional>
<osgi.export>org.apache.ibatis.*;version=${project.version};-noimport:=true</osgi.export>
- 注释 pdf plugin 这个插件我配置的阿里镜像没有,你可以试试其他的
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pdf-plugin</artifactId>
</plugin>
-->
- 将目录处理一下,其他文件统统删掉,目前我们只需要看有用的源码文件就行

接下来在 src/test/java
下面加入测试代码

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>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<typeAliases>
<typeAlias alias="Account" type="com.hy.test.po.Account"/>
</typeAliases>
<!-- 定义数据库的信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- mysql 8.* -->
<!-- & 转义 & -->
<!--<property name="url" value="jdbc:mysql://localhost:3306/asia?serverTimezone=UTC&useSSL=false" />-->
<!-- mysql 5.1.44 -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/asia?useSSL=false" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 定义映射器, 重复注册会报错 -->
<mappers>
<!-- 指定注册 -->
<mapper resource="resources/mapper/AccountMapper.xml" />
<!-- 不支持批量注册 -->
<!--<package name="com.hy.test.dao" />-->
</mappers>
</configuration>
log4j.xml
log4j.rootLogger=DEBUG,stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = %5p %d %C:%m%n
MainTest.java
public class MainTest {
private static Logger log = Logger.getLogger(MainTest.class);
public static void main(String[] args){
String config = "resources/mybatis-config.xml";
// 测试代码
try (InputStream is = Resources.getResourceAsStream(config)) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = factory.openSession();
AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
int num = accountMapper.insertSelective(new Account("java", 10));
log.info("---- num: " + num + " -----------");
// sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 其他是三个 mybatis 的文件
*Mapper.java
*Mapper.xml
*.java
可以自己通过插件生成
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--允许移动生成的文件-->
<verbose>true</verbose>
<!--允许覆盖生成的文件-->
<overwrite>true</overwrite>
<configurationFile>src/main/resources/generatorSql.xml</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
可以参考 mybati-generator插件使用
经过这些步骤就可以把Mybatis
调试起来了,附上本文代码地址 sunyelw-MybatisStudy.git
坑
-
mysql
版本过高
最新的源码包中的MySQL
版本是8.*
, 需要配置时区
jdbc:mysql://localhost:3306/asia?serverTimezone=UTC&useSSL=false
当然可以调低到5.1.*
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
-
mappers
配置DAO
目录
有以下四种方式
- package
- name
- mapper
- resource
- url
- class
相信只要用过spring
或springboot
的开发都知道,Mybatis
的这种映射是可以批量配置的,这种方式就是配置一个*Mapper.java
接口包名和一个*Mapper.xml
目录
在纯 Mybatis
的项目中也可以这么玩, 但有三个条件(缺一不可, 如果你发现可以请留言, 拜谢)
-
*Mapper.java
和*Mapper.xml
同名 -
*Mapper.java
和*Mapper.xml
同一个目录下面 -
<mappers />
配置方式为<package name = "com...." />
但我不喜欢把*Mapper.java
和*Mapper.xml
放在同一个目录下面, 而<package name = "com...." />
不支持 *Mapper.xml
之类的语法, 所以在目前这种纯 Mybatis
的项目中, 是不支持批量的
因此, 对于每一个*Mapper.xml
只能以下三种种任选其一
- mapper
- resource
- url
- class
大体原因是,Mybatis
对 <mapper/>
标签的解析就是遍历, 是 package - name 方式就会先把目录下的 *Mapper.java
注册到配置中, 然后在同级目录找同名的 XML 文件进行注册, 而其他方式就是解析 *Mapper.xml
文件并将此文件关联的*Mapper.java
进行注册(通过 namespace
进行关联)
具体原因会写一篇文章从源码分析清楚