认真写文章,用心做分享。公众号:Java耕耘者 (整套Java资料)
![a6797c6eebcec3d136252a64cec21055.png](https://i-blog.csdnimg.cn/blog_migrate/0b5ae43045220bf7e1f667297b702325.jpeg)
开始安装
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
org.mybatis mybatis x.x.x
配置文件
XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)
示例(mybatisConfig.xml):
<?xml version="1.0" encoding="UTF-8" ?>
关于更多配置及用法,详见官方文档(翻译中文版的)XML映射配置文件
Mapper映射器
创建一个user表
CREATE TABLE `users` ( `id` int(3) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NULL, `birthday` datetime DEFAULT NULL, `sex` char(2) DEFAULT NULL, `address` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
创建一个实体类Users
public class Users { private Integer id; private String username; private Date birthday; private String sex; private String address; // 这里省略了Getter/Setter方法 @Override public String toString() { return super.toString() + "users = " + this.id + " | "+ this.username + " | " + this.birthday + " | " + this.sex + " | " + this.address; }}
写一个接口来描述方法的接口
最后SQL语句的执行也是通过调用这个方法,再通过代理执行。
package com.ncusoft.mybatisdemos.mapper;public interface UserMapper { /** * 根据用户id获取数据 * @param id 用户id * @return Users */ Users findById(Integer id);}
编写XML映射文件(UsersMapper.xml)
它能直接映射到刚刚定义的接口中的方法,并在XML中定义要执行的SQL语句(有个要注意的是,Mapper接口和XML映射文件的路径一定要一模一样,不然就无法映射了)。
更多详细用法见Mapper XML 文件
<?xml version="1.0" encoding="UTF-8" ?> select * from users where id = #{id}
使用
执行流程:
![408b90caf24c99466766968ade9e11c2.png](https://i-blog.csdnimg.cn/blog_migrate/f94897c02dd4d999d1a2e59c353795b0.jpeg)
下面是一个使用示例,把这个代码放在测试代码中执行。
// 从配置文件中获取字节流(通过类加载器的方法) 配置文件应该放在项目资源的根路径下InputStream in = Resources.getResourceAsStream("mybatisConfig.xml");// 创建一个工厂的构建器SqlSessionFactoryBuilder bulider = new SqlSessionFactoryBuilder();// 构建器通过传入字节流来构建一个SqlSessionFactory,SqlSessionFactory factory = bulider.build(in);// 通过工厂来创建一个SqlSession实例SqlSession session = factory.openSession();// 通过SqlSession对象来获取Mapper接口的代理对象,用来实现Mapper接口的操作UserMapper userMapper = session.getMapper(UserMapper.class);// 通过刚刚创建的代理对象来执行Mapper接口中的方法Users users = userMapper.findById(1);System.out.println(users);
来看一下执行的结果日志并分析一下:
// 打开一个数据库连接16:35:24.478 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection// 连接池中没有空闲连接,于是新建了一个连接16:35:25.197 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1832532108.// 由于factory.openSession()使用的是默认方法,所以autocommit的值将会被设置为false,也就是关闭了数据库的自动事务提交16:35:25.197 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]// 要执行的语句,这里使用了SQL预处理,用?做占位符16:35:25.204 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==> Preparing: select * from users where id = ? // 传入的参数, Integer类型的116:35:25.263 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==> Parameters: 1(Integer)// 查询到的结果总数为116:35:25.348 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - <== Total: 1// 打印查出来的结果com.ncusoft.mybatisdemos.entity.Users@5ba3f27ausers = 1 | 小熊 | Mon Dec 16 08:00:00 GMT+08:00 2019 | 男 | 江西九江// SQL操作完毕,将autocommit重置为true16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]// 关闭当前数据库连接16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]// 连接空闲,则放回连接池中16:35:25.383 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1832532108 to pool.