一、 MyBatis映射文件中的常用元素
(一)MyBatis映射文件中的常用元素
属性 | 说明 |
mapper | 映射文件的根元素,该元素只有一个namespace属性(命名空间)。 |
cache | 配置给定命名空间的缓存。 |
cache-ref | 从其他命名空间引用缓存配置。 |
resultMap | 描述数据库结果集和对象的对应关系。 |
sql | 可以重用的SQL块,也可以被其他语句使用。 |
insert | 用于映射插入语句。 |
delete | 用于映射删除语句。 |
update | 用于映射更新语句。 |
select | 用于映射查询语句。 |
(二)<mapper>元素中namespace属性作用
namespace属性有两个作用
1、用于区分不同的mapper,全局唯一。
2、 绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的全限定名查找到对应的mapper配置来执行SQL语句,因此namespace的命名必须跟接口同名。
(三)<mapper>元素如何区别不同的XML文件
在不同的映射文件中,<mapper>元素的子元素的id可以相同,MyBatis通过<mapper>元素的namespace属性值和子元素的id联合区分不同的Mapper.xml文件。接口中的方法与映射文件中SQL语句id应一一对应。
二、 <select>元素
(一) <select>元素的查询使用
<select>元素用来映射查询语句,它可以从数据库中查询数据并返回。使用<select>元素执行查询操作非常简单,示例代码如下:
<!—查询操作 -->
<select id="findUserById" parameterType="Integer"
resultType="com.mac.pojo.User">
select * from users where id = #{id}
</select>
(二)<select>元素的常用属性
属性 | 说明 |
id | 表示命名空间中<select>元素的唯一标识,通过该标识可以调用这条查询语句。 |
parameterType | 它是一个可选属性,用于指定SQL语句所需参数类的全限定名或者别名,其默认值是unset。 |
resultType | 用于指定执行这条SQL语句返回的全限定类名或别名。 |
resultMap | 表示外部resultMap的命名引用。resultMap和resultType不能同时使用。 |
flushCache | 用于指定是否需要MyBatis清空本地缓存和二级缓存。 |
useCache | 用于控制二级缓存的开启和关闭。 |
timeout | 用于设置超时时间,单位为秒。 |
fetchSize | 获取记录的总条数设定,默认值是unset。 |
statementType | 用于设置MyBatis预处理类。 |
resultSetType | 表示结果集的类型,它的默认值是unset。 |
三、 <insert>元素
(一)<insert>元素的插入使用
<insert>元素用于映射插入语句,在执行完<insert>元素中定义的SQL语句后,会返回插入记录的数量。使用< insert >元素执行插入操作非常简单,示例代码如下:
<!—插入操作 -->
<insert id="addUser" parameterType="com.mac.pojo.User">
insert into users(uid,uname,uage)values(#{uid},#{uname},#{uage})
</insert>
(二)数据库获取主键值的方式
很多时候,执行插入操作后,需要获取插入成功的数据生成的主键值,不同类型数据库获取主键值的方式不同,下面分别对支持主键自动增长的数据库获取主键值和不支持主键自动增长的数据库获取主键值的方式进行介绍。
a.使用支持主键自动增长的数据库获取主键值
如果使用的数据库支持主键自动增长(如MySQL和SQL Server),那么可以通过keyProperty属性指定POJO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true。
<insert id="addUser" parameterType="com.mac.pojo.User"
keyProperty="uid" useGeneratedKeys="true" >
insert into users(uid,uname,uage)values(#{uid},#{uname},#{uage})
</insert>
b.使用不支持主键自动增长的数据库获取主键值。
使用MyBatis提供的<selectKey>元素来自定义主键。
<selectKey
keyProperty="id” resultType="Integer"
order="BEFORE” statementType="PREPARED">
在上述<selectKey>元素的属性中,order属性可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先执行<selectKey>元素中的配置来设置主键,然后执行插入语句;如果设置为AFTER,那么它先执行插入语句,然后执行<selectKey>元素中的配置内容。
四、 <update>元素
(一)<update>元素的更新使用
<update>元素用于映射更新语句,它可以更新数据库中的数据。在执行完元素中定义的SQL语句后,会返回更新的记录数量。使用<update>元素执行更新操作非常简单,示例代码如下:
<!—更新操作 -->
<update id="updateUser" parameterType="com.mac.pojo.User">
update users set uname= #{uname},uage = #{uage} where uid = #{uid}
</update>
五、 <delete>元素
(一)<delete>元素的删除使用
<delete>元素用于映射删除语句,在执行完<delete>元素中的SQL语句之后,会返回删除的记录数量。使用<delete>元素执行删除操作非常简单,示例代码如下所示:
<!-- 删除操作 -->
<delete id="deleteUser" parameterType="Integer">
delete from users where uid=#{uid}
</delete>
<delete>元素中,除了上述示例代码中的几个属性外,还有其他一些可以配置的属性,如flushCache、timeout等。
(二)<delete>元素中的属性
属性 | 说明 |
id | 表示命名空间中<select>元素的唯一标识,通过该标识可以调用这条语句。 |
parameterType | 它是一个可选属性,用于指定SQL语句所需参数类的全限定名或者别名,其默认值是unset。 |
flushCache | 用于指定是否需要MyBatis清空本地缓存和二级缓存。 |
timeout | 用于设置超时时间,单位为秒。 |
statementType | 用于设置MyBatis预处理类。 |
六、 <sql>元素
(一)<sql>元素的作用
在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量。针对此问题,可以在映射文件中使用MyBatis所提供的<sql>元素,将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用。
<sql>元素的作用是定义可重用的SQL代码片段,它可以被包含在其他语句中。<sql>元素可以被静态地(在加载参数时)参数化,<sql>元素不同的属性值通过包含的对象发生变化。
-
实现一个根据客户id查询客户信息的SQL片段
<!--定义要查询的表 -->
<sql id=“someinclude">from <include refid="${include_target}" /></sql>
<!--定义查询列 --><sql id=“userColumns"> uid,uname,uage </sql>
<!--根据客户id查询客户信息 -->
<select id="findUserById" parameterType="Integer"
resultType="com.mac.pojo.User"> select
<include refid="userColumns"/>
<include refid="someinclude">
<property name="include_target" value="users" /></include>
where uid = #{uid}
</select>
七、 <resultMap>元素
(一)<resultMap>元素的作用
<resultMap>元素表示结果映射集,是MyBatis中最重要也是功能最强大的元素。<resultMap>元素主要作用是定义映射规则、更新级联以及定义类型转化器等。
数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis不会自动赋值,这时就需要使用<resultMap>元素进行结果集映射。
八、<resultMap>元素
接下来通过一个具体的案例演示使用<resultMap>元素进行结果集映射,具体步骤如下。
1、在名称为mybatis的数据库中,创建一个t_student表,并插入几条测试数据。
USE mybatis;
CREATE TABLE t_student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50),
sage INT
);
INSERT INTO t_student(sname,sage) VALUES('Lucy',25);
INSERT INTO t_student(sname,sage) VALUES('Lili',20);
INSERT INTO t_student(sname,sage) VALUES('Jim',20);
2、创建实体类Student,用于封装学生信息。在类中定义id、name和age属性,以及属性的getter/setter方法和toString()方法。
public class Student {
private int id; //主键id
private String name; //姓名
private int age; //年龄
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
3、创建映射文件StudentMapper.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="com.mac.mapper.StudentMapper">
<resultMap type="com.mac.pojo.Student" id="studentMap">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="age" column="sage"/>
</resultMap>
<select id="findAllStudent" resultMap="studentMap">
select * from t_student
</select>
</mapper>
4、核心配置文件mybatis-config.xml中,引入StudentMapper.xml,将StudentMapper.xml映射文件加载到程序中。在mybatis-config.xml中的<mapper>元素下添加如下代码。
<mapper resource="com/mac/mapper/StudentMapper.xml">
<mapper>
<?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>
<!-- 环境配置 -->
<!-- 加载类路径下的属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapping文件路径配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
<mapper resource="com/mac/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
5、创建测试类MyBatisTest,在测试类中,编写测试方法findAllStudentTest(),用于测试<resultMap>元素实现查询结果的映射。
package Test;
import com.mac.pojo.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class MyBatisTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
@Before
public void init() {
//定义读取文件名
String resources = "mybatis-config.xml";
//创建流
Reader reader = null;
try {
//读取mybatis-config.xml文件到reader对象中
reader = Resources.getResourceAsReader(resources);
//初始化mybatis,创建SqlSessionFactory类的对象
SqlSessionFactory sqlMapper = new
SqlSessionFactoryBuilder().build(reader);
//创建session对象
sqlSession = sqlMapper.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void findAllStudentTest() {
// SqlSession执行映射文件中定义的SQL,并返回映射结果
List<Student> list =
sqlSession.selectList("com.mac.mapper.StudentMapper." +
"findAllStudent");
for (Student student : list) {
System.out.println(student);
}
}
@After
public void destory() {
//提交事务
sqlSession.commit();
//关闭事务
sqlSession.close();
}
}
6、运行MyBatisTest测试类,控制台会输出结果。
需要注意的是,在测试类MyBatisTest中,每一个用@Test注解标注的方法称为测试方法,他们的调用顺序为@Before→@Test→@After。
九、使用工具类创建SqlSession对象
在上述案例中,由于每个方法执行时都需要读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象、创建SqlSession对象、释放资源,这导致了大量的重复代码。为了简化开发,我们可以将读取配置文件和释放资源的代码封装到一个工具类中,然后通过工具类创建SqlSession对象。