MyBatis Config(三)映射文件mappers标签
MyBatis Config(一)如何配置数据库驱动
MyBatis Config(二)<settings>标签
上篇文章我们介绍了<settings>标签,这篇文章主要讲<mappers>标签
在配置文件中,<mappers>元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下所示。
1.使用类路径引入
<mappers>
<mapper resource="com/xxx/mapper/UserMapper.xml"/>
</mappers>
2.使用本地文件路径引入
<mappers>
<mapper url="file:///D:/com/xxx/mapper/UserMapper.xml"/>
</mappers>
3.使用接口类引入
<mappers>
<mapper class="com.xxx.mapper.UserMapper"/>
</mappers>
4.使用包名引入
<mappers>
<package name="com.xxx.mapper"/>
</mappers>
上述4种引入方式非常简单,读者可以根据实际项目需要选取使用。
映射文件应用示例:
<?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.porperties" />
<typeAliases>
<typeAlias alias="customer"
type="com.xxx.mybatis.Customer" />
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<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>
//映射文件配置
<mappers>
<mapper resource="com/xxx/mapper/CustomerMapper.xml" />
</mappers>
</configuration>
映射文件
映射文件是MyBatis 框架中十分重要的文件,可以说,MyBatis框架的强大之处就体现在映射文件 编写上。
主要元素
在映射文件中,<mapper> 元素是映射文件的根元素,其他元素都是子元素。这些元素及起作用如下:

<select> 元素
使用select元素进行查询操作非常简单,如下:
<select id="findCustomerById" parameterType="Integer"
resultType="com.xxx.mybatis.Customer">
select * from t_customer where id = #{id}
</select>
***************************************************************
@Test
public void findCustomerByIdTest() {
String source = "mybatis-config.xml";
try {
InputStream ip = Resources.getResourceAsStream(source);
SqlSessionFactory sqlFactory = new SqlSessionFactoryBuilder().build(ip);
SqlSession openSession = sqlFactory.openSession();
Customer coustomer = openSession.selectOne("com.xxx.mapper.CustomerMapper.findCustomerById", 1);
System.out.println(coustomer.toString());
openSession.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

<insert>标签
<insert>元素的配置示例如下。
<insert
id="addCustomer"
parameterType="com.xxx.po.Customer"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
从上述示例代码中可以看出,<insert>元素的属性与<select>元素的属性大部分相同,但还包含了3个特有属性

<update> 标签和<delect>标签比较简单,就不一一细说了。
<sql>标签
在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用呢?答案是肯定的,我们可以在映射文件中使用MyBatis所提供的<sql>元素来解决上述问题。
<sql>元素的作用就是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。例如,定义一个包含id、username、jobs和phone字段的代码片段如下。
<sql id="customerColumns">id,username,jobs,phone</sql>
使用:
<select id="findCustomerById" parameterType="Integer"
resultType="com.xxx.mybatis.Customer">
select <include refid="customerColumns"> from t_customer where id = #{id}
</select>
举个🌰
<! --定义表的前缀名 -->
<sql id="tablename">
${prefix}customer</sql>
<! --定义要查询的表 -->
<sql id="someinclude">
from
<include refid="${include_target}" />
</sql>
<! --定义查询列 -->
<sql id="customerColumns">
id, username, jobs, phone
</sql>
<! --根据id查询客户信息 -->
<select id="findCustomerById" parameterType="Integer" resultType="com.xxx.po.Customer">
select
<include refid="customerColumns"/>
<include refid="someinclude">
<property name="prefix" value="t_" />
<property name="include_target" value="tablename" />
</include>
where id = #{id}
</select>
输出结果:

<resultMap>
<resultMap>元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及定义类型转化器等。
<resultMap>元素中包含了一些子元素,它的元素结构如下所示。
<! --resultMap的元素结构 -->
<resultMap type="" id="">
<constructor>
<! -- 类在实例化时,用来注入结果到构造方法中-->
<idArg/> <! -- ID参数;标记结果作为ID-->
<arg/>
<! -- 注入到构造方法的一个普通结果-->
</constructor>
<id/>
<! -- 用于表示哪个列是主键-->
<result/>
<! -- 注入到字段或JavaBean属性的普通结果-->
<association property="" />
<! -- 用于一对一关联 -->
<collection property="" />
<! -- 用于一对多关联 -->
<discriminator javaType="">
<! -- 使用结果值来决定使用哪个结果映射-->
<case value="" />
<! -- 基于某些值的结果映射 -->
</discriminator>
</resultMap>
在默认情况下,MyBatis程序在运行时会自动地将查询到的数据与需要返回的对象的属性进行匹配赋值(需要表中的列名与对象的属性名称完全一致)。然而实际开发时,数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis是不会自动赋值的。此时,就可以使用<resultMap>元素进行处理。
举个🌰
1.创建t_user表,插入几条数据
mysql> use mybatis;
mysql> create table t_user (t_id int primary key auto_increment,t_name varchar(50),t_age int);
mysql> insert into t_user (t_name,t_age) values ("liupei",26);
mysql> insert into t_user (t_name,t_age) values ("cxk",27);
mysql> insert into t_user (t_name,t_age) values ("wyf",28);
mysql>
**2 常见User持久数据对象
public class User {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
3创建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="com.liupei.mapper.UserMapper">
<resultMap type="user" id="userResult">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="age" column="t_age"/>
</resultMap>
<select id="findAllUser"
resultMap="userResult">
select * from t_user
</select>
</mapper>
4将UserMapper配置到mybatis-config.xml中
<?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.porperties" />
<typeAliases>
<typeAlias alias="customer"
type="com.liupei.mybatis.Customer" />
<typeAlias alias="user"
type="com.liupei.mybatis.User" />
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<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>
<mappers>
<mapper resource="com/liupei/mapper/CustomerMapper.xml" />
//添加UserMapper
<mapper resource="com/liupei/mapper/UserMapper.xml" />
</mappers>
</configuration>
5.写测试方法
@Test
public void findAllUser() {
SqlSession openSession = null;
openSession=MyBatisUtils.getSqlSession();
if(null!=openSession) {
User.query(openSession);
}
}
----------------------------------------------
public class User{
....
public static void query(SqlSession openSession) {
List<User> userList =openSession
.selectList("com.itheima.mapper.UserMapper.findAllUser");
for(User user:userList) {
System.out.println(user.toString());
}
}
....
}
