目录
准备
删除,插入,修改,查询
日志输出
预编译SQL
新增(主键返回)
数据封装
XML映射文件
动态SQL
案例
lombok:简化实体类定义
//mybatis的起步依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
//mysql驱动包
com.mysql
mysql-connector-j
runtime
//lombok依赖
org.projectlombok
lombok
true
//springboot进行单元测试依赖
org.springframework.boot
spring-boot-starter-test
test
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连按数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true
@Mapper:程序在运行会自动创建该接口的代理对象,并且将这个代理对象放IOC容器中
@Mapper
public interface EmpMapper {//根据ID删除数据
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
//新增员工 (多个参数封装到一个对象当中,再调用insert方法,传递一个对象
@Options(useGeneratedKeys = true, keyProperty = "id") //获取返回的主键
@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); //实体对象进行封装
//更新员工
@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);
//数据封装方案三: 开启mybatis的驼峰命名自动映射开关 --- a_cloumn ------> aColumn (在配置文件中)
//根据ID查询员工
@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);
//条件查询员工
//方式二
// @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +
// "entrydate between #{begin} and #{end} order by update_time desc ")
// public Listlist(String name, Short gender, LocalDate begin , LocalDate end);
可以在application.properties中,打开mybatis的日志,并指定输出到控制台。
性能更高 更安全(防止SQL注入)
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。
实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
查询时,字符串拼接concat
MybatisX 是一款基于 IDEA 的快速开发Mybatis的插件,为效率而生。
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
形式:
name like concat('%',#{name},'%')
EmpMapper.java中:
//动态条件查询
public Listlist(String name, Short gender, LocalDate begin , LocalDate end);
XML中 :
SpringbootMybatisCrudApplicationTests中:
//根据条件查询员工
@Test
public void testList(){
//ListempList = empMapper.list("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
//ListempList = empMapper.list("张", null, null, null);
//ListempList = empMapper.list("张", (short)1, null, null);
//ListempList = empMapper.list(null, (short)1, null, null);
ListempList = empMapper.list(null, null, null, null); //全部员工信息
System.out.println(empList);
}
动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新。
EmpMapper.java中:
//动态更新员工
public void update2(Emp emp);
XML中:
update emp
username = #{username},
name = #{name},
gender = #{gender},
image = #{image},
job = #{job},
entrydate = #{entrydate},
dept_id = #{deptId},
update_time = #{updateTime}
where id = #{id}
SpringbootMybatisCrudApplicationTests中:
//动态更新员工 - 更新ID为18的员工 username 更新为 Tom111, name更新为 汤姆111, gender更新为2
@Test
public void testUpdate2(){
//构造员工对象
Emp emp = new Emp();
emp.setId(19);
emp.setUsername("Tom222333");
// emp.setName("汤姆222");
// emp.setGender((short)1);
// emp.setUpdateTime(LocalDateTime.now());//执行更新员工操作
empMapper.update2(emp);
}
循环遍历
SQL语句
delete from emp where id in (1,2,3);
EmpMapper.java中:
//批量删除员工
public void deleteByIds(Listids);
SpringbootMybatisCrudApplicationTests中:
//批量删除员工 - 13,14,15
@Test
public void testDeleteByIds(){
Listids = Arrays.asList(13, 14, 15);
empMapper.deleteByIds(ids);
}
}
EmpMapper.xml中:
delete from emp where id in
#{id}
XML中:
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp