Mapper 作为 Java 方法和 SQL 语句之间的桥梁,来更好地去使用 SQL
什么是Mapper
在MyBatis工程搭建 中我们主要讲解的是 MyBatis 如何连接数据库,具体执行 SQL 语句使用的是 JDBC 方式
但在实际应用中是不会选择 JDBC 来执行 SQL 的,MyBatis 提供了 Mapper 作为 Java 方法和 SQL 语句之间的桥梁,来帮助我们更好地去使用 SQL
准备数据源
创建
drop database if exists mybatis_demo;
create database mybatis_demo;
use mybatis_demo;
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);
在mybatis-config.xml配置文件中添加上对应的mapper配置
<!-- mapper配置 -->
<mappers>
<mapper class="mapper.UserMapper"/>
</mappers>
新建mapper包并新建UserMapper.java类
package mapper;
public interface UserMapper {
String selectUsernameById(Integer id);
}
添加SQL语句
@Select("SELECT username FROM user WHERE id = #{id}")
测试类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 = new SqlSessionFactoryBuilder().build(configuration);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
String username = mapper.selectUsernameById(1);
System.out.println("username: " + username);
session.close();
}
}
注解方式使用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语句
User模块测试类:UserTest.java
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
namespace命名空间是每一个mapper的唯一标识,也是XML文件和Java接口类连接的标识
有了XML文件后,我们使用<select></select>
标签给查询年龄的方法添加上对应的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);
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-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"