一、mybatis配置文件概述
mybatis的核心配置文件配置了很多影响mybatis行为的信息,这些信息通常只会配置在一个文件中,并且不会轻易改动。但是,与spring框架整合后,mybatis的核心配置文件信息将配置到spring的配置文件中。不过也需要了解mybatis的核心配置文件中的元素。
模板很多,借助网上大佬的模板总结
<?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 />
<!-- 设置 -->
<settings>
<setting name="" value=""/>
</settings>
<!-- 类型的别名 -->
<typeAliases />
<!-- 类型处理器 -->
<typeHandlers />
<!-- 对象工厂 -->
<objectFactory type="" />
<!-- 插件 -->
<plugins>
<plugin interceptor=""></plugin>
</plugins>
<!-- 配置环境 -->
<environments default="">
<!-- 环境变量 -->
<environment id="">
<!-- 事务管理器 -->
<transactionManager type=""/>
<!-- 数据源 -->
<dataSource type=""/>
</environment>
</environments>
<!-- 数据库厂商标识 -->
<databaseIdProvider type=""/>
<!-- 映射器,告诉MyBatis到哪里去找映射文件 -->
<mappers>
<mapper resource="../../xxMapper.xml"/>
</mappers>
</configuration>
配置文件中元素的配置顺序不能颠倒,一旦颠倒,在 MyBatis 启动阶段将发生异常
二、映射器概述
映射器是mybatis最复杂且最重要的组件,由一个接口加上XML文件(SQL映射文件)组成。mybatis的映射器也可以使用注解完成,但注解复杂SQL不适用、可读性较差等缺点在实际应用并不广泛。
SQL映射文件常用配置元素
元素名称 | 描述 | 备注 |
---|---|---|
select | 查询语句,最常用、最复杂的元素之一 | 可以自定义参数,返回结果集 |
insert | 插入语句 | 执行后返回一个整数,代表插入的行数 |
update | 更新语句 | 执行后返回一个整数,代表更新的行数 |
delete | 删除语句 | 执行后返回一个整数,代表删除的行数 |
sql | 定义一部分SQL,在多个位置被引用 | 例如一张表,列名一次定义,可以在多个SQL语句中使用 |
resultMap | 用来描述从数据库结果集来加载对象,是最复杂、最强大元素 | 提供映射规则 |
2.1 <select>元素-----select
<select>元素的常用属性
属性名称 | 描述 |
---|---|
id | 它和Mapper的命名空间组合起来使用,是唯一标识符,供MyBatis调用 |
parameterType | 表示传入SQL语句的参数类型的全限定名或别名。它是一个可选属性,MyBatis能推断出具体传入语句的参数 |
resultType | SQL语句执行后的返回类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回是可使用resultType或resultType之一。 |
resultMap | 它是映射集的引用,与<resultMap>元素一起使用,返回时可以使用resultType或resultMap之一 |
flushCache | 用于设置在调用SQL语句后是否要求mybatis清空之前查询的本地缓存和二级缓存,默认值为false |
useCache | 启动二级缓存的开关,默认为true,表示将查询结果存入二级缓存 |
timeout | 用于设置超时参数,单位是秒(s),超时将抛出异常 |
fetchSize | 获取记录的总条数设定 |
statementType | 告诉mybatis使用哪个jdbc的statement工作 |
resultSetType | 针对jdbc的ResultSet接口 |
2.1.1 使用Map接口传递多个参数
在开发中,查询SQL语句经常需要传递多个参数。在mybatis中运行Map接口通过键值对传递多个参数。
在mybatis(一)MyBatis与Spring的整合 的基础上进行添加
- 首先在UserMapper.xml映射文件中添加多条件查询语句
<!--多条件查询-->
<select id="selectByMap" parameterType="map" resultType="User">
select * from user where id = #{id} and name = #{name}
</select>
- 在接口UserDao中添加接口
/**
* @param param
* @return
* 多条件查询
*/
public List<User> selectByMap(Map<String,Override> param);
- 在UserController的test方法中添加
//多条件查询
Map<String,Object> param = new HashMap<>();
param.put("id", 1);
param.put("name", "张三");
userDao.selectByMap(param);
- 在TsetController中进行测试
可以看出多条件查询成功。
还有一种传递多个参数的方法是:
使用JavaBean传递多个参数
修改UserMapper.xml映射文件 parameterType = “User” ,在UserController的test方法中使用User的set方法进行设定查询条件,然后进行传参即可。
<!--多条件查询JavaBean,实际可以重新创个parameterType的类-->
<select id="selectByUser" parameterType="User" resultType="User">
select * from user where id = #{id} and name = #{name}
</select>
// User为新建的javabean
// JavaBean传递参数
User param = new User();
param.setId(1);
param.setName("张三");
userDao.selectByUser(param);
2.2 <insert>元素-----insert
<insert>元素用于映射插入语句,mybatis执行完一条插入语句将返回一个整数表示其影响的行数。它的属性与 <select>元素的属性大部分相同,但也有几个特有属性:
- keyProperty:该属性的作用是将插入或更新操作时的返回值赋给PO类的某个属性,通常会设置为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。
- keyColumn:该主键用于设置第几列是主键,当主键列表不是表中的第1列时需要设置。如果是联合主键,可以将多个值用逗号隔开。
- useGeneratedKeys:该属性将使mybatis使用jdbc的getGeneratedKeys()方法获取由数据库内部产生的主键,例如MySQL、SQL Server 等自动递增的字段,其默认值为false。
2.2.1 主键(自动递增)回填
MySQL、SQL Server 等数据库的表格可以采用自动递增的字段作为主键,有时可能需要使用这个刚产生的主键,用于关联其他业务。
- 首先在UserMapper.xml映射文件中修改<insert>元素中的内容
<!--添加一个用户,开启获取主键值,并将插入后自动递增的主键值返回给id属性-->
<insert id="insertOneUser" parameterType="User" keyProperty="id" useGeneratedKeys="true">
insert into user values(null,#{name},#{sex})
</insert>
- 在UserController的test方法中修改
//增加一个用户并返回主键值
User addUser = new User();
addUser.setName("老王");
addUser.setSex("女");
userDao.insertOneUser(addUser);
System.out.println("插入后的主键值为:" + addUser.getId());
- 结果显示
2.2.2 自定义主键
在实际项目中,有的数据库不支持自动递增或者没有设置自动递增,可以使用mybatis的<selectKey>元素来自定义生成主键。
<!--自定义主键-->
<insert id="" parameterType="">
<!--先使用selectKey元素定义主键,然后再定义SQL语句-->
<selectKey keyProperty="" resultType="" order="">
select decode(max(id),null,1,max(id)+1) as newId from user
</selectKey>
insert into user values (null,#{name},#{sex})
</insert>
- keyProperty元素指定哪个字段为主键,order可以取值before 或者after 意思是在插入语句之前或者之后执行selectKey中的语句
2.3 <update> 和<delete>元素----update–delete
<update> 和<delete>元素中的属性和<select>元素中的相似。用法就像之前一样。
2.4 <sql>元素----sql
<sql>元素元素的作用在于定义SQL语句的一部分,以方便后面的SQL语句引用它,例如反复使用的列名。
- 首先在UserMapper.xml映射文件中修改<select>元素中的内容
<!--重复的列名-->
<sql id="columns"> id,name,sex</sql>
<!--根据id查询user信息-->
<select id="selectByID" parameterType="Integer" resultType=