MyBatis-Funcionamiento Básico-CRDU

Tabla de contenido

Eliminar datos según id (D)

Agregar datos de empleados (C)

Actualizar información del empleado (U)

Modificar la información de los empleados en función de la clave principal

Consultar información de empleados (R)

 consulta por id

consulta condicional


La visualización de la página del front-end proporciona operaciones de eliminación de datos y el back-end las implementa

Eliminar datos según id (D)

  • Sentencia SQL concreta
    • delete from emp where id =17;
  •  método de interfaz
    •     @Delete("delete from emp where id =#{id} ")
          public int DeleteByID(Integer id);
  •  Métodos de prueba
    •     @Test
          public void testDelete() {
              int delete = empMapper.DeleteByID(17);
              System.out.println(delete);
          }

Agregar datos de empleados (C)

  •  Sentencia SQL concreta
    • 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());
  • método de interfaz

    •     @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);
    • En el método Insert(), si se pasa el parámetro enp, entonces se usa el marcador de posición #{} en la instrucción SQL anterior , y el nombre de la variable miembro en el objeto emp se completa en el marcador de posición para completar la transferencia de los datos correspondientes

  • Métodos de prueba

    •     @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);
      
          }
  • devoluciones de clave principal

    • Descripción: después de que los datos se agreguen con éxito, es necesario obtener la clave principal de los datos insertados en la base de datos

    • Implementación: agregue las anotaciones correspondientes a la interfaz y luego obtenga el atributo correspondiente donde se encuentra el valor de la clave principal en el método de prueba

      •     @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);
      • Esta anotación es una configuración en Java Object Mapping (ORM) utilizada para integrarse con el marco MyBatis. Su significado es el siguiente:

      • @Options: Esta es una anotación de MyBatis utilizada para especificar algunas configuraciones de opciones.
      • useGeneratedKeys = true: Esta opción indica si MyBatis debe usar claves generadas por la base de datos para poblar las propiedades del objeto. Al insertar un registro, si la base de datos genera automáticamente un valor de clave primaria, configurarlo  true hará que MyBatis asigne el valor a la  id propiedad del objeto correspondiente.
      • En resumen, esta anotación indica que al realizar una operación de inserción, la clave generada por la base de datos se utiliza para completar la idpropiedad del objeto.

      • keyProperty = "id": esta opción especifica el nombre de propiedad del objeto utilizado para guardar el valor de clave generado. En este ejemplo, los valores clave generados se asignarán a las  id propiedades del objeto.
    • Métodos de prueba
      •     @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());
        
            }
      • El resultado de la operación es el siguiente

Actualizar información del empleado (U)

Modificar la información de los empleados en función de la clave principal

  • instrucción SQL
    • -- todo 根据主键修改员工信息
      update emp
      set username   = '',
          name='',
          gender='',
          image='',
          job='',
          entrydate='',
          dept_id='',
          update_time=''
      where id = 1;
  • método de interfaz

    •     @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);
  • Métodos de prueba

    •     @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);
          }

Consultar información de empleados (R)

 consulta por id

  • instrucción SQL
    • select id,
             username,
             password,
             name,
             gender,
             image,
             job,
             entrydate,
             dept_id,
             create_time,
             update_time
      from emp
      where id = 5;
  • método de interfaz

    •     @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);
  • Métodos de prueba

    •     @Test
          public void testSelectByID() {
              Emp emp = empMapper.SelectByID(5);
              System.out.println(emp);
          }
      
  • resultado de la operación

    • En los resultados de ejecución anteriores, los últimos tres datos son nulos, pero en la base de datos, estos tres datos son todos valiosos, la solución a este problema se mencionará a continuación.
  • Encapsulación de datos MyBatis
    • El nombre del atributo de la clase de entidad es el mismo que el nombre del campo devuelto por la consulta de la tabla de la base de datos , y mybatis lo encapsulará automáticamente.
    • Si el nombre del atributo de la clase de entidad no es coherente con el nombre del campo devuelto por la consulta de la tabla de la base de datos , no se puede encapsular automáticamente.
      • solución
        • Solución 1: Alias ​​el campo para que el alias sea consistente con el nombre del atributo en la clase de entidad
        •     @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);
        • Solución 2: si @Results, encapsulación de mapeo manual de anotación @Result

        •     @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);
        • resultado de la operación

        • Método común : Active el interruptor de mapeo automático de nombres de joroba de MyBatis

        • El uso de este método debe cumplir estrictamente con el nombre del campo en la base de datos llamado a_column, y el nombre del atributo en el objeto se llama aColumn, para que la asignación se pueda completar automáticamente
          • Es decir, encapsule automáticamente el nombre del campo a_column en el nombre del atributo aColumn

          • Configurar en el archivo de configuración

          • #数据库连接驱动
            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
            

consulta condicional

  •  instrucción 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;
  • método de interfaz

    •     @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);
    • Métodos de prueba

      •     @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);
            }
    • resultado de la operación

En el método de interfaz mencionado anteriormente, la condición de consulta para el nombre es una consulta difusa y se usa el marcador de posición ${} Para conocer la diferencia entre #{} y ${}, consulte el artículo: Análisis detallado de #{} y ${ } ¿Cuál es la diferencia?_Blog del mono de agua de Huangnichuan-Blog de CSDN

Sin embargo, el uso de los marcadores de posición ${} anteriores tiene problemas de bajo rendimiento, inseguridad y inyección SQL. Las soluciones son las siguientes

Use la función concat (función de empalme de cadenas) en MySQL para resolver

Código de muestra

select concat('hello','MySQL')

El resultado de la operación es:

La modificación del código del método de interfaz en el ejemplo anterior es la siguiente:

 El resultado de la operación es el siguiente

Supongo que te gusta

Origin blog.csdn.net/weixin_64939936/article/details/132052104
Recomendado
Clasificación