Resumen del uso de Mybatis (crecimiento automático, múltiples condiciones, operaciones por lotes, consultas de múltiples tablas, etc.)...

Introducción a Mybatis

1.¿Qué es Mybatis?

(1) Mybatis es un marco semi-ORM (Mapeo relacional de objetos) que encapsula JDBC internamente. Al desarrollar, solo necesita concentrarse en la declaración SQL en sí y no necesita gastar energía en procesos complejos como cargar controladores, crear conexiones y crear declaraciones. Los programadores escriben directamente SQL original, que puede controlar estrictamente el rendimiento de ejecución de SQL y proporcionar una alta flexibilidad.

(2) MyBatis puede usar XML o anotaciones para configurar y mapear información nativa, mapear POJO en registros en la base de datos, evitar casi todo el código JDBC y la configuración manual de parámetros y obtener conjuntos de resultados.

(3) Configure varias declaraciones para que se ejecuten a través de archivos xml o anotaciones, y genere la declaración sql ejecutada final mediante el mapeo entre el objeto java y los parámetros dinámicos del sql en la declaración. Finalmente, el marco mybatis ejecuta el sql y asigna el resultado al objeto java y retorno. (El proceso desde la ejecución de SQL hasta la devolución del resultado).

2. Ventajas de Mybaits

(1) La programación basada en declaraciones SQL es bastante flexible y no tendrá ningún impacto en el diseño existente de la aplicación o base de datos. SQL está escrito en XML, lo que desacopla SQL del código del programa y facilita la administración unificada; se proporcionan etiquetas XML para admitir Escritura de sentencias SQL dinámicas y reutilizables.

(2) En comparación con JDBC, la cantidad de código se reduce en más del 50%, lo que elimina una gran cantidad de código redundante en JDBC y no requiere conexiones de conmutador manuales;

(3) Muy compatible con varias bases de datos (debido a que MyBatis usa JDBC para conectarse a la base de datos, MyBatis admite todas las bases de datos compatibles con JDBC).

(4) Capacidad para integrarse bien con Spring;

(5) Proporcionar etiquetas de mapeo para admitir el mapeo de relaciones de campos ORM entre objetos y bases de datos; proporcionar etiquetas de mapeo de relaciones de objetos para respaldar el mantenimiento de los componentes de relaciones de objetos.

3. Desventajas del marco MyBatis

(1) La carga de trabajo de escribir declaraciones SQL es relativamente grande, especialmente cuando hay muchos campos y tablas relacionadas, lo que requiere que los desarrolladores tengan ciertas habilidades para escribir declaraciones SQL.

(2) Las declaraciones SQL dependen de la base de datos, lo que da como resultado una portabilidad deficiente de la base de datos y la base de datos no se puede reemplazar a voluntad.

4. Ocasiones aplicables del marco MyBatis

(1) MyBatis se centra en SQL en sí y es una solución de capa DAO bastante flexible.

(2) Para proyectos que tienen requisitos de alto rendimiento o necesidades cambiantes, como proyectos de Internet, MyBatis será una buena opción.

5. ¿Cuáles son las diferencias entre MyBatis e Hibernate?

(1) Mybatis se diferencia de hibernate en que no es completamente un marco ORM porque MyBatis requiere que los programadores escriban declaraciones Sql ellos mismos.

(2) Mybatis escribe directamente SQL ecológico original, que puede controlar estrictamente el rendimiento de ejecución de SQL y tiene una alta flexibilidad. Es muy adecuado para el desarrollo de software que no tiene altos requisitos para modelos de datos relacionales, porque los requisitos de este tipo de software cambian con frecuencia. , y una vez que los requisitos cambian, los resultados deben producirse rápidamente. Sin embargo, la premisa de la flexibilidad es que mybatis no puede ser independiente de la base de datos. Si necesita implementar software que admita múltiples bases de datos, debe personalizar varios conjuntos de archivos de mapeo SQL, lo cual representa una gran carga de trabajo.

(3) Hibernate tiene sólidas capacidades de mapeo de objetos/relacionales y una buena independencia de la base de datos. Para software con altos requisitos en modelos relacionales, si usa hibernate para desarrollarlo, puede ahorrar una gran cantidad de código y mejorar la eficiencia.

Uso práctico

1. ¿Qué debo hacer cuando los nombres de los atributos en la clase de entidad son diferentes de los nombres de los campos en la tabla?

