• 【javaweb】学习日记Day9 - Mybatis 基础操作


    目录

    一、删除

    (1)在mapper接口执行sql删除语句

    ① 注解后sql语句没有提示怎么办?

    (2)测试层 

    (3)开启mybatis日志

    (4)预编译SQL 

    二、新增

    (1)新增信息

    (2)主键返回

    三、更新

    四、查询

    (1)简单查询

    当字段名与属性名不一致时,mybatis不封装

    ​ ① 解决办法1

     ② 解决办法2

    (2)条件查询

    五、定义XML映射文件

    (1)在resource文件下创建【与mapper接口所在包名一致】的目录文件 

    (2)在该目录下新建file文件

    (3)在xml文件中搭建基础结构

    ① 获取接口全类名方法

    (4)配置sql语句

    ① 定义方法名后,如何快速在xml文件中生成对应标签?

    六、动态SQL

    (1)if

    (2)foreach

    (3)sql&include


    一、删除

    (1)在mapper接口执行sql删除语句

    ① 注解后sql语句没有提示怎么办?

    1. @Mapper
    2. public interface EmpMapper {
    3. //根据id删除数据
    4. @Delete("delete from emp where id = #{id}")
    5. public void delete(Integer id);
    6. }

    (2)测试层 

    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textDelete() {
    7. empmapper.delete(17);
    8. }
    9. }

    (3)开启mybatis日志

    在application.properties配置日志

    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    (4)预编译SQL 

    更高效:采用?占位符,java发送语句的同时发送参数,后续因为缓存已经有编译好的sql语句,直接可以执行

    更安全(防止SQL注入):SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法

    二、新增

    (1)新增信息

    !注意:#{}内采用【驼峰命名法】,即_用大写字母替代,eg:dept_id → deptId

    1. @Mapper
    2. public interface EmpMapper {
    3. //新增员工
    4. @Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
    5. "values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    6. public void insert(Emp emp);
    7. }
    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textInsert() {
    7. Emp emp = new Emp();
    8. emp.setName("tom");
    9. emp.setUsername("TOM");
    10. emp.setImage("1.jpg");
    11. emp.setGender((short)1);
    12. emp.setJob((short)1);
    13. emp.setEntrydate(LocalDate.of(2000,1,1));
    14. emp.setCreateTime(LocalDateTime.now());
    15. emp.setUpdateTime(LocalDateTime.now());
    16. emp.setId(1);
    17. empmapper.insert(emp);
    18. }

    (2)主键返回

    在数据添加成功后,需要获取插入数据的主键。eg:添加套餐数据时,需要返回套餐id来维护套餐-菜品关系

    会将自动生成的主键值,赋值给emp对象的id属性

    @Options(keyProperty = "id",useGeneratedKeys = true)
    1. //新增员工
    2. @Options(keyProperty = "id",useGeneratedKeys = true)
    3. @Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
    4. "values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    5. public void insert(Emp emp);

    三、更新

    根据id更新员工信息

    1. @Mapper
    2. public interface EmpMapper {
    3. //更新员工
    4. @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}")
    5. public void update(Emp emp);
    6. }
    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textInsert() {
    7. Emp emp = new Emp();
    8. emp.setName("kakak");
    9. emp.setUsername("88kakk");
    10. emp.setImage("1.jpg");
    11. emp.setGender((short)1);
    12. emp.setJob((short)1);
    13. emp.setEntrydate(LocalDate.of(2000,1,1));
    14. emp.setUpdateTime(LocalDateTime.now());
    15. emp.setId(18);
    16. emp.setDeptId(1);
    17. empmapper.update(emp);
    18. }
    19. }

    四、查询

    (1)简单查询

    1. @Mapper
    2. public interface EmpMapper {
    3. //根据id查询员工
    4. @Select("select * from emp where id = #{id}")
    5. public Emp getById(Integer id);
    6. }
    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textInsert() {
    7. Emp emp = empmapper.getById(19);
    8. System.out.println(emp);
    9. }
    10. }

    当字段名与属性名不一致时,mybatis不封装

     ① 解决办法1

    手动注解

    1. @Mapper
    2. public interface EmpMapper {
    3. //根据id查询员工
    4. @Results({
    5. @Result(column = "dept_id",property = "deptId"),
    6. @Result(column = "crea_time",property = "createTime"),
    7. @Result(column = "update_time",property = "updateTime")
    8. })
    9. @Select("select * from emp where id = #{id}")
    10. public Emp getById(Integer id);
    11. }
     ② 解决办法2

    在application.properties开启驼峰命名法开关

    1. # 开启驼峰命名法自动映射开关
    2. mybatis.configuration.map-underscore-to-camel-case=true

    (2)条件查询

    #{}编译后会被?替代,但?不能出现在‘’内,因此我们不能使用#{},而要使用拼接${},但是${}有sql注入风险,因此我们使用concat()字符串拼接函数 

    1. @Mapper
    2. public interface EmpMapper {
    3. //根据id查询员工
    4. @Select("select * from emp where name like '%${name}%' and gender = #{gender} and entrydate between #{begin} and #{end}")
    5. public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
    6. }
    1. @Mapper
    2. public interface EmpMapper {
    3. //根据id查询员工
    4. @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end}")
    5. public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
    6. }

    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textList() {
    7. List<Emp> empList = empmapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
    8. System.out.println(empList);
    9. }
    10. }

    五、定义XML映射文件

    注解开发简单的sql,xml开发动态sql

    (1)在resource文件下创建【与mapper接口所在包名一致】的目录文件 

    (2)在该目录下新建file文件

    文件名与mapper接口名一致

    (3)在xml文件中搭建基础结构

    namespace属性和mapper接口全类名一致

    MyBatis中文网

    ① 获取接口全类名方法

    1. "1.0" encoding="UTF-8" ?>
    2. DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.itheima.mapper.EmpMapper">
    6. mapper>

    (4)配置sql语句

    id与mapper接口中方法名一致,保持返回类型一致

    resultType和类名一致

    ① 定义方法名后,如何快速在xml文件中生成对应标签?

    把光标置于方法名上,按alt+回车+回车,直接跳转到xml文件并生成 

    六、动态SQL

    随着用户的输入或外部条件变化而变化的SQL语句,称为动态SQL

    比方说:查询框有姓名,性别,入职时间

    用户如果不填某空(缺少某参数),用之前注解sql语句肯定会报错,而动态sql就是解决这一问题的

    (1)if

    如果test属性成立,则拼接SQL

    1. "com.itheima.mapper.EmpMapper">
    2. <select id="list" resultType="com.itheima.pojo.Emp">
    3. select *
    4. from emp
    5. <where>
    6. <if test="name != null">
    7. name like concat('%', #{name}, '%')
    8. if>
    9. <if test="gender != null">
    10. and gender = #{gender}
    11. if>
    12. <if test="begin != null and end != null">
    13. and entrydate between #{begin} and #{end}
    14. if>
    15. where>
    16. order by update_time desc
    17. select>

    (2)foreach

    批量删除

    • collection:遍历的集合
    • item:遍历出来的元素
    • separator:分隔符
    • open:遍历开始前拼接的SQL片段
    • close:遍历结束后拼接的SQL片段
    1. "com.itheima.mapper.EmpMapper">
    2. <delete id="deleteByIds">
    3. delete from emp where id in
    4. <foreach collection="ids" item="x" separator="," open="(" close=")">
    5. #{x}
    6. foreach>
    7. delete>
    1. @SpringBootTest
    2. class MybatisCrudApplicationTests {
    3. @Autowired
    4. private EmpMapper empmapper;
    5. @Test
    6. public void textList() {
    7. List<Integer> ids = Arrays.asList(13,14,15);
    8. empmapper.deleteByIds(ids);
    9. }
    10. }

    (3)sql&include

    sql标签可以择出重复使用的语句,并用include在所需要的地方引/

    1. "com.itheima.mapper.EmpMapper">
    2. <sql id="commonSelect">
    3. select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
    4. from emp
    5. sql>
    6. <select id="list" resultType="com.itheima.pojo.Emp">
    7. <include refid="commonSelect"/>
    8. <where>
    9. <if test="name != null">
    10. name like concat('%', #{name}, '%')
    11. if>
    12. <if test="gender != null">
    13. and gender = #{gender}
    14. if>
    15. <if test="begin != null and end != null">
    16. and entrydate between #{begin} and #{end}
    17. if>
    18. where>
    19. order by update_time desc
    20. select>

  • 相关阅读:
    4-4网络层-IPv6
    2022第四届长安杯复盘
    什么是Python虚拟环境?
    深入浅出计算机组成原理(四):存储
    [经验] 手机屏幕失灵怎么回事-手机屏幕为什么失灵 #微信#笔记
    Spring学习(4) Spring依赖注入
    diskgenius数据恢复软件,亲测可用!
    前端性能优化
    vue+springboot实现登录或注册滑动验证码( AJ-Captcha)
    语法练习:monkey_trouble
  • 原文地址:https://blog.csdn.net/weixin_61639349/article/details/132652859