Mybatis基本操作
一、环境准备
数据库表和springboot工程在课程资料中都有提供
注意,entrydate是用的jdk1.8中的LocalDate类型,createTime用的是jdk1.8中的LocalDateTime类型
二、删除
Mybatis中提供了一种参数占位符 #{id}
empMapper.java
package com.itheima.mapper;
import org.apache.ibatis.annotations.*;
@Mapper
public interface EmpMapper {
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);
//其实delete是有返回值的,返回删除的行数,不过一般不需要
// public int delete(Integer id);
}
测试方法
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
public EmpMapper empMapper;
@Test
public void testDelete(){
// int i = empMapper.delete(17);
// System.out.println(i);
empMapper.delete(17);
}
}
三、删除(预编译SQL)
预编译SQL的优势—性能更高
预编译SQL的优势—防止SQL注入
mybatis提供了2个参数占位符
参数占位符(面试题)
用${id}就不会生成预编译SQL,性能低,不安全,一般不用
小结
四、新增
首先要会写SQL语句:
像这种参数多的,推荐多个参数封装到一个对象中,这样维护比较方便,也便于阅读
1、在empMapper接口中添加,#{Emp对象的属性名}
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);
2、测试
@Test
public void testInsert(){
// 创建Emp对象
Emp emp = new Emp();
emp.setUsername("Tom");
emp.setName("汤姆");
emp.setGender((short)1);
emp.setImage("1.jpg");
emp.setJob((short)1);
emp.setDeptId(1);
emp.setEntrydate(LocalDate.now());
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
五、新增(主键返回)
@Options(keyProperty = "id",useGeneratedKeys = true)//获取返回的主键,keyProperty是将返回的主键往哪个emp的属性封装
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
" values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);
六、更新(根据主键修改员工信息)
1、先写SQL语句
-- 更新员工信息
update emp set username='',name='',gender='',image='',job='',entrydate='',dept_id='',update_time=''
where id=1;
2、添加mapper接口方法
@Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime}" +
" where id=#{id}")
public void update(Emp emp);
3、测试
@Test
public void testUpdate(){
// 创建Emp对象
Emp emp = new Emp();
emp.setId(21);
emp.setUsername("Tom3");
emp.setName("汤姆3");
emp.setGender((short)1);
emp.setImage("2.jpg");
emp.setJob((short)1);
emp.setDeptId(1);
emp.setEntrydate(LocalDate.of(2012-10-10,12,10));
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
七、查询(根据ID)
1、先写SQL语句
-- 根据ID查询员工信息
select * from emp where id=1;
2、Mapper接口方法
// 查询
@Select("select * from emp where id=#{id}")
public Emp getById(Integer id);
3、测试
//查询
@Test
public void select(){
Emp emp = empMapper.getById(2);
System.out.println(emp);
}
但是deptId后面的字段都是null,但是数据库中确实有这些数据
Mybatis的封装机制
方法一
// 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
@Select("select id, username, password, name, gender, image, job, entrydate, " +
"dept_id deptId, create_time createTime, update_time updateTime from emp where id=#{id}")
public Emp getById(Integer id);
方法二
// 2 、手动结果映射:通过 @Results及@Result 进行手动结果映射。
@Select("select * from emp where id=#{id}")
@Results({
@Result(column = "dept_id",property = "deptId"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime")
})
public Emp getById(Integer id);
方法三
查询语句保持不变
类的属性名和数据库查询返回的字段名不一致,就不能自动封装,返回值结果为null,如何解决?
八、查询(条件查询)
1、写SQL语句
-- 条件查询
select * from emp where name like '%张%' and gender=1 and entrydate between '2010-01-01' and '2020-01-01';
2、Mapper创建方法,因为’'之间是字符串,#{name}是不能出现在引号之间的也就是?,所以一种方法是用${name}进行拼接。
// 条件查询
@Select("select * from emp where name like '%${name}%' and gender=#{gender} and entrydate between #{begin} and #{end}")
public List<Emp> select(String name, short gender, LocalDate begin,LocalDate end);
还有一种方法是用MySQL提供的函数concat,用来拼接字符串
@Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end}")
public List<Emp> select(String name, short gender, LocalDate begin,LocalDate end);
3、测试
@Test
public void select(){
List<Emp> empList = empMapper.select("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
System.out.println(empList);
}