MyBatis-基础操作-CRDU

目录

根据id删除数据(D)

新增员工数据(C)

[更新员工信息 (U)](#更新员工信息 (U))

根据主键修改员工信息

查询员工信息(R)

根据id查询

条件查询


前端页面展示提供对于数据的删除操作,后端为其实现

根据id删除数据(D)

  • 具体的SQL语句
    *

    sql 复制代码
    delete from emp where id =17;
  • 接口方法
    *

    sql 复制代码
        @Delete("delete from emp where id =#{id} ")
        public int DeleteByID(Integer id);
  • 测试方法
    *

    java 复制代码
        @Test
        public void testDelete() {
            int delete = empMapper.DeleteByID(17);
            System.out.println(delete);
        }

新增员工数据(C)

  • 具体的SQL语句
    *

    sql 复制代码
    insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
    VALUES ('法老爷爷', '孙权', 1, '1.jpg', 1, '2021-06-13', 1, now(), now());
  • 接口方法

    java 复制代码
        @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);
    • 在Insert()方法中,传入参数enp,则在上述的SQL语句中使用**#{}占位符**,在占位符中填写emp对象中成员变量的名称,就可完成对应数据的传递
  • 测试方法

    java 复制代码
        @Test
        public void testInsert() {
            // 设置要插入的员工信息
            Emp emp = new Emp();
            emp.setUsername("法老爷爷");
            emp.setName("孙权");
            emp.setImage("1.jpg");
            emp.setGender((short) 1);
            emp.setJob((short) 1);
            emp.setEntrydate(LocalDate.of(2021, 12, 23));
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            emp.setDeptId(1);
    
            empMapper.Insert(emp);
    
        }
  • 主键返回

    • 描述:在数据添加成功后,需要获取插入数据库数据的主键

    • 实现:在接口中加入对应的注解,然后在测试的方法中获取主键值所在的对应的属性即可

      java 复制代码
          @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);
      • 该注解是用于与 MyBatis 框架集成的 Java 对象映射(ORM)中的一个配置。它的含义如下:

      • @Options: 这是一个 MyBatis 注解,用于指定一些选项配置。

      • useGeneratedKeys = true: 该选项指示 MyBatis 是否应该使用数据库生成的键来填充对象的属性。当插入一条记录时,如果数据库自动生成了一个主键值,设置为 true 将使 MyBatis 将该值赋给相应对象的 id 属性。

      • 总结起来,这个注解表示在执行插入操作时,使用数据库生成的键来填充对象的 id 属性。

      • keyProperty = "id": 该选项指定了用于保存生成的键值的对象属性名。在这个例子中,生成的键值将被赋给对象的 id 属性。

    • 测试方法
      *

      java 复制代码
          @Test
          public void testInsert() {
              // 设置要插入的员工信息
              Emp emp = new Emp();
              emp.setUsername("法老20");
              emp.setName("孙权");
              emp.setImage("1.jpg");
              emp.setGender((short) 1);
              emp.setJob((short) 1);
              emp.setEntrydate(LocalDate.of(2021, 12, 23));
              emp.setCreateTime(LocalDateTime.now());
              emp.setUpdateTime(LocalDateTime.now());
              emp.setDeptId(1);
      
              empMapper.Insert(emp);
              System.out.println(emp.getId());
      
          }
      • 运行结果如下

更新员工信息 (U)

根据主键修改员工信息

  • SQL语句
    *

    sql 复制代码
    -- todo 根据主键修改员工信息
    update emp
    set username   = '',
        name='',
        gender='',
        image='',
        job='',
        entrydate='',
        dept_id='',
        update_time=''
    where id = 1;
  • 接口方法

    java 复制代码
        @Update("update emp\n" +
                "set username   = #{username},\n" +
                "    name=#{name},\n" +
                "    gender=#{gender},\n" +
                "    image=#{image},\n" +
                "    job=#{job},\n" +
                "    entrydate=#{entrydate},\n" +
                "    dept_id=#{deptId},\n" +
                "    update_time=#{updateTime}\n" +
                "where id = #{id};")
        public void Update(Emp emp);
  • 测试方法

    java 复制代码
        @Test
        public void testUpdate() {
            Emp emp = new Emp();
            emp.setId(18);
            emp.setUsername("TOM");
            emp.setName("汤姆");
            emp.setGender((short) 1);
            emp.setImage("1.jpg");
            emp.setJob((short) 1);
            emp.setEntrydate(LocalDate.of(2000, 1, 25));
            emp.setUpdateTime(LocalDateTime.now());
            emp.setDeptId(1);
    
            empMapper.Update(emp);
        }

查询员工信息(R)