Mantenga los nombres de los campos y los nombres de los atributos de la clase de entidad consistentes a través del mapeo de resultMap

<resultMap id="sysUserInfoMap" type="com.niaobulashi.entity.SysUser">
    <!-- 用户Id属性来映射主键字段 userId-->
    <id property="id" column="userId"/>
    <!-- 用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性-->
    <result property="userNameStr" column="username"/>
</resultMap>
 
<!--用户Vo-->
<sql id="selectSysUserVo">
    SELECT
        u.user_id, u.username, u.password, u.salt, 
        u.email, u.mobile, u.status, u.dept_id, u.create_time
    FROM
        sys_user u
</sql>
 
<!-- 查询用户信息列表2 -->
<select id="queryUserList2" resultMap="sysUserInfoMap">
    <include refid="selectSysUserVo"/>
    where 1=1
</select>

2. Obtenga la clave principal de aumento automático de Mybatis

<!-- 获取自动生成的()键值,将insert操作后的主键值更新到的属性id上 -->
<insert id="insertSysTest" parameterType="com.niaobulashi.model.SysTest"
        useGeneratedKeys="true" keyProperty="id">
    INSERT INTO sys_test(name, age, nick_name) VALUES (#{name},#{age},#{nickName})
</insert>

3. Consulta difusa

El uso del método %"#{value}"%" provocará una inyección SQL

<!--用户Vo-->
<sql id="selectSysUserVo">
    SELECT
        u.user_id, u.username, u.password, u.salt, 
        u.email, u.mobile, u.status, u.dept_id, u.create_time
    FROM
        sys_user u
</sql>
 
<!-- 查询用户信息列表2 -->
<select id="queryUserListByName" parameterType="String" resultMap="sysUserInfoMap">
    <include refid="selectSysUserVo"/>
    where 1=1
    and u.username like concat('%',#{userName},'%')
</select>

4. Consulta de múltiples condiciones

1. Utilice @Param

List<SysUser> queryUserByNameAndEmail(@Param("userName") String userName, @Param("email") String email);
<!--使用用户名和邮箱查询用户信息-->
<select id="queryUserByNameAndEmail" resultMap="sysUserInfoMap">
    <include refid="selectSysUserVo"/>
    <where>
        <if test="userName != null and userName != ''">
            AND u.username like concat('%',#{userName},'%')
        </if>
        <if test="email != null and email != ''">
            AND u.email like concat('%',#{email},'%')
        </if>
    </where>
</select>

2. Utilice JavaBean:
aquí se muestran algunas condiciones de consulta comunes: fecha, monto.

List<SysUser> queryUserByUser(SysUser sysUser);
<select id="queryUserByUser" parameterType="com.niaobulashi.model.SysUser" resultMap="sysUserInfoMap">
    <include refid="selectSysUserVo"/>
    <where>
        1=1
        <if test="userNameStr != null and userNameStr != ''">
            AND u.username like concat('%', #{userNameStr}, '%')
        </if>
        <if test="email != null and email != ''">
            AND u.email like concat('%', #{email}, '%')
        </if>
        <if test="mobile != null and mobile != ''">
            AND u.mobile like concat('%', #{mobile}, '%')
        </if>
        <if test="createDateStart != null and createDateStart != ''">/*开始时间检索*/
            AND date_format(u.create_time, '%y%m%d') <![CDATA[ >= ]]> date_format(#{createDateStart}, '%y%m%d')
        </if>
        <if test="createDateEnd != null and createDateEnd != ''">/*结束时间检索*/
            AND date_format(u.create_time, '%y%m%d') <![CDATA[ <= ]]> date_format(#{createDateEnd}, '%y%m%d')
        </if>
        <if test="amtFrom != null and amtFrom != ''">/*起始金额*/
            AND u.amt <![CDATA[ >= ]]> #{amtFrom}
        </if>
        <if test="amtTo != null and amtTo != ''">/*截至金额*/
            AND u.amt <![CDATA[ <= ]]> #{amtTo}
        </if>
    </where>
</select>

5. Eliminar foreach en lotes

<delete id="deleteSysTestByIds" parameterType="String">
    delete from sys_test where id in
    <foreach collection="array" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

Entre ellos, foreach contiene explicación de atributos:

abierto: la cadena al comienzo de todo el contenido del bucle.
cerrar: la cadena al final de todo el contenido del bucle.
separador: separador para cada bucle.
elemento: cada valor extraído del objeto iterable.
Índice: si el parámetro es una colección o matriz, este valor es el valor del índice actual. Si el parámetro es un tipo de mapa, este valor es la clave del mapa.
colección: el nombre de la propiedad sobre la que se va a iterar.

6. Agregue en lotes

<!--批量新增-->
  <insert id="addBatchBooks" parameterType="com.zking.mybatis01.vo.BookVo">
    insert into t_book (bookname,price,booktype,bookimage)
    <!--
     1.collection:配遍历的集合
     2.open:开始位置
     3.close:结束位置
     4.separator:分符号
     5.item:遍历的子项
     6.index:索引
    这个也是一种方式也可以用:
     foreach(int i in lst)
      <foreach collection="books" item="b" open=" values(" close=")" separator="),(">
      #{b.bookname},#{b.price},#{b.booktype},#{b.bookimage}
    </foreach>
   -->
    <foreach collection="books" item="b" open=" values" separator="," >
      (#{b.bookname},#{b.price},#{b.booktype},#{b.bookimage})
    </foreach>
  </insert>

7. Actualización por lotes

 <!--批量更新-->
  <update id="updateBatchBookS" parameterType="com.zking.mybatis01.vo.BookVo">
    <foreach collection="books" item="b" separator=";">
      update t_book
      <set >
        <if test="b.bookname != null" >
          bookname = #{b.bookname},
        </if>
        <if test="b.price != null" >
          price = #{b.price},
        </if>
        <if test="b.booktype != null" >
          booktype = #{b.booktype},
        </if>
        <if test="b.bookimage != null" >
          bookimage = #{b.bookimage},
        </if>
      </set>
      where id = #{b.id}
    </foreach>
  </update>

8. Asociación y recopilación de consultas de varias tablas.

Consulta de varias tablas, las tablas múltiples primero deben aclarar dos palabras clave:
asociación: asociación uno a uno (tiene una); colección: asociación uno a muchos (tiene muchas) propiedad
de asociación y colección
: campos o campos que asignan la base de datos Atributos de columnas.
columna: nombre de la columna de la base de datos o alias de etiqueta de la columna.
javaTyp: nombre o alias completo de la clase java.
jdbcType: el tipo de JDBC que figura en la lista de tipos de JDBC admitidos. Este atributo solo es útil para columnas que permiten valores nulos durante la inserción, actualización o eliminación.
resultMap: un ResultMap que asigna conjuntos de resultados anidados de unión a una vista de objeto adecuada. Esta es una forma alternativa de llamar a otra declaración selecta.

<!--查看用户部门和角色信息-->
<select id="queryUserRoleDept" parameterType="com.niaobulashi.model.SysUser" resultMap="UserResult">
    select u.user_id, u.username, u.dept_id, d.dept_name, r.role_id, r.role_name
    from sys_user u
    LEFT JOIN sys_dept d on d.dept_id = u.dept_id
    LEFT JOIN sys_user_role ur on ur.user_id = u.user_id
    LEFT JOIN sys_role r on r.role_id = ur.role_id
    WHERE 1=1
    <if test="userId != null and userId != ''">
        AND u.user_id = #{userId}
    </if>
</select>
<!--用户表-->
<resultMap type="com.niaobulashi.model.SysUser" id="UserResult">
    <id property="userId" column="user_id"/>
    <result property="userNameStr" column="username"/>
    <result property="password" column="login_name"/>
    <result property="salt" column="password"/>
    <result property="email" column="email"/>
    <result property="mobile" column="mobile"/>
    <result property="status" column="status"/>
    <result property="deptId" column="dept_id"/>
    <result property="createTime" column="create_time"/>
    <association property="dept" column="dept_id" javaType="com.niaobulashi.model.SysDept" resultMap="DeptResult"/>
    <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
</resultMap>
 
<!--部门表-->
<resultMap id="DeptResult" type="com.niaobulashi.model.SysDept">
    <id property="deptId" column="dept_id"/>
    <result property="deptName" column="dept_name"/>
</resultMap>
 
<!--角色表-->
<resultMap id="RoleResult" type="com.niaobulashi.model.SysRole">
    <id property="roleId" column="role_id"/>
    <result property="roleName" column="role_name"/>
</resultMap>

1. Consulta de conexión de varias tablas: explicación detallada de resultMap en el archivo de mapeo

Insertar descripción de la imagen aquí

2. Consulta separada de varias tablas:

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_49353216/article/details/108872823
Recomendado
Clasificación