准备数据源
因为MyBatis是一个持久层框架,所以我们在使用之前需要执行如下SQL语句备好数据源
# 删除mybatis_demo数据库
drop database if exists mybatis_demo;
# 创建mybatis_demo数据库
create database mybatis_demo;
# 使用mybatis_demo数据库
use mybatis_demo;
# 创建account表
create table user (
id int auto_increment primary key,
username varchar(20),
age int,
score int
);
# 新增数据
insert into user (id, username, age, score) values
(1,'peter', 18, 100), (2,'pedro', 24, 200),
(3,'jerry', 28, 500), (4,'mike', 12, 300),
(5,'tom', 27, 1000);
我们以查询User数据为例感受Mapper引入后和JDBC执行SQL有什么区别
MyBatis 提供了注解和XML两种方式来连接Java方法和SQL语句,首先学习注解方式使用Mapper
注解方式使用Mapper
代码实现
要想使用MyBatis首先需要导入MySQL驱动包、MyBatis框架基础包并且添加MyBatis核心配置文件
在mybatis-config.xml配置文件中添加上对应的mapper配置
<!-- mapper配置 -->
<mappers>
<mapper class="mapper.UserMapper"/>
</mappers>
新建mapper包,并在其下新建UserMapper.java类
User模块Mapper层:UserMapper.java
package mapper;
public interface UserMapper {
/**
* 通过用户id查询用户名称
*
* @param id 用户id
* @return 用户名称
*/
String selectUsernameById(Integer id);
}
有了方法定义后,我们再通过注解为该方法添加上对应的SQL语句
@Select("SELECT username FROM user WHERE id = #{id}")
User模块测试类:UserTest.java
@SuppressWarnings({"Duplicates"})
public class UserTest {
public static void main(String[] args) throws IOException, SQLException {
// 读取配置文件
InputStream configuration = Resources.getResourceAsStream("mybatis-config.xml");
// 得到 SqlSessionFactory 核心类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 开始一个 sql 会话
SqlSession session = sqlSessionFactory.openSession();
// 得到 mapper
UserMapper mapper = session.getMapper(UserMapper.class);
// 调用注解的SQL
String username = mapper.selectUsernameById(1);
System.out.println("username: " + username);
// 关闭会话
session.close();
}
}
测试结果
测试结果如下图所示:
表示mapper已经通过注解的方式搭建好了Java方法和SQL语句之间的桥梁,并且查询出了所需要的数据
XML方式使用Mapper
XML方式是更加强大的一种使用方式,虽然它没有注解那么方便,但是功能更强、更易维护,是 MyBatis 官方推荐的一种方式
代码实现
因为我们在mybatis-config.xml配置文件中已经添加过了mapper配置,所以说不需要在配置文件中添加额外的配置
在 UserMapper 接口中,我们再新增一个方法selectUserAgeById,该方法的作用是通过用户id查询用户年龄
User模块Mapper层:UserMapper.java
/**
* 通过用户id查询用户年龄
*
* @param id 用户id
* @return 用户年龄
*/
Integer selectUserAgeById(Integer id);
这次使用XML的方式添加SQL语句,首先在资源文件夹下新建mapper包,并在其下新建名为UserMapper的XML文件
User模块Mapper层配置文件:UserMapper.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">
<mapper namespace="mapper.UserMapper">
</mapper>
namespace命名空间是每一个mapper的唯一标识,也是XML文件和Java接口类连接的标识
有了XML文件后,我们使用标签给查询年龄的方法添加上对应的SQL语句
<select id="selectUserAgeById" resultType="java.lang.Integer">
SELECT age FROM user WHERE id = #{id}
</select>
select 标签中有两个必填属性:
- id:对应接口的方法名,即 selectUserAgeById,通过它 MyBatis 才能将二者对应起来
- resultType:对应SQL 语句的返回类型,与接口方法的返回值相同,有时会用到resultMap
测试类添加代码调用XML的SQL
User模块测试类:UserTest.java
// 调用XML的SQL
Integer age = mapper.selectUserAgeById(1);
System.out.println("age: " + age);
测试结果
测试结果如下图所示:
表示mapper已经通过XML的方式搭建好了Java方法和SQL语句之间的桥梁,并且查询出了所需要的数据
select-resultType
代码实现
在UserMapper.xml文件中,我们新增 selectUserById 标签,该 select 标签的作用是:通过id查询用户
<select id="selectUserById" resultType="">
SELECT * FROM user WHERE id = #{id}
</select>
上面的内容返回的是所有字段值,我们需要自己创建实体类来存储查出来的值
在entity包下创建User实体类:User.java
package entity;
public class User {
private Integer id;
private String username;
private Integer age;
private Integer score;
// 省略getter&setter方法
// 省略toString方法
}
把UserMapper.xml文件中selectUserById标签的返回类型改为上面创建的实体类
resultType="entity.User"
User模块Mapper层:UserMapper.java
/**
* 通过用户id查询用户信息
*
* @param id
* @return
*/
User selectUserById(Integer id);
User模块测试类:UserTest.java
// 调用通过用户id查询用户信息的方法
User user = mapper.selectUserById(1);
System.out.println(user);
测试结果
在上面这段select标签中,SQL语句返回的是一个复杂对象,即resultType上指定的 User
select-resultMap
MyBatis自动帮助我们映射数据库数据和Java对象,其实这是MyBatis在幕后帮我们创建了resultMap对象,我们也可手动定义
代码实现
User模块Mapper层配置文件:UserMapper.xml
<resultMap id="userMap" type="entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="score" column="score"/>
</resultMap>
上标签中有和两个子标签
其中标签是主键,其它字段均使用 result 标签来映射
标签有property和column两个属性
其中 property 是 Java 对象中的属性名称,column 是数据表与之对应的字段名称
把UserMapper.xml文件中selectUserById标签的返回类型改为上面创建的resultMap
resultMap="userMap"
测试结果
测试结果和修改前一样,说明MyBatis确实自动帮助我们做了数据映射,但是对于复杂的对象,比如字段名和属性名不同的情况下,我们就必须自定义resultMap了