本章讨论MyBatis的映射XML文件及增删改查等sql映射语句。
直接使用JDBC访问数据库,需要在程序中写sql语句,然后执行,如果是查询语句,必须遍历查询结果,把结果读取到对象中。
MyBatis的SQL语句写在映射文件中,不同的是,映射文件中的sql语句有很多强大功能,如动态sql可根据不同条件拼接sql语句,结果集映射功能只需配置好参数,MyBatis会直接把结果集读取到对象中,无需手动读取。MyBatis的映射文件是XML格式,实践中通常一个Java model类对应一个映射文件,如User类的对应映射文件是UserMapper.xml。
在MYBATIS教程 – 环境搭建中,我们创建好了数据库,数据库中包含了一个用户表。
CREATE DATABASE IF NOT EXISTS `qikegu_mybatis`
USE `qikegu_mybatis`;
CREATE TABLE IF NOT EXISTS `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='用户表';
INSERT INTO `user` (`id`, `name`) VALUES
(1, 'user1'),
(2, 'user2'),
(3, 'user3'),
(4, 'user4'),
(5, 'user5');
创建一个对应的Java类:User.java
public class User {
private long id;
private String name;
public User(String name) {
super();
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
映射语句
映射语句是MyBatis映射文件中映射到sql的各种语句,如select、insert、update和delete等语句。
映射语句的特点:
- 所有的语句都有唯一的id。要执行这些语句,只需要将对应id传递给Java方法。(后面内容中会详细讨论)。
- 映射文件避免了Java代码中重复编写SQL语句。与JDBC相比,使用MyBatis中的映射文件减少了95%的代码量。
- 所有映射语句都包含在
<mapper>
标签下,该标签有“namespace”属性。如下所示:
<mapper namespace = "User">
// 映射语句与结果映射
<mapper>
Insert
MyBatis中,要将值插入表,必须配置insert映射语句。insert映射语句有各种参数,通常主要使用id
及parameterType
。
id
是唯一标识符,用于标识insert语句。parameterType
表示传递给映射语句的参数类名或别名。
insert映射语句示例:
<insert id = "insert" parameterType = "User">
INSERT INTO user (NAME)
VALUES (#{name});
</insert>
上面的传入的参数类型是User (class)。
在映射文件中配置好insert映射语句后,在Java代码中就可以根据映射语句的id执行该语句。如下所示:
// 假设 session 是 SqlSession 实例
session.insert("User.insert", user);
可以思考一下,比较使用MyBatis映射语句与Java代码中直接写sql语句的异同。
Update
Update映射语句用于更新数据库记录。
示例:
<update id = "update" parameterType = "User">
UPDATE user SET NAME = #{name} WHERE ID = #{id};
</update>
在Java代码中就可以根据映射语句的id执行该语句。如下所示:
// 假设 session 是 SqlSession 实例
session.update("User.update", user);
Delete
Delete映射语句用于删除现有记录。
示例:
<delete id = "deleteById" parameterType = "long">
DELETE from User WHERE ID = #{id};
</delete>
在Java代码中就可以根据映射语句的id执行该语句。如下所示:
// 假设 session 是 SqlSession 实例
session.delete("User.deleteById", 3);
Select
Select映射语句用于查询数据。
<select id = "getAll" resultMap = "result">
SELECT * FROM User;
</select>
在Java代码中就可以根据映射语句的id执行该语句,该方法以列表形式返回结果,如下所示:
// 假设 session 是 SqlSession 实例
List<User> list = session.selectList("User.getAll");
resultMaps
resultMaps即结果映射,是MyBatis中最重要、最强大的标签,其作用是把select sql执行结果映射到Java对象。
下面是结果映射的例子,例子中将select查询的结果映射到User类
<resultMap id = "result" type = "User">
<result property = "id" column = "id"/>
<result property = "name" column = "name"/>
</resultMap>
<select id = "getAll" resultMap = "result">
SELECT * FROM User;
</select>
<select id = "getById" parameterType = "long" resultMap = "result">
SELECT * FROM User WHERE ID = #{id};
</select>
如果property
与column
相同,column
可省略。