Mapper代理方式:
mapper代理开发规范:
- 映射文件中的 namespace 必须是 mapper 接口的地址。
- 映射文件中 statement 的 id 必须与 mapper 接口中的方法名一致。
- 映射文件中 parameterType 必须与 mapper 接口中的方法参数类型一致。
- 映射文件中 resultType 必须与 mapper 接口中的返回值类型一致。
使用方式:
创建mapper接口
package com.losoft.mapper;lo
import java.util.List;
import com.losoft.po.Emp;
public interface EmpMapper {
public Emp getEmpById(int empno);
public List<Emp> listEmpAll();
}
创建mapper映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-msapper.dtd">
<mapper namespace="com.losoft.mapper.EmpMapper">
<select id="getEmpById" parameterType="int" resultType="Emp">
select * from t_emp where empno = #{empno}
</select>
<select id="listEmpAll" resultType="Emp">
select * from t_emp order by empno
</select>
</mapper>
<!-- mapper接口与映射文件最好在同一个文件夹内,并且接口名与映射文件名要一致 -->
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;
注册mapper映射文件
<configuration>
<mappers>
<mapper resource="com/losoft/mapper/EmpMapper.xml" />
</mappers>
</configuration>
获取代理对象测试
SqlSession sqlSession = Util.getSqlSessionFactory().openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.getEmpById(7369);
System.out.println(emp);
List<Emp> list = mapper.listEmpAll();
for(Emp e : list) {
System.out.println(e);
}
转义字符:
由于mybatis的配置都是写在xml文件中的,有些特殊字符需要转义。
< | < | 小于 |
> | > | 大于 |
& | & | 与 |
' | ' | 单引号 |
" | " | 双引号 |
常用数据库操作注意事项:
parameterType只有一个。所以,有多个参数时使用对象传值(这就是输入映射)。
{} 中书写的是实体对象的属性名,所以要严格区分大小写。
如果返回值只有一行一列时,resultType才能使用基本数据类型。
增删改都会返回影响的行数(int值),但是,增删改标签中不能书写resultType属性
获取主键的方式:
<selectKey keyProperty=" empno" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
- selectKey标签中的 select LAST_INSERT_ID() 语句就能获取生成的主键
- selectKey标签中的keyProperty属性就是主键名,MyBatis会自动将获取的主键封装给此属性。
- order的值有两种:BEFORE、AFTER
BEFORE:先获取主键,然后执行insert; 比如 Oracle数据库。
AFTER:先执行insert,然后获取主键; 比如 MySql数据库。
<insert id="insertEmp" parameterType="Emp" useGeneratedKeys="true" keyProperty="empno">
insert into t_emp(ename,job,hiredate,deptno)
values(#{ename},#{job},#{hiredate},#{deptno})
</insert>
useGeneratedKeys设置为true后,mybatis会使用JDBC的getGeneratedkeys方法获取由数据库内部自动生成的主键,并将该值赋值给由keyProperty指定的属性; 注意:此种方式只适合于有自增长列的数据库(mysql、sqlserver等)
动态sql
MyBatis中用于动态sql的元素主要有:if、where、trim、set、foreach、choose等
if+where
if+where会实现以下功能:
- 自动添加where
- 不需要考虑where后是否加and,mybatis会自动处理
- 不需要考虑是否加空格,mybatis会自动处理
- 没有 else 标签,也没有 else if 标签。
注意: job!='' 此处只可以判断是否为空,不能判断是否为某个值。也就是说:job!='manger' 是无效的。
choose
choose会实现如下功能:
- 多个 when 标签中,只能执行一个。也就是说:当一个 when 条件满足并执行后,其它的 when 将不再执行。
- 当所有 when 都不满足条件时,执行 otherwise 标签。
if 与 choose 的区别:if 相当于java中的if语句; choose相当于java中的switch语句。
trim
trim标签可以在自己包含的内容中加上某些前缀或后缀,与之对应的属性是:prefix、suffix。 还可以把包含内容的开始内容覆盖,即忽略。也可以把结束的某些内容覆盖,对应的属性是:prefixOverrides、suffixOverrides
注意:
- prefix与suffix可以在sql语句中拼接出一对小括号。
- suffixOberrides可以将最后一个逗号去掉。
set
set标签主要用于更新操作时使用
注意:
- set可以在sql语句中自动加上set关键词。
- 可以自动将最后的逗号去掉。
- 上面写法中,必须要保证有一个if成立
foreach
foreach标签可以在sql中迭代一个集合或数组,主要用于拼接in条件。
oreach标签的属性:
- collection:需要遍历的类型,值有:list、array
- item:表示遍历出来的对象
- open:表示语句的开始部分
- close:表示语句的结束部分
- separator:表示每次迭代之间以什么符号为间隔
- index:每次迭代的位置索引,就是循环变量
输入映射总结:
sql语句需要一个参数时:
接口方法参数为一个基本数据类似;parameterType配置一个基本数据类型;
sql语句需要多个参数时:
接口方法参数为一个实体对象类型;parameterType配置一个实体对象类型;
接口方法参数为一个集合类型(List、Map);parameterType配置集合中元素的类型;
输出映射总结:
当sql语句中的字段名和实体对象中的属性名一致时,使用resultType;
当sql语句中的字段名和实体对象中的属性名不一致时,使用resultMap;
MyBatis关联查询:
一对一、多对一关:使用association标签
一对多、多对多:使用collection标签
关联查询的延迟加载(懒加载)
延迟加载:执行查询时,关联查询不会立即加载。只有在使用关联数据时才会加载。 优点:按需加载,提高效率。
这与单例模式里的懒汉式很相似,都是节省了空间,但是浪费了时间
要使用关联查询的延迟加载,就必须要使用单独查询形式。并且,需要先启用MyBatis的延迟加载配置(需要配置两项):
- lazyLoadingEnabled:延迟加载的全局开关(默认为false)。
- aggressiveLazyLoading:延迟加载整个对象(默认为true; false:对象的每个属性都会延迟加载,即属性按需加载)
使用注解完成mybatis映射
主要有四种注解来实现增删改查:@Select、@Insert、@Update、@Delete
在接口的方法上面加上注解里面包含sql语句,便可绑定接口。