mybatis源码解读(一)——初始化环境
本系列博客将对mybatis的源码进行解读,关于mybatis的使用教程,可以查看我前面写的博客——传送门。
为了便于后面的讲解,我们这里首先构造一个统一环境。也可以参考mybatis官网。
1、数据库建表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `user_id` int(32) NOT NULL COMMENT '用户id', `user_name` varchar(64) default NULL COMMENT '用户姓名', `user_age` int(3) default NULL COMMENT '用户年龄', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、项目的目录结构
相关配置的版本如下:
JDK:1.8 maven:3.3.9 mybatis:3.4.3
3、pom文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0modelVersion> 6 7 <groupId>com.ysgroupId> 8 <artifactId>MybatisDemoartifactId> 9 <version>1.0-SNAPSHOTversion> 10 <dependencies> 11 <dependency> 12 <groupId>org.mybatisgroupId> 13 <artifactId>mybatisartifactId> 14 <version>3.4.3version> 15 dependency> 16 <dependency> 17 <groupId>junitgroupId> 18 <artifactId>junitartifactId> 19 <version>4.12version> 20 <scope>testscope> 21 dependency> 22 23 <dependency> 24 <groupId>mysqlgroupId> 25 <artifactId>mysql-connector-javaartifactId> 26 <version>5.1.30version> 27 dependency> 28 29 dependencies> 30 31 <build> 32 <plugins> 33 <plugin> 34 <groupId>org.apache.maven.pluginsgroupId> 35 <artifactId>maven-compiler-pluginartifactId> 36 <configuration> 37 <source>1.8source> 38 <target>1.8target> 39 configuration> 40 plugin> 41 plugins> 42 43 <resources> 44 <resource> 45 <directory>src/main/javadirectory> 46 <includes> 47 <include>**/*.propertiesinclude> 48 <include>**/*.xmlinclude> 49 includes> 50 <filtering>falsefiltering> 51 resource> 52 <resource> 53 <directory>src/main/resourcesdirectory> 54 <includes> 55 <include>**/*.propertiesinclude> 56 <include>**/*.xmlinclude> 57 includes> 58 <filtering>falsefiltering> 59 resource> 60 resources> 61 build> 62 63 64 project>
分别在pom文件中添加mybatis包,mysql数据库连接包,Junit测试包。
注意:由于我使用的编译器是 IDEA,这里必须在pom文件中配置对resource资源目录下的xml 文件的访问,否则,IEDA会读取不到resource目录下的配置文件。
4、资源文件配置
①、jdbc.properties
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/mybatisTest?useUnicode=true&characterEncoding=utf-8 3 jdbc.username=root 4 jdbc.password=root
②、mybatsi-configuration.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 3 <configuration> 4 5 6 <properties resource="jdbc.properties"> 7 properties> 8 9 <environments default="development"> 10 11 <environment id="development"> 12 <transactionManager type="JDBC" /> 13 14 <dataSource type="POOLED"> 15 <property name="driver" value="${jdbc.driver}" /> 16 <property name="url" value="${jdbc.url}" /> 17 <property name="username" value="${jdbc.username}" /> 18 <property name="password" value="${jdbc.password}" /> 19 dataSource> 20 environment> 21 environments> 22 23 <mappers> 24 <mapper resource="com/ys/mapper/userMapper.xml"/> 25 mappers> 26 configuration>
5、pojo 类
前面我们创建了 user 表,这里创建其实体类。
1 package com.ys.po; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable{ 6 7 public User() { 8 super(); 9 } 10 public User(Integer id, String name, Integer age) { 11 super(); 12 this.id = id; 13 this.name = name; 14 this.age = age; 15 } 16 private Integer id; 17 private String name; 18 private Integer age; 19 public Integer getId() { 20 return id; 21 } 22 public void setId(Integer id) { 23 this.id = id; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public Integer getAge() { 32 return age; 33 } 34 public void setAge(Integer age) { 35 this.age = age; 36 } 37 @Override 38 public String toString() { 39 return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; 40 } 41 42 }
注意:根据阿里巴巴的最新编码规范,实体类中的属性不要写基本数据类型,必须使用包装类型。比如 int 类型的 id,我们应该写成其包装类 Integer 类型。
原因:比如显示成交总额涨跌情况,即正负 x %, x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。
6、mapper 文件
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"> 56 7 11 128 9 10 13 user_id, user_name, user_age 14 15 16 17 22 23 24 25 30 31 32 3334 insert into 35 user( 38 39 40) 36 value(#{id,jdbcType=INTEGER},#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER}) 37 41 update user set 42 user_name=#{name,jdbcType=VARCHAR} where user_id=#{id,jdbcType=INTEGER} 43 44 45 4647 delete from 48 user where user_id=#{id,jdbcType=INTEGER} 49 50
7、测试类
1 package com.ys.test; 2 3 import java.io.InputStream; 4 import java.util.List; 5 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.Test; 10 11 import com.ys.po.User; 12 13 public class MybatisTest { 14 private static final String NAME_SPACE = "com.ys.po.userMapper"; 15 private static SqlSessionFactory sqlSessionFactory; 16 17 static{ 18 InputStream inputStream = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml"); 19 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 20 } 21 /** 22 * 查询单个记录 23 */ 24 @Test 25 public void testSelectOne(){ 26 SqlSession session = sqlSessionFactory.openSession(); 27 User user = session.selectOne(NAME_SPACE+".selectUserById", 1); 28 System.out.println(user); 29 session.close(); 30 31 } 32 33 /** 34 * 查询多个记录 35 */ 36 @Test 37 public void testSelectList(){ 38 SqlSession session = sqlSessionFactory.openSession(); 39 ListlistUser = session.selectList(NAME_SPACE+".selectUserAll"); 40 if(listUser != null){ 41 System.out.println(listUser.size()); 42 } 43 session.close(); 44 } 45 46 /** 47 * 插入一条记录 48 */ 49 @Test 50 public void testInsert(){ 51 SqlSession session = sqlSessionFactory.openSession(); 52 User user = new User(2,"zhangsan",22); 53 session.insert(NAME_SPACE+".insertUser", user); 54 session.commit(); 55 session.close(); 56 } 57 58 /** 59 * 更新一条记录 60 */ 61 @Test 62 public void testUpdate(){ 63 SqlSession session = sqlSessionFactory.openSession(); 64 User user = new User(2,"lisi",22); 65 session.update(NAME_SPACE+".updateUserById", user); 66 session.commit(); 67 session.close(); 68 } 69 70 /** 71 * 删除一条记录 72 */ 73 @Test 74 public void testDelete(){ 75 SqlSession session = sqlSessionFactory.openSession(); 76 session.delete(NAME_SPACE+".deleteUserById", 2); 77 session.commit(); 78 session.close(); 79 } 80 81 }
8、测试结果
出现5条绿色的横杆,然后去数据库查看相应的结果。
9、总结
这个demo没什么好说的,不懂的看我前面的新手使用教程即可,这是最原始的mybatis开发方式。后面会通过这个例子深入源码分析。