首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

MyBatis学习 之 三、动态SQL语句

2023-11-10 来源:花图问答
  
  • <insert id="createStudentAutoKey" parameterType="liming.student.manager.data.model.StudentEntity" keyProperty="studentId">  
  •     <selectKey keyProperty="studentId" resultType="String" order="BEFORE">  
  •         select nextval(‘student‘)  
  •     </selectKey>  
  •     INSERT INTO STUDENT_TBL(STUDENT_ID,  
  •                             STUDENT_NAME,  
  •                             STUDENT_SEX,  
  •                             STUDENT_BIRTHDAY,  
  •                             STUDENT_PHOTO,  
  •                             CLASS_ID,  
  •                             PLACE_ID)  
  •     VALUES (#{studentId},  
  •             #{studentName},  
  •             #{studentSex},  
  •             #{studentBirthday},  
  •             #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},  
  •             #{classId},  
  •             #{placeId})  
  • </insert>  
  •  

     

     

    调用接口方法,和获取自动生成key

    Java代码  技术分享
    1. StudentEntity entity = new StudentEntity();  
    2. entity.setStudentName("黎明你好");  
    3. entity.setStudentSex(1);  
    4. entity.setStudentBirthday(DateUtil.parse("1985-05-28"));  
    5. entity.setClassId("20000001");  
    6. entity.setPlaceId("70000001");  
    7. this.dynamicSqlMapper.createStudentAutoKey(entity);  
    8. System.out.println("新增学生ID: " + entity.getStudentId());  

     

     

    selectKey语句属性配置细节:

     

    属性描述取值
    keyPropertyselectKey 语句生成结果需要设置的属性。
    resultType生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int类型。
    order

    1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert语句;

    2:AFTER,就先运行insert 语句再运行selectKey 语句。

    BEFORE

    AFTER
    statementTypeMyBatis 支持STATEMENT,PREPARED和CALLABLE 的语句形式, 对应Statement ,PreparedStatement 和CallableStatement 响应

    STATEMENT

    PREPARED

    CALLABLE

     

    3.2 if标签

     

     if标签可用在许多类型的sql语句中,我们以查询为例。首先看一个很普通的查询:

    Xml代码  技术分享
    1. <!-- 查询学生list,like姓名 -->  
    2. <select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap">  
    3.     SELECT * from STUDENT_TBL ST   
    4. WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName}),‘%‘)  
    5. </select>  

     

     

    但是此时如果studentName或studentSex为null,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性。

    参数为实体类StudentEntity。将实体类中所有的属性均进行判断,如果不为空则执行判断条件。

    Xml代码  技术分享
    1. <!-- 2 if(判断参数) - 将实体类不为空的属性作为where条件 -->  
    2. <select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">  
    3.     SELECT ST.STUDENT_ID,  
    4.            ST.STUDENT_NAME,  
    5.            ST.STUDENT_SEX,  
    6.            ST.STUDENT_BIRTHDAY,  
    7.            ST.STUDENT_PHOTO,  
    8.            ST.CLASS_ID,  
    9.            ST.PLACE_ID  
    10.       FROM STUDENT_TBL ST   
    11.      WHERE  
    12.     <if test="studentName !=null ">  
    13.         ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName, jdbcType=VARCHAR}),‘%‘)  
    14.     </if>  
    15.     <if test="studentSex != null and studentSex != ‘‘ ">  
    16.         AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
    17.     </if>  
    18.     <if test="studentBirthday != null ">  
    19.         AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
    20.     </if>  
    21.     <if test="classId != null and classId!= ‘‘ ">  
    22.         AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}  
    23.     </if>  
    24.     <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=‘ ‘ ">  
    25.         AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}  
    26.     </if>  
    27.     <if test="placeId != null and placeId != ‘‘ ">  
    28.         AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}  
    29.     </if>  
    30.     <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != ‘‘ ">  
    31.         AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}  
    32.     </if>  
    33.     <if test="studentId != null and studentId != ‘‘ ">  
    34.         AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}  
    35.     </if>   
    36. </select>  
     

     

     

    使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。

    Java代码  技术分享
    1. public void select_test_2_1() {  
    2.     StudentEntity entity = new StudentEntity();  
    3.     entity.setStudentName("");  
    4.     entity.setStudentSex(1);  
    5.     entity.setStudentBirthday(DateUtil.parse("1985-05-28"));  
    6.     entity.setClassId("20000001");  
    7.     //entity.setPlaceId("70000001");  
    8.     List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity);  
    9.     for (StudentEntity e : list) {  
    10.         System.out.println(e.toString());  
    11.     }  
    12. }  
     

     

    3.3 if + where 的条件判断

           当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在3.1中的查询语句为例子,当java代码按如下方法调用时:

    Java代码  技术分享
    1. @Test  
    2. public void select_test_2_1() {  
    3.     StudentEntity entity = new StudentEntity();  
    4.     entity.setStudentName(null);  
    5.     entity.setStudentSex(1);  
    6.     List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity);  
    7.     for (StudentEntity e : list) {  
    8.         System.out.println(e.toString());  
    9.     }  
    10. }  

     

     

    如果上面例子,参数studentName为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHERE AND”关键字多余的错误SQL。

     

    这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

    上面例子修改为:

    Xml代码  技术分享
    1. <!-- 3 select - where/if(判断参数) - 将实体类不为空的属性作为where条件 -->  
    2. <select id="getStudentList_whereIf" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">  
    3.     SELECT ST.STUDENT_ID,  
    4.            ST.STUDENT_NAME,  
    5.            ST.STUDENT_SEX,  
    6.            ST.STUDENT_BIRTHDAY,  
    7.            ST.STUDENT_PHOTO,  
    8.            ST.CLASS_ID,  
    9.            ST.PLACE_ID  
    10.       FROM STUDENT_TBL ST   
    11.     <where>  
    12.         <if test="studentName !=null ">  
    13.             ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName, jdbcType=VARCHAR}),‘%‘)  
    14.         </if>  
    15.         <if test="studentSex != null and studentSex != ‘‘ ">  
    16.             AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
    17.         </if>  
    18.         <if test="studentBirthday != null ">  
    19.             AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
    20.         </if>  
    21.         <if test="classId != null and classId!= ‘‘ ">  
    22.             AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}  
    23.         </if>  
    24.         <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=‘ ‘ ">  
    25.             AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}  
    26.         </if>  
    27.         <if test="placeId != null and placeId != ‘‘ ">  
    28.             AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}  
    29.         </if>  
    30.         <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != ‘‘ ">  
    31.             AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}  
    32.         </if>  
    33.         <if test="studentId != null and studentId != ‘‘ ">  
    34.             AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}  
    35.         </if>  
    36.     </where>    
    37. </select>  
     

     

     

    3.4 if + set 的更新语句

    当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。

    当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。

     

           使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:

    Xml代码  技术分享
    1. <!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 -->  
    2. <update id="updateStudent_if_set" parameterType="liming.student.manager.data.model.StudentEntity">  
    3.     UPDATE STUDENT_TBL  
    4.     <set>  
    5.         <if test="studentName != null and studentName != ‘‘ ">  
    6.             STUDENT_TBL.STUDENT_NAME = #{studentName},  
    7.         </if>  
    8.         <if test="studentSex != null and studentSex != ‘‘ ">  
    9.             STUDENT_TBL.STUDENT_SEX = #{studentSex},  
    10.         </if>  
    11.         <if test="studentBirthday != null ">  
    12.             STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
    13.         </if>  
    14.         <if test="studentPhoto != null ">  
    15.             STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},  
    16.         </if>  
    17.         <if test="classId != ‘‘ ">  
    18.             STUDENT_TBL.CLASS_ID = #{classId}  
    19.         </if>  
    20.         <if test="placeId != ‘‘ ">  
    21.             STUDENT_TBL.PLACE_ID = #{placeId}  
    22.         </if>  
    23.     </set>  
    24.     WHERE STUDENT_TBL.STUDENT_ID = #{studentId};      
    25. </update>  

     

     

     

    3.5 if + trim代替where/set标签

           trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

     

    3.5.1trim代替where

     

    Xml代码  技术分享
    1. <!-- 5.1 if/trim代替where(判断参数) - 将实体类不为空的属性作为where条件 -->  
    2. <select id="getStudentList_if_trim" resultMap="resultMap_studentEntity">  
    3.     SELECT ST.STUDENT_ID,  
    4.            ST.STUDENT_NAME,  
    5.            ST.STUDENT_SEX,  
    6.            ST.STUDENT_BIRTHDAY,  
    7.            ST.STUDENT_PHOTO,  
    8.            ST.CLASS_ID,  
    9.            ST.PLACE_ID  
    10.       FROM STUDENT_TBL ST   
    11.     <trim prefix="WHERE" prefixOverrides="AND|OR">  
    12.         <if test="studentName !=null ">  
    13.             ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName, jdbcType=VARCHAR}),‘%‘)  
    14.         </if>  
    15.         <if test="studentSex != null and studentSex != ‘‘ ">  
    16.             AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
    17.         </if>  
    18.         <if test="studentBirthday != null ">  
    19.             AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
    20.         </if>  
    21.         <if test="classId != null and classId!= ‘‘ ">  
    22.             AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}  
    23.         </if>  
    24.         <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=‘ ‘ ">  
    25.             AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}  
    26.         </if>  
    27.         <if test="placeId != null and placeId != ‘‘ ">  
    28.             AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}  
    29.         </if>  
    30.         <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != ‘‘ ">  
    31.             AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}  
    32.         </if>  
    33.         <if test="studentId != null and studentId != ‘‘ ">  
    34.             AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}  
    35.         </if>  
    36.     </trim>     
    37. </select>  
     

     

    3.5.2 trim代替set

     

    Xml代码  技术分享
    1. <!-- 5.2 if/trim代替set(判断参数) - 将实体类不为空的属性更新 -->  
    2. <update id="updateStudent_if_trim" parameterType="liming.student.manager.data.model.StudentEntity">  
    3.     UPDATE STUDENT_TBL  
    4.     <trim prefix="SET" suffixOverrides=",">  
    5.         <if test="studentName != null and studentName != ‘‘ ">  
    6.             STUDENT_TBL.STUDENT_NAME = #{studentName},  
    7.         </if>  
    8.         <if test="studentSex != null and studentSex != ‘‘ ">  
    9.             STUDENT_TBL.STUDENT_SEX = #{studentSex},  
    10.         </if>  
    11.         <if test="studentBirthday != null ">  
    12.             STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
    13.         </if>  
    14.         <if test="studentPhoto != null ">  
    15.             STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},  
    16.         </if>  
    17.         <if test="classId != ‘‘ ">  
    18.             STUDENT_TBL.CLASS_ID = #{classId},  
    19.         </if>  
    20.         <if test="placeId != ‘‘ ">  
    21.             STUDENT_TBL.PLACE_ID = #{placeId}  
    22.         </if>  
    23.     </trim>  
    24.     WHERE STUDENT_TBL.STUDENT_ID = #{studentId}  
    25. </update>  
     

     

     

    3.6 choose (when, otherwise)

     

        有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。MyBatis提供了choose 元素。if标签是与(and)的关系,而choose比傲天是或(or)的关系。

        choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。

        例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。

    Xml代码  技术分享
    1. <!-- 6 choose(判断参数) - 按顺序将实体类第一个不为空的属性作为where条件 -->  
    2. <select id="getStudentList_choose" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">  
    3.     SELECT ST.STUDENT_ID,  
    4.            ST.STUDENT_NAME,  
    5.            ST.STUDENT_SEX,  
    6.            ST.STUDENT_BIRTHDAY,  
    7.            ST.STUDENT_PHOTO,  
    8.            ST.CLASS_ID,  
    9.            ST.PLACE_ID  
    10.       FROM STUDENT_TBL ST   
    11.     <where>  
    12.         <choose>  
    13.             <when test="studentName !=null ">  
    14.                 ST.STUDENT_NAME LIKE CONCAT(CONCAT(‘%‘, #{studentName, jdbcType=VARCHAR}),‘%‘)  
    15.             </when >  
    16.             <when test="studentSex != null and studentSex != ‘‘ ">  
    17.                 AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
    18.             </when >  
    19.             <when test="studentBirthday != null ">  
    20.                 AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
    21.             </when >  
    22.             <when test="classId != null and classId!= ‘‘ ">  
    23.                 AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}  
    24.             </when >  
    25.             <when test="classEntity != null and classEntity.classId !=null and classEntity.classId

      小编还为您整理了以下内容,可能对您也有帮助:

      mybatis怎么实现动态sql语句

      MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
      MyBatis中用于实现动态SQL的元素主要有:

      if
      choose(when,otherwise)
      trim
      where
      set
      foreach

      mybatis怎么实现动态sql语句

      MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
      MyBatis中用于实现动态SQL的元素主要有:

      if
      choose(when,otherwise)
      trim
      where
      set
      foreach

      如何MyBatis中使用动态SQL查询与注释

      如何MyBatis中使用动态SQL查询与注释
      静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。静态SQL在编译时已经确定了引用的表和列。 宿主变量不改变表和列信息。 可以使用主变量改变查询参数值, 但是不能用主变量代替表名或列名。
      动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,不在编译时确定 SQL 的表和列,而是让程序在运行时提供,并将SQL 语句文本传给 DBMS 执行。 静态 SQL 语句在编译时已经生成执行计划。 而动态 SQL 语句,只有在执行时才产生执行计划。动态 SQL 语句首先执行 PREPARE 语句要求 DBMS 分析、确认和优化语句,并为其生成执行计划。例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

      如何MyBatis中使用动态SQL查询与注释

      如何MyBatis中使用动态SQL查询与注释
      静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。静态SQL在编译时已经确定了引用的表和列。 宿主变量不改变表和列信息。 可以使用主变量改变查询参数值, 但是不能用主变量代替表名或列名。
      动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,不在编译时确定 SQL 的表和列,而是让程序在运行时提供,并将SQL 语句文本传给 DBMS 执行。 静态 SQL 语句在编译时已经生成执行计划。 而动态 SQL 语句,只有在执行时才产生执行计划。动态 SQL 语句首先执行 PREPARE 语句要求 DBMS 分析、确认和优化语句,并为其生成执行计划。例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

      MyBatis 动态sql?

      “mybatis是java的后端框架,主要进行数据库的连接,mybatis通过OGNL进行动态SQL的使用,动态SQL支持if、choose、where、foreach等标签,可以动态判断生产SQL语句实现功能。”

      MyBatis 动态sql?

      “mybatis是java的后端框架,主要进行数据库的连接,mybatis通过OGNL进行动态SQL的使用,动态SQL支持if、choose、where、foreach等标签,可以动态判断生产SQL语句实现功能。”

      mybatis中动态sql执行原理

      解释器模式: 初始化过程中构建出抽象语法树,请求处理时根据参数对象解释语法树,生成sql语句。
      工厂模式: 为动态标签的处理方式创建工厂类(SqlTagHandlerFactory),根据标签名称获取对应的处理方式。
      策略模式: 将动态标签处理方式抽象为接口,针对不同标签有相应的实现类。解释抽象语法树时,定义统一的解释流程,再调用标签对应的处理方式完成解释中的各个子环节

      mybatis中动态sql执行原理

      解释器模式: 初始化过程中构建出抽象语法树,请求处理时根据参数对象解释语法树,生成sql语句。
      工厂模式: 为动态标签的处理方式创建工厂类(SqlTagHandlerFactory),根据标签名称获取对应的处理方式。
      策略模式: 将动态标签处理方式抽象为接口,针对不同标签有相应的实现类。解释抽象语法树时,定义统一的解释流程,再调用标签对应的处理方式完成解释中的各个子环节

      mybatis 动态sql语句怎么写if else

      and c.id=#{id}

      and b.id=#{oid}

      and a.pay_time BETWEEN #{startDate} AND #{endDate}

      service层参数nullmybatis执行sql语句候拼接指定if标签sql语句

      mybatis 动态sql语句怎么写if else

      and c.id=#{id}

      and b.id=#{oid}

      and a.pay_time BETWEEN #{startDate} AND #{endDate}

      service层参数nullmybatis执行sql语句候拼接指定if标签sql语句

      mybatis怎么写sql语句

      mybatis的sql和你在数据库客户端执行的sql是一样的,但是在mybatis中调用的sql一般都是动态的,所以用到了参数传递。这个mybatis有对应的标签以及相应的变量来实现。你可以搜索下mybatis标签。同时给你一个参考的你看看,这个是一个查询用户的

      <select id="queryUsers" parameterType="map" resultType="xx.xx.xx.bean.UserBean">

          <![CDATA[

      select 

        ID,

      LOGIN_NAME AS loginName,

      PASSWORD,

      REAL_NAME AS realName,

      POSITION,

      (SELECT D.POSITION_NAME FROM UNIT_POSITION D WHERE D.POSITION_CODE=T.POSITION) POSITIONNAME,

      USER_TYPE AS userType,

      SEX,

      PID,

      TO_CHAR(T.BIRTHDAY,'YYYY-MM-DD') BIRTHDAY,

      EMAIL,

      CONTACT_TEL AS contactTel,

      CONTACT_MOBILE AS contactMobile,

      CONTACT_FAX AS contactFax,

      CONTACT_ZIP AS contactZip,

      CONTACT_ADDR AS contactAddr,

      STATUS,

      EDUCATION,

      (SELECT D.EDUCATION_NAME FROM UNIT_EDUCATION D WHERE D.EDUCATION_CODE=T.EDUCATION AND D.STATUS=0) EDUCATIONNAME,

      NATION,

      POLITICAL,

      REMARK,

      TO_CHAR(T.CREATE_DATE,'YYYY-MM-DD HH24:MI:SS') createDate,

      (SELECT D.REAL_NAME FROM UNIT_USER D WHERE D.ID= T.CREATE_USER_ID) createUserId,

      TO_CHAR(T.UPDATE_DATE,'YYYY-MM-DD HH24:MI:SS') updateDate,

      (SELECT D.REAL_NAME FROM UNIT_USER D WHERE D.ID= T.UPDATE_USER_ID) updateUserId

       from UNIT_USER T

      ]]>

      <where>

      T.STATUS='1'

      <if test="realName !=null and realName !=''">

      and T.REAL_NAME like '%${realName}%'

      </if>

      <if test="nexusDpartment !=null">

      AND T.ID IN (SELECT DISTINCT D.USER_ID FROM UNIT_USER_DEPT D WHERE D.DEPT_CODE IN (${nexusDpartment}))

      </if>

      <if test="deptCode !=null and deptCode !=''">

      AND T.ID IN (SELECT DISTINCT D.USER_ID FROM UNIT_USER_DEPT D WHERE D.DEPT_CODE = #{deptCode})

      </if>

      </where>

      <if test="sort != null and sort != ''"> 

      order by ${sort} 

      <if test="direction != null and direction != ''">

      ${direction}

      </if>

      </if>

      </select>

      6.mybatis里面的动态sql是怎么设定的,常用标签有那些以及其

      1、动态SQL片段
      通过SQL片段达到代码复用
      <!-- 动态条件分页查询 -->
      <sql id="sql_count">
      select count(*)
      </sql>
      <sql id="sql_select">
      select *
      </sql>
      <sql id="sql_where">
      from icp
      <dynamic prepend="where">
      <isNotEmpty prepend="and" property="name">
      name like '%$name$%'
      </isNotEmpty>
      <isNotEmpty prepend="and" property="path">
      path like '%path$%'
      </isNotEmpty>
      <isNotEmpty prepend="and" property="area_id">
      area_id = #area_id#
      </isNotEmpty>
      <isNotEmpty prepend="and" property="hided">
      hided = #hided#
      </isNotEmpty>
      </dynamic>
      <dynamic prepend="">
      <isNotNull property="_start">
      <isNotNull property="_size">
      limit #_start#, #_size#
      </isNotNull>
      </isNotNull>
      </dynamic>
      </sql>
      <select id="findByParamsForCount" parameterClass="map" resultClass="int">
      <include refid="sql_count"/>
      <include refid="sql_where"/>
      </select>
      <select id="findByParams" parameterClass="map" resultMap="icp.result_base">
      <include refid="sql_select"/>
      <include refid="sql_where"/>
      </select>

      2、数字范围查询
      所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
      <isNotEmpty prepend="and" property="_img_size_ge">
      <![CDATA[
      img_size >= #_img_size_ge#
      ]]>
      </isNotEmpty>
      <isNotEmpty prepend="and" property="_img_size_lt">
      <![CDATA[
      img_size < #_img_size_lt#
      ]]>
      </isNotEmpty>

      多次使用一个参数也是允许的
      <isNotEmpty prepend="and" property="_now">
      <![CDATA[
      execplantime >= #_now#
      ]]>
      </isNotEmpty>
      <isNotEmpty prepend="and" property="_now">
      <![CDATA[
      closeplantime <= #_now#
      ]]>
      </isNotEmpty>

      3、时间范围查询
      <isNotEmpty prepend="" property="_starttime">
      <isNotEmpty prepend="and" property="_endtime">
      <![CDATA[
      createtime >= #_starttime#
      and createtime < #_endtime#
      ]]>
      </isNotEmpty>
      </isNotEmpty>

      6.mybatis里面的动态sql是怎么设定的,常用标签有那些以及其

      1、动态SQL片段
      通过SQL片段达到代码复用
      <!-- 动态条件分页查询 -->
      <sql id="sql_count">
      select count(*)
      </sql>
      <sql id="sql_select">
      select *
      </sql>
      <sql id="sql_where">
      from icp
      <dynamic prepend="where">
      <isNotEmpty prepend="and" property="name">
      name like '%$name$%'
      </isNotEmpty>
      <isNotEmpty prepend="and" property="path">
      path like '%path$%'
      </isNotEmpty>
      <isNotEmpty prepend="and" property="area_id">
      area_id = #area_id#
      </isNotEmpty>
      <isNotEmpty prepend="and" property="hided">
      hided = #hided#
      </isNotEmpty>
      </dynamic>
      <dynamic prepend="">
      <isNotNull property="_start">
      <isNotNull property="_size">
      limit #_start#, #_size#
      </isNotNull>
      </isNotNull>
      </dynamic>
      </sql>
      <select id="findByParamsForCount" parameterClass="map" resultClass="int">
      <include refid="sql_count"/>
      <include refid="sql_where"/>
      </select>
      <select id="findByParams" parameterClass="map" resultMap="icp.result_base">
      <include refid="sql_select"/>
      <include refid="sql_where"/>
      </select>

      2、数字范围查询
      所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段
      <isNotEmpty prepend="and" property="_img_size_ge">
      <![CDATA[
      img_size >= #_img_size_ge#
      ]]>
      </isNotEmpty>
      <isNotEmpty prepend="and" property="_img_size_lt">
      <![CDATA[
      img_size < #_img_size_lt#
      ]]>
      </isNotEmpty>

      多次使用一个参数也是允许的
      <isNotEmpty prepend="and" property="_now">
      <![CDATA[
      execplantime >= #_now#
      ]]>
      </isNotEmpty>
      <isNotEmpty prepend="and" property="_now">
      <![CDATA[
      closeplantime <= #_now#
      ]]>
      </isNotEmpty>

      3、时间范围查询
      <isNotEmpty prepend="" property="_starttime">
      <isNotEmpty prepend="and" property="_endtime">
      <![CDATA[
      createtime >= #_starttime#
      and createtime < #_endtime#
      ]]>
      </isNotEmpty>
      </isNotEmpty>

      Mybatis动态sql及性能优化

      内容

      一.回顾

      二.动态Sql

      1.解决什么样问题

      2.常用动态sql标签

      2.1 if标签

      2.2 where标签

      2.3 choose when otherwise

      2.4 Set标签

      2.5 foreach标签

      2.6 trim标签

      三.性能优化

      1.懒加载机制(lazy)

      2.步骤

      Model类

      UserMapper接口

      UserMapper.xml

      OrdersMapper接口

      OrdersMapper.xml

      UserService类

      Test类

      3.一级缓存

      3.1缓存概念

      3.2 mybatis的一级缓存

      3.3缓存测试

      UserMapper.xml

      UserMapper接口

      UserService类

      作业

      mybatis存储过程 不确定结果集如何配置XML,

      MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
      MyBatis学习 之 二、SQL语句映射文件(1)resultMap
      MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
      MyBatis学习 之 三、动态SQL语句
      MyBatis学习 之 四、MyBatis配置文件

      在定义sqlSessionFactory时需要指定MyBatis主配置文件:

      Xml代码 收藏代码
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="configLocation" value="classpath:mybatis-config.xml" />
      <property name="dataSource" ref="dataSource" />
      </bean>

      MyBatis配置文件中大标签configuration下子标签包括:
      configuration
      |--- properties
      |--- settings
      |--- typeAliases
      |--- typeHandlers
      |--- objectFactory
      |--- plugins
      |--- environments
      |--- |--- environment
      |--- |--- |--- transactionManager
      |--- |--- |__ dataSource
      |__ mappers

      4.1 properties属性

      properties和java的.properties的配置文件有关。配置properties的resource指定.properties的路径,然后再在properties标签下配置property的name和value,则可以替换.properties文件中相应属性值。

      Xml代码 收藏代码
      <!-- 属性替换 -->
      <properties resource="mysql.properties">
      <property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>
      <property name="username" value="root"/>
      <property name="password" value="limingnihao"/>
      </properties>

      4.2 settings设置

      这是MyBatis 修改操作运行过程细节的重要的步骤。下方这个表格描述了这些设置项、含义和默认值。

      设置项
      描述
      允许值
      默认值
      cacheEnabled
      对在此配置文件下的所有cache 进行全局性开/关设置。
      true | false
      true
      lazyLoadingEnabled
      全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。
      true | false
      true
      aggressiveLazyLoading
      当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
      true | false
      true
      multipleResultSetsEnabled
      允许和不允许单条语句返回多个数据集(取决于驱动需求)
      true | false
      true
      useColumnLabel
      使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。
      true | false
      true
      useGeneratedKeys
      允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。
      true | false
      false
      autoMappingBehavior
      指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。
      NONE,
      PARTIAL,
      FULL
      PARTIAL
      defaultExecutorType
      配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。
      SIMPLE
      REUSE
      BATCH
      SIMPLE
      defaultStatementTimeout
      设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时
      正整数
      Not Set
      (null)

      例如:

      Xml代码 收藏代码
      <settings>
      <setting name="cacheEnabled" value="true" />
      <setting name="lazyLoadingEnabled" value="true" />
      <setting name="multipleResultSetsEnabled" value="true" />
      <setting name="useColumnLabel" value="true" />
      <setting name="useGeneratedKeys" value="false" />
      <setting name="enhancementEnabled" value="false" />
      <setting name="defaultExecutorType" value="SIMPLE" />
      </settings>

      4.3 typeAliases类型别名

      类型别名是Java 类型的简称。
      它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。例如:

      Xml代码 收藏代码
      <typeAliases>
      <typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
      <typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
      <typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
      </typeAliases>

      使用这个配置,“StudentEntity”就能在任何地方代替“com.manager.data.model.StudentEntity”被使用。

      对于普通的Java类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。

      别名
      映射的类型
      _byte
      byte
      _long
      long
      _short
      short
      _int
      int
      _integer
      int
      _double
      double
      _float
      float
      _boolean
      boolean
      string
      String
      byte
      Byte
      long
      Long
      short
      Short
      int
      Integer
      integer
      Integer
      double
      Double
      float
      Float
      boolean
      Boolean
      date
      Date
      decimal
      BigDecimal
      bigdecimal
      BigDecimal
      object
      Object
      map
      Map
      hashmap
      HashMap
      list
      List
      arraylist
      ArrayList
      collection
      Collection
      iterator
      Iterator

      4.4 typeHandlers类型句柄

      无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。下面这个表格描述了默认的类型处理器。

      类型处理器
      Java类型
      JDBC类型
      BooleanTypeHandler
      Boolean,boolean
      任何兼容的布尔值
      ByteTypeHandler
      Byte,byte
      任何兼容的数字或字节类型
      ShortTypeHandler
      Short,short
      任何兼容的数字或短整型
      IntegerTypeHandler
      Integer,int
      任何兼容的数字和整型
      LongTypeHandler
      Long,long
      任何兼容的数字或长整型
      FloatTypeHandler
      Float,float
      任何兼容的数字或单精度浮点型
      DoubleTypeHandler
      Double,double
      任何兼容的数字或双精度浮点型
      BigDecimalTypeHandler
      BigDecimal
      任何兼容的数字或十进制小数类型
      StringTypeHandler
      String
      CHAR和VARCHAR类型
      ClobTypeHandler
      String
      CLOB和LONGVARCHAR类型
      NStringTypeHandler
      String
      NVARCHAR和NCHAR类型
      NClobTypeHandler
      String
      NCLOB类型
      ByteArrayTypeHandler
      byte[]
      任何兼容的字节流类型
      BlobTypeHandler
      byte[]
      BLOB和LONGVARBINARY类型
      DateTypeHandler
      Date(java.util)
      TIMESTAMP类型
      DateOnlyTypeHandler
      Date(java.util)
      DATE类型
      TimeOnlyTypeHandler
      Date(java.util)
      TIME类型
      SqlTimestampTypeHandler
      Timestamp(java.sql)
      TIMESTAMP类型
      SqlDateTypeHandler
      Date(java.sql)
      DATE类型
      SqlTimeTypeHandler
      Time(java.sql)
      TIME类型
      ObjectTypeHandler
      Any
      其他或未指定类型
      EnumTypeHandler
      Enumeration类型
      VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

      你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器。
      新定义的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。

      Java代码 收藏代码
      public class LimingStringTypeHandler implements TypeHandler {

      @Override
      public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
      System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);
      ps.setString(i, ((String) parameter));
      }

      @Override
      public Object getResult(ResultSet rs, String columnName) throws SQLException {
      System.out.println("getResult - columnName: " + columnName);
      return rs.getString(columnName);
      }

      @Override
      public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
      System.out.println("getResult - columnIndex: " + columnIndex);
      return cs.getString(columnIndex);
      }
      }

      在配置文件的typeHandlers中添加typeHandler标签。

      Xml代码 收藏代码
      <typeHandlers>
      <typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>
      </typeHandlers>

      mybatis存储过程 不确定结果集如何配置XML,

      MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
      MyBatis学习 之 二、SQL语句映射文件(1)resultMap
      MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
      MyBatis学习 之 三、动态SQL语句
      MyBatis学习 之 四、MyBatis配置文件

      在定义sqlSessionFactory时需要指定MyBatis主配置文件:

      Xml代码 收藏代码
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="configLocation" value="classpath:mybatis-config.xml" />
      <property name="dataSource" ref="dataSource" />
      </bean>

      MyBatis配置文件中大标签configuration下子标签包括:
      configuration
      |--- properties
      |--- settings
      |--- typeAliases
      |--- typeHandlers
      |--- objectFactory
      |--- plugins
      |--- environments
      |--- |--- environment
      |--- |--- |--- transactionManager
      |--- |--- |__ dataSource
      |__ mappers

      4.1 properties属性

      properties和java的.properties的配置文件有关。配置properties的resource指定.properties的路径,然后再在properties标签下配置property的name和value,则可以替换.properties文件中相应属性值。

      Xml代码 收藏代码
      <!-- 属性替换 -->
      <properties resource="mysql.properties">
      <property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>
      <property name="username" value="root"/>
      <property name="password" value="limingnihao"/>
      </properties>

      4.2 settings设置

      这是MyBatis 修改操作运行过程细节的重要的步骤。下方这个表格描述了这些设置项、含义和默认值。

      设置项
      描述
      允许值
      默认值
      cacheEnabled
      对在此配置文件下的所有cache 进行全局性开/关设置。
      true | false
      true
      lazyLoadingEnabled
      全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。
      true | false
      true
      aggressiveLazyLoading
      当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。
      true | false
      true
      multipleResultSetsEnabled
      允许和不允许单条语句返回多个数据集(取决于驱动需求)
      true | false
      true
      useColumnLabel
      使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下。
      true | false
      true
      useGeneratedKeys
      允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。
      true | false
      false
      autoMappingBehavior
      指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果。
      NONE,
      PARTIAL,
      FULL
      PARTIAL
      defaultExecutorType
      配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新。
      SIMPLE
      REUSE
      BATCH
      SIMPLE
      defaultStatementTimeout
      设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时
      正整数
      Not Set
      (null)

      例如:

      Xml代码 收藏代码
      <settings>
      <setting name="cacheEnabled" value="true" />
      <setting name="lazyLoadingEnabled" value="true" />
      <setting name="multipleResultSetsEnabled" value="true" />
      <setting name="useColumnLabel" value="true" />
      <setting name="useGeneratedKeys" value="false" />
      <setting name="enhancementEnabled" value="false" />
      <setting name="defaultExecutorType" value="SIMPLE" />
      </settings>

      4.3 typeAliases类型别名

      类型别名是Java 类型的简称。
      它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。例如:

      Xml代码 收藏代码
      <typeAliases>
      <typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
      <typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
      <typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
      </typeAliases>

      使用这个配置,“StudentEntity”就能在任何地方代替“com.manager.data.model.StudentEntity”被使用。

      对于普通的Java类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。

      别名
      映射的类型
      _byte
      byte
      _long
      long
      _short
      short
      _int
      int
      _integer
      int
      _double
      double
      _float
      float
      _boolean
      boolean
      string
      String
      byte
      Byte
      long
      Long
      short
      Short
      int
      Integer
      integer
      Integer
      double
      Double
      float
      Float
      boolean
      Boolean
      date
      Date
      decimal
      BigDecimal
      bigdecimal
      BigDecimal
      object
      Object
      map
      Map
      hashmap
      HashMap
      list
      List
      arraylist
      ArrayList
      collection
      Collection
      iterator
      Iterator

      4.4 typeHandlers类型句柄

      无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。下面这个表格描述了默认的类型处理器。

      类型处理器
      Java类型
      JDBC类型
      BooleanTypeHandler
      Boolean,boolean
      任何兼容的布尔值
      ByteTypeHandler
      Byte,byte
      任何兼容的数字或字节类型
      ShortTypeHandler
      Short,short
      任何兼容的数字或短整型
      IntegerTypeHandler
      Integer,int
      任何兼容的数字和整型
      LongTypeHandler
      Long,long
      任何兼容的数字或长整型
      FloatTypeHandler
      Float,float
      任何兼容的数字或单精度浮点型
      DoubleTypeHandler
      Double,double
      任何兼容的数字或双精度浮点型
      BigDecimalTypeHandler
      BigDecimal
      任何兼容的数字或十进制小数类型
      StringTypeHandler
      String
      CHAR和VARCHAR类型
      ClobTypeHandler
      String
      CLOB和LONGVARCHAR类型
      NStringTypeHandler
      String
      NVARCHAR和NCHAR类型
      NClobTypeHandler
      String
      NCLOB类型
      ByteArrayTypeHandler
      byte[]
      任何兼容的字节流类型
      BlobTypeHandler
      byte[]
      BLOB和LONGVARBINARY类型
      DateTypeHandler
      Date(java.util)
      TIMESTAMP类型
      DateOnlyTypeHandler
      Date(java.util)
      DATE类型
      TimeOnlyTypeHandler
      Date(java.util)
      TIME类型
      SqlTimestampTypeHandler
      Timestamp(java.sql)
      TIMESTAMP类型
      SqlDateTypeHandler
      Date(java.sql)
      DATE类型
      SqlTimeTypeHandler
      Time(java.sql)
      TIME类型
      ObjectTypeHandler
      Any
      其他或未指定类型
      EnumTypeHandler
      Enumeration类型
      VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

      你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器。
      新定义的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。

      Java代码 收藏代码
      public class LimingStringTypeHandler implements TypeHandler {

      @Override
      public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
      System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);
      ps.setString(i, ((String) parameter));
      }

      @Override
      public Object getResult(ResultSet rs, String columnName) throws SQLException {
      System.out.println("getResult - columnName: " + columnName);
      return rs.getString(columnName);
      }

      @Override
      public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
      System.out.println("getResult - columnIndex: " + columnIndex);
      return cs.getString(columnIndex);
      }
      }

      在配置文件的typeHandlers中添加typeHandler标签。

      Xml代码 收藏代码
      <typeHandlers>
      <typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>
      </typeHandlers>

      MyBatis中怎样使用反射获取SQL语句并进行操作?

      使用Java反射来获取MyBatis中的SQL语句并进行操作的需求并不常见。通常,MyBatis会处理SQL语句的执行和结果映射。然而,如果您确实有这样的需求,可以使用以下方法来实现。

      首先,您需要从MyBatis的映射器接口(Mapper接口)中获取SQL语句。这里我们假设您已经定义了一个映射器接口和相应的XML映射文件。例如,UserMapper接口和对应的UserMapper.xml文件。

        在MyBatis的配置文件(例如:mybatis-config.xml)中,启用映射器接口的mapperLocations属性,以便MyBatis可以找到XML映射文件:

        xml

        使用反射API,从映射器接口获取SQL语句。下面的示例代码展示了如何从UserMapper接口获取名为selectUser的SQL语句:

      import org.apache.ibatis.io.Resources;

      import org.apache.ibatis.session.SqlSessionFactory;

      import org.apache.ibatis.session.SqlSessionFactoryBuilder;

      import java.io.InputStream;

      public class MyBatisSqlReflectionDemo {

      public static void main(String[] args) throws Exception {

      String resource = "path/to/your/mybatis-config.xml";

      InputStream inputStream = Resources.getResourceAsStream(resource);

      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

      // 获取 UserMapper 映射器接口的代理实例

      UserMapper userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class);

      // 获取 UserMapper 中名为 selectUser 的方法

      Method selectUserMethod = UserMapper.class.getDeclaredMethod("selectUser", Integer.class);

      // 获取 selectUser 方法上的 @Select 注解

      Select selectAnnotation = selectUserMethod.getAnnotation(Select.class);

      // 获取 @Select 注解中的 SQL 语句

      String sql = selectAnnotation.value()[0];

      System.out.println("SQL 语句: " + sql);

      }

      }

      请注意,这个方法只适用于使用注解配置的MyBatis映射器。如果您使用XML映射文件,您需要解析XML文件并查找相应的SQL语句。

      获取SQL语句后,您可以根据需求对其进行操作。然而,直接操作SQL语句可能会导致一些问题,例如SQL注入、难以维护等。因此,请谨慎考虑是否确实需要这样做。

      通常情况下,我们不建议使用反射来操作MyBatis中的SQL语句。相反,您应该利用MyBatis的动态SQL功能或在映射器接口中定义多个方法来处理不同的需求。这样可以确保代码的可维护性和安全性。

      MyBatis中怎样使用反射获取SQL语句并进行操作?

      使用Java反射来获取MyBatis中的SQL语句并进行操作的需求并不常见。通常,MyBatis会处理SQL语句的执行和结果映射。然而,如果您确实有这样的需求,可以使用以下方法来实现。

      首先,您需要从MyBatis的映射器接口(Mapper接口)中获取SQL语句。这里我们假设您已经定义了一个映射器接口和相应的XML映射文件。例如,UserMapper接口和对应的UserMapper.xml文件。

        在MyBatis的配置文件(例如:mybatis-config.xml)中,启用映射器接口的mapperLocations属性,以便MyBatis可以找到XML映射文件:

        xml

        使用反射API,从映射器接口获取SQL语句。下面的示例代码展示了如何从UserMapper接口获取名为selectUser的SQL语句:

      import org.apache.ibatis.io.Resources;

      import org.apache.ibatis.session.SqlSessionFactory;

      import org.apache.ibatis.session.SqlSessionFactoryBuilder;

      import java.io.InputStream;

      public class MyBatisSqlReflectionDemo {

      public static void main(String[] args) throws Exception {

      String resource = "path/to/your/mybatis-config.xml";

      InputStream inputStream = Resources.getResourceAsStream(resource);

      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

      // 获取 UserMapper 映射器接口的代理实例

      UserMapper userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class);

      // 获取 UserMapper 中名为 selectUser 的方法

      Method selectUserMethod = UserMapper.class.getDeclaredMethod("selectUser", Integer.class);

      // 获取 selectUser 方法上的 @Select 注解

      Select selectAnnotation = selectUserMethod.getAnnotation(Select.class);

      // 获取 @Select 注解中的 SQL 语句

      String sql = selectAnnotation.value()[0];

      System.out.println("SQL 语句: " + sql);

      }

      }

      请注意,这个方法只适用于使用注解配置的MyBatis映射器。如果您使用XML映射文件,您需要解析XML文件并查找相应的SQL语句。

      获取SQL语句后,您可以根据需求对其进行操作。然而,直接操作SQL语句可能会导致一些问题,例如SQL注入、难以维护等。因此,请谨慎考虑是否确实需要这样做。

      通常情况下,我们不建议使用反射来操作MyBatis中的SQL语句。相反,您应该利用MyBatis的动态SQL功能或在映射器接口中定义多个方法来处理不同的需求。这样可以确保代码的可维护性和安全性。

    显示全文