MyBatis从0开始学习目录
MyBatis-1-简介
MyBatis-2-HelloWorld
MyBatis-3-全局配置
MyBatis-4-映射文件
MyBatis-5-源码分析
MyBatis-6-#{}和$区别
MyBatis-X-面试题
MYBATIS-映射文件
映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义;
*cache --明明空间的二级缓存配置
*cache-ref - --其他命名空间缓存配置的作用
*resultMap --自定义结果集映射
*parameterMap --已废弃!老式风格的参数映射
*sql --抽取可重用语句块
*insert --映射插入语句
*update --映射更新语句
*delete --映射删除语句
*select --映射查询语句
Mybatis参数处理
单个参数,mybatis不会做特殊处理
#{参数名}:取出参数值。
多个参数,mybatis会做特殊处理
多个参数会被封装成一个map
Key,param1…paramN,或者参数的索引也可以
Value,传入的参数值
#{ }就是从map中获取指定的key的值
异常:
org.apache.ibatis.binding.BindingException:
Parameter ‘id’ not found.
Available parameters are [0, 1, param1, param2]
操作:
方法:
public void getEmpByidAndLastName(Integer id , String lastName);
取值:
#{id},#{lastName}
解决方案
id=#{param1} and last_name=#{param2}
命名参数,明确指定封装参数值map的key:@Param(“id”)
多个参数会被封装成一个map,
Key,使用@Param注解指定的值
Value,参数
#{指定的key}取出对应的参数
POJO:
如果多个参数正是我们业务逻辑的数据模型,我们就可以直接传入pojo,
#{属性名},取出传入的pojo的属性值
MAP:
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map
public Employee getEmpByMap(Map<String,Object> map);
TO:
如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象
PAGE{
Int index;
Int size;
}
Test
/*
* 测试增删改
* 1.mybatis允许增删改自定义一下类型返回值
* Integer、Long、Boolean、void
* 2.我们需要手动提交数据
* sqlSessionFactory.openSession() ===》手动提交
* sqlSessionFactory.openSession(true) ===》自动提交
* */
@Test
public void Test03() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//1.获取到的SqlSession不会自动提交数据
SqlSession opemSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = opemSession.getMapper(EmployeeMapper.class);
//增加
//Employee employee = new Employee(null, "jerry", "4938@qq.com", "1");
//mapper.addEmp(employee);
//跟新
Employee employee = new Employee(2,"too","45654@qq.com","0");
Boolean updateEmp = mapper.updateEmp(employee);
System.out.println(updateEmp);
//删除
//mapper.deleteEmpById(3);
//2.手动提交数据
opemSession.commit();
}finally {
opemSession.close();
}
}
Mapper
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
public Long addEmp(Employee employee);
public Boolean updateEmp(Employee employee);
public void deleteEmpById(Integer id);
Mapper.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.wxl.springbootmybatis.dao.EmployeeMapper">
<!--
namespace:名称空间;指定接口的全类
id:唯一标识
resultType:返回值类型
#{id},从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="employee" >
select * from tb1_employee where id = #{id}
</select>
<!--public void addEmp(Employee employee);-->
<!--parameterType,参数类型,可以省略
获取自增主键值:
mysql支持自增主键,自增主键值的获取,
mybatis也是利用statement.getGenreatedKeys()
useGeneratedKeys="true":使用自增主键获取主键策略
keyProperty="":指定对应的主键属性。也就是mybatis获取主键以后,
将这个值封装给javaBean的哪个属性
-->
<insert id="addEmp" parameterType="employee"
useGeneratedKeys="true" keyProperty="id" >
insert into tb1_employee(last_name,email,gender)
value(#{lastName},#{email},#{gender})
</insert>
<!--
Oracle不支持自增,Oracle使用序列来模拟自增
每次插入的数据的主键是从序列中拿到的值,如何获取到这个值
-->
<!--public void updateEmp(Employee employee);-->
<update id="updateEmp" parameterType="employee">
update tb1_employee set last_name=#{lastName},email=#{email},
gender=#{gender} where id = #{id}
</update>
<!--public void deleteEmpById(Integer id);-->
<delete id="deleteEmpById" parameterType="int">
delete from tb1_employee where id=#{id}
</delete>
ORCLE插入与selectKey应用
<insert id="addEmp1" databaseId="oracle">
/*
keyProperty;查出的主键封装给javaBean的哪个属性
order="BEFORE":当前sql在插入sql之前运行
AFTER:当前sql在插入sql之后
resultType="Integer":查出的数据返回值类型
BEFORE运行顺序:
先运行selectKey查询id的sql,查出id值封装给javaBean的id属性
在运行插入的sql,就可以取出id属性对应的值
AFTER运行顺序:
先运行插入sql(从序列中取出新值作为id)
在运行selectKey查询id的sql
*/
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
/*编写查询主键的sql*/
/* BEFORE */
select tb1_employee_seq.nextval from dual
/* AFTER
select tb1_employee_seq.currval from dual*/
</selectKey>
/*插入时的主键时从序列中拿到的*/
/* BEFORE */
insert into tb1_employee(id,last_name,email)
value (#{id},#{lastName},#{email})
/* AFTER
insert into tb1_employee(id,LAST_NAME,EMATL)
value (tb1_employee_seq.natval,#{lastName},#{email})*/
</insert>