如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency> 复制代码
XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)
示例(mybatisConfig.xml):
<!--文档类型声明,表明这是mybatis的配置文件--> <?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> <!--配置数据库的环境,包括事务管理器和数据源--> <environments default="development"> <environment id="development"> <!--事务管理器,type可选为JDBC/MANAGED --> <transactionManager type="JDBC"/> <!--type为数据源类型,可选为POOLED/UNPOOLED/JNDI--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--映射器,告诉mybatis去哪找映射文件,resource的值是XML映射文件的路径--> <mappers> <mapper resource="com/ncusoft/mybatisdemos/mapper/UserMapper.xml"/> </mappers> </configuration> 复制代码
关于更多配置及用法,详见官方文档(翻译中文版的) XML映射配置文件
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; 复制代码
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中定义要执行的SQL语句(有个要注意的是,Mapper接口和XML映射文件的路径一定要一模一样,不然就无法映射了)。
更多详细用法见 Mapper XML 文件
<!--文档类型声明,表明这是mybatis的映射文件--> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace是对应mapper接口的全限定名--> <mapper namespace="com.ncusoft.mybatisdemos.mapper.UsersMapper"> <!--id是对应接口中定义的方法名,resultType是返回的类型,parameterType是参数的类型,里面包含的内容就是要执行的SQL语句,这里用到了OGNL表达式--> <!--这里的#{id}其实是调用了Users类的getId()方法,具体见OGNL表达式--> <select id="findById" resultType="com.ncusoft.mybatisdemos.entity.Users" parameterType="Integer"> select * from users where id = #{id} </select> </mapper> 复制代码
执行流程:
下面是一个使用示例,把这个代码放在测试代码中执行。
// 从配置文件中获取字节流(通过类加载器的方法) 配置文件应该放在项目资源的根路径下 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类型的1 16:35:25.263 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==> Parameters: 1(Integer) // 查询到的结果总数为1 16: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重置为true 16: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. 复制代码