MyBatis入门实验(二)之接口注解
实验内容
在上一章中,实现了直接通过 sqlSession 执行指定的SQL语句,但如果SqlID拼写出错,或者是入参数据类型不正确都可能导致运行时异常,并不能在编译阶段检查出来。
本次实验将使用 mybatis 的接口类的方式执行SQL语句从数据库中取出数据,并封装成Java对象返回
这种方式更加安全、更加简单,也是现在主流使用的方式
操作步骤
一、安装
添加Maven依赖(本文使用版本为3.4.6)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
二、创建数据库及表结构
CREATE TABLE `user` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(32) NOT NULL COMMENT '用户名',
`password` varchar(64) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'admin', '123');
三、创建 Mybatis 配置文件
在 src/main/resources
目录下创建 mybatis-config.xml
文件,内容如下
与上一章不同的地方:加载 mappers
时,不仅需要加载XML文件,还需要加载新创建的接口类
<configuration>
<properties resource="jdbc.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载XML,同时加载接口类 -->
<mappers>
<mapper class="tutorial.mybatis.mapper.UserMapper"></mapper>
<mapper resource="mybatis/User.xml"></mapper>
</mappers>
</configuration>
在 src/main/resources
目录下创建 jdbc.properties
文件,内容如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tutorial_mybatis?characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=
四、创建实体类和映射文件
创建包 tutorial.mybatis.model
,并在该包下创建 User
类,内容如下
public class User {
private Long id;
private String username;
private String password;
// 省略 get / set 方法
}
在 src/main/resources
目录下创建目录 mybatis
,并在该目录下创建 User.xml
,内容如下
与上一章不同的地方:命名空间必须为接口类的路径
<?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">
<!-- 命名空间修改为接口类的路径,mybatis 会通过接口类自动寻址至相应的XML文件,获取SQL语句 -->
<mapper namespace="tutorial.mybatis.mapper.UserMapper">
<select id="getUserByID" parameterType="int" resultType="tutorial.mybatis.model.User">
select * from `user` where id = #{id}
</select>
</mapper>
五、创建接口类
创建包 tutorial.mybatis.mapper
,并在该包下创建接口 UserMapper
,内容如下
public interface UserMapper {
User getUserByID(Long id);
}
六、构建
准备工作就绪,开始最终章,创建启动类 MybatisConfig
,内容如下:
与上一章不同的地方:使用 session.getMapper(UserMapper.class)
的方式获取接口类,然后安全地执行接口类中的方法。
public class MybatisConfig {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserByID(1L);
if (user != null) {
String userInfo = "名字:" + user.getUsername()+", 密码:" + user.getPassword();
System.out.println(userInfo);
}
} finally {
session.close();
}
}
}
流程梳理
1、main函数启动,执行 static 代码块,使用 mybatis-config.xml
文件构建sqlSessionFactory,这个过程中会加载 xml 文件及接口类
2、创建 sqlSession 连接,使用 session.getMapper() 方法获取接口类实例
3、执行接口类方法,mybatis 会根据接口类路径去匹配 namespace,方法名匹配 sqlId,去XML文件中查找相应的SQL语句来执行