根据id查询

  • SQL语句
    *

    sql 复制代码
    select id,
           username,
           password,
           name,
           gender,
           image,
           job,
           entrydate,
           dept_id,
           create_time,
           update_time
    from emp
    where id = 5;
  • 接口方法

    java 复制代码
        @Select("select id,\n" +
                "       username,\n" +
                "       password,\n" +
                "       name,\n" +
                "       gender,\n" +
                "       image,\n" +
                "       job,\n" +
                "       entrydate,\n" +
                "       dept_id,\n" +
                "       create_time,\n" +
                "       update_time\n" +
                "from emp\n" +
                "where id = #{id};")
        public Emp SelectByID(Integer id);
  • 测试方法

    java 复制代码
        @Test
        public void testSelectByID() {
            Emp emp = empMapper.SelectByID(5);
            System.out.println(emp);
        }
  • 运行结果

    • 在上述的运行结果中,最后有三个数据为null,但是在数据库中,这三个数据都是有值的,该问题的解决下面会提及

  • MyBatis数据封装

    • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
    • 如果实体类属性名和数据库表查询返回的字段名不一致 ,不能自动封装
      • 解决方案

        • 方案1:给字段起别名,让别名与实体类中属性名一致
        java 复制代码
            @Select("select id,\n" +
                    "       username,\n" +
                    "       password,\n" +
                    "       name,\n" +
                    "       gender,\n" +
                    "       image,\n" +
                    "       job,\n" +
                    "       entrydate,\n" +
                    "       dept_id     as deptId,\n" +
                    "       create_time as createTime,\n" +
                    "       update_time as updateTime\n" +
                    "from emp\n" +
                    "where id = #{id};")
            public Emp SelectByID(Integer id);
        • 方案2:如果@Results,@Result注解手动映射封装

        java 复制代码
            @Results({
                    // column为字段名,property为对象的属性名
                    @Result(column = "dept_id", property = "deptId"),
                    @Result(column = "create_time", property = "createTime"),
                    @Result(column = "update_time", property = "updateTime")
            })
            @Select("select id,\n" +
                    "       username,\n" +
                    "       password,\n" +
                    "       name,\n" +
                    "       gender,\n" +
                    "       image,\n" +
                    "       job,\n" +
                    "       entrydate,\n" +
                    "       dept_id     ,\n" +
                    "       create_time ,\n" +
                    "       update_time \n" +
                    "from emp\n" +
                    "where id = #{id};")
            public Emp SelectByID(Integer id);
        • 运行结果

        • 常用方法:开启MyBatis驼峰命名自动映射开关

        • 使用该方法必须严格遵守数据库中字段名为a_column,对象中的属性名为aColumn,才可以自动完成映射

          • 即自动将a_column字段名封装到aColumn属性名中

          • 在配置文件中进行配置

          java 复制代码
          #数据库连接驱动
          spring.datasourde.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-->aColumn
          mybatis.configuration.map-underscore-to-camel-case=true

条件查询

  • SQL语句
    *

    sql 复制代码
    select id,
           username,
           password,
           name,
           gender,
           image,
           job,
           entrydate,
           dept_id,
           create_time,
           update_time
    from emp
    where name like '%张%'
      and gender = 1
      and entrydate between '2010-01-01' and '2020-01-01'
    order by update_time desc;
  • 接口方法

    java 复制代码
        @Select("select id,\n" +
                "       username,\n" +
                "       password,\n" +
                "       name,\n" +
                "       gender,\n" +
                "       image,\n" +
                "       job,\n" +
                "       entrydate,\n" +
                "       dept_id,\n" +
                "       create_time,\n" +
                "       update_time\n" +
                "from emp\n" +
                "where name like '%${name}%'\n" +
                "  and gender = #{gender}\n" +
                "  and entrydate between #{begin} and #{end}\n" +
                "order by update_time desc;")
        public List<Emp> List(String name, short gender, LocalDate begin, LocalDate end);
    • 测试方法

      java 复制代码
          @Test
          public void TestList() {
              List<Emp> list = empMapper.List("张", (short) 1, LocalDate.of(2010, 01, 01), LocalDate.of(2020, 01, 01));
              System.out.println(list);
          }
    • 运行结果

在上述的接口方法中,对于名字name的查询条件是模糊查询,使用的是{}占位符,#{}和{}的区别具体参见文章:[详细分析一下 #{}和{}的区别是什么_黄泥川水猴子的博客-CSDN博客](https://blog.csdn.net/qq_40277163/article/details/124756536?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124756536.nonecase&spm=1018.2226.3001.4187#%7B%7D%E5%92%8C%7B%7D%E5%8D%A0%E4%BD%8D%E7%AC%A6&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124756536.nonecase "详细分析一下 #{}和${}的区别是什么_黄泥川水猴子的博客-CSDN博客")

但使用上述${}占位符存在性能低、不安全、存在SQL注入问题,解决办法如下

使用MySQL中concat函数(字符串拼接函数)进行解决

示例代码

sql 复制代码
select concat('hello','MySQL')

运行结果为:

上述示例中接口方法代码改造如下:

运行结果如下

相关推荐
fhvyxyci几秒前
【C++之STL】一文学会使用 string
开发语言·数据结构·c++·stl
未来之窗软件服务2 分钟前
业绩代码查询实战——php
android·开发语言·php·数据库嵌套
新手小袁_J6 分钟前
RabbitMQ的发布订阅模式
java·开发语言·redis·spring·缓存·java-rabbitmq
小笨猪-10 分钟前
RabbitMQ应用问题
java·redis·分布式·rabbitmq
ChaoZiLL18 分钟前
关于我的编程语言——C/C++——第四篇(深入1)
c语言·开发语言
zls3653651 小时前
C# WPF 与 JS 交互可以使用的第三方库
开发语言·javascript·c#·wpf·交互
码上一元1 小时前
缓存淘汰策略:Redis中的内存管理艺术
java·redis·缓存
cyt涛1 小时前
SpringCloudGateway — 网关路由
java·开发语言·网关·gateway·路由·断言·转发
睡觉谁叫1 小时前
一文解秘Rust如何与Java互操作
android·java·flutter·跨平台
李正己1 小时前
delphi 编译多语言工程 error RC2104 : undefined keyword or key name:
开发语言