zoukankan      html  css  js  c++  java
  • MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二、SQL语句映射文件(2)增删改查、参数、缓存

     

     2.2 select

    一个select 元素非常简单。例如:

    Xml代码  收藏代码
    1. <!-- 查询学生,根据id -->  
    2. <select id="getStudent" parameterType="String" resultMap="studentResultMap">  
    3.     SELECT ST.STUDENT_ID,  
    4.                ST.STUDENT_NAME,  
    5.                ST.STUDENT_SEX,  
    6.                ST.STUDENT_BIRTHDAY,  
    7.                ST.CLASS_ID  
    8.           FROM STUDENT_TBL ST  
    9.          WHERE ST.STUDENT_ID = #{studentID}  
    10. </select>  

     

    这条语句就叫做‘getStudent,有一个String参数,并返回一个StudentEntity类型的对象。
    注意参数的标识是:#{studentID}。

     

    select 语句属性配置细节: 

    属性描述取值默认
    id在这个模式下唯一的标识符,可被其它语句引用
    parameterType传给此语句的参数的完整类名或别名
    resultType语句返回值类型的整类名或别名。注意,如果是集合,那么这里填写的是集合的项的整类名或别名,而不是集合本身的类名。(resultType 与resultMap 不能并用)
    resultMap引用的外部resultMap 名。结果集映射是MyBatis 中最强大的特性。许多复杂的映射都可以轻松解决。(resultType 与resultMap 不能并用)
    flushCache如果设为true,则会在每次语句调用的时候就会清空缓存。select 语句默认设为falsetrue|falsefalse
    useCache如果设为true,则语句的结果集将被缓存。select 语句默认设为false true|false false
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
    true|falsefalse
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定正整数未设置
    fetchSize设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定正整数驱动器决定
    statementTypestatement,preparedstatement,callablestatement。
    预准备语句、可调用语句
    STATEMENT
    PREPARED
    CALLABLE
    PREPARED
    resultSetTypeforward_only,scroll_sensitive,scroll_insensitive
    只转发,滚动敏感,不区分大小写的滚动
    FORWARD_ONLY
    SCROLL_SENSITIVE
    SCROLL_INSENSITIVE
    驱动器决定


    2.3 insert

     一个简单的insert语句:

    Xml代码  收藏代码
    1. <!-- 插入学生 -->  
    2. <insert id="insertStudent" parameterType="StudentEntity">  
    3.         INSERT INTO STUDENT_TBL (STUDENT_ID,  
    4.                                           STUDENT_NAME,  
    5.                                           STUDENT_SEX,  
    6.                                           STUDENT_BIRTHDAY,  
    7.                                           CLASS_ID)  
    8.               VALUES   (#{studentID},  
    9.                           #{studentName},  
    10.                           #{studentSex},  
    11.                           #{studentBirthday},  
    12.                           #{classEntity.classID})  
    13. </insert>  

     

     insert可以使用数据库支持的自动生成主键策略,设置useGeneratedKeys=”true”,然后把keyProperty 设成对应的列,就搞定了。比如说上面的StudentEntity 使用auto-generated 为id 列生成主键.
     还可以使用selectKey元素。下面例子,使用mysql数据库nextval('student')为自定义函数,用来生成一个key。

    Xml代码  收藏代码
    1. <!-- 插入学生 自动主键-->  
    2. <insert id="insertStudentAutoKey" parameterType="StudentEntity">  
    3.     <selectKey keyProperty="studentID" resultType="String" order="BEFORE">  
    4.             select nextval('student')  
    5.     </selectKey>  
    6.         INSERT INTO STUDENT_TBL (STUDENT_ID,  
    7.                                  STUDENT_NAME,  
    8.                                  STUDENT_SEX,  
    9.                                  STUDENT_BIRTHDAY,  
    10.                                  CLASS_ID)  
    11.               VALUES   (#{studentID},  
    12.                         #{studentName},  
    13.                         #{studentSex},  
    14.                         #{studentBirthday},  
    15.                         #{classEntity.classID})      
    16. </insert>  

     

    insert语句属性配置细节:

    属性描述取值默认
    id在这个模式下唯一的标识符,可被其它语句引用
    parameterType传给此语句的参数的完整类名或别名
    flushCache如果设为true,则会在每次语句调用的时候就会清空缓存。select 语句默认设为falsetrue|falsefalse
    useCache如果设为true,则语句的结果集将被缓存。select 语句默认设为false true|false false
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
    true|falsefalse
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定正整数未设置
    fetchSize设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定正整数驱动器决定
    statementTypestatement,preparedstatement,callablestatement。
    预准备语句、可调用语句
    STATEMENT
    PREPARED
    CALLABLE
    PREPARED
    useGeneratedKeys

    告诉MyBatis 使用JDBC 的getGeneratedKeys 方法来获取数据库自己生成的主键(MySQL、SQLSERVER 等

    关系型数据库会有自动生成的字段)。默认:false

    true|falsefalse
    keyProperty

    标识一个将要被MyBatis 设置进getGeneratedKeys 的key 所返回的值,或者为insert 语句使用一个selectKey

    子元素。


     

    selectKey语句属性配置细节:

     

    属性描述取值
    keyPropertyselectKey 语句生成结果需要设置的属性。
    resultType生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int类型。
    order可以设成BEFORE 或者AFTER,如果设为BEFORE,那它会先选择主键,然后设置keyProperty,再执行insert语句;如果设为AFTER,它就先运行insert 语句再运行selectKey 语句,通常是insert 语句中内部调用数据库(像Oracle)内嵌的序列机制。 BEFORE
    AFTER
    statementType像上面的那样, MyBatis 支持STATEMENT,PREPARED和CALLABLE 的语句形式, 对应Statement ,PreparedStatement 和CallableStatement 响应STATEMENT
    PREPARED
    CALLABLE

     

    2.4 update、delete

    一个简单的update:

    Xml代码  收藏代码
    1. <!-- 更新学生信息 -->  
    2. <update id="updateStudent" parameterType="StudentEntity">  
    3.         UPDATE STUDENT_TBL  
    4.             SET STUDENT_TBL.STUDENT_NAME = #{studentName},   
    5.                 STUDENT_TBL.STUDENT_SEX = #{studentSex},  
    6.                 STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  
    7.                 STUDENT_TBL.CLASS_ID = #{classEntity.classID}  
    8.          WHERE STUDENT_TBL.STUDENT_ID = #{studentID};     
    9. </update>  

     

    一个简单的delete:

    Xml代码  收藏代码
    1. <!-- 删除学生 -->  
    2. <delete id="deleteStudent" parameterType="StudentEntity">  
    3.         DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID}  
    4. </delete>  

     

     update、delete语句属性配置细节:

     

    属性描述取值默认
    id在这个模式下唯一的标识符,可被其它语句引用
    parameterType传给此语句的参数的完整类名或别名
    flushCache如果设为true,则会在每次语句调用的时候就会清空缓存。select 语句默认设为falsetrue|falsefalse
    useCache如果设为true,则语句的结果集将被缓存。select 语句默认设为false true|false false
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定
    true|falsefalse
    timeout 设置驱动器在抛出异常前等待回应的最长时间,默认为不设值,由驱动器自己决定正整数未设置
    fetchSize设置一个值后,驱动器会在结果集数目达到此数值后,激发返回,默认为不设值,由驱动器自己决定正整数驱动器决定
    statementTypestatement,preparedstatement,callablestatement。
    预准备语句、可调用语句
    STATEMENT
    PREPARED
    CALLABLE
    PREPARED

     

    2.5 sql

    Sql元素用来定义一个可以复用的SQL 语句段,供其它语句调用。比如:

    Xml代码  收藏代码
    1. <!-- 复用sql语句  查询student表所有字段 -->  
    2. <sql id="selectStudentAll">  
    3.         SELECT ST.STUDENT_ID,  
    4.                    ST.STUDENT_NAME,  
    5.                    ST.STUDENT_SEX,  
    6.                    ST.STUDENT_BIRTHDAY,  
    7.                    ST.CLASS_ID  
    8.               FROM STUDENT_TBL ST  
    9. </sql>  

     
       这样,在select的语句中就可以直接引用使用了,将上面select语句改成:

    Xml代码  收藏代码
    1. <!-- 查询学生,根据id -->  
    2. <select id="getStudent" parameterType="String" resultMap="studentResultMap">  
    3.     <include refid="selectStudentAll"/>  
    4.             WHERE ST.STUDENT_ID = #{studentID}   
    5. </select>  

     

     2.6 parameters

            上面很多地方已经用到了参数,比如查询、修改、删除的条件,插入,修改的数据等,MyBatis可以使用的基本数据类型和Java的复杂数据类型。
            基本数据类型,String,int,date等。
            但是使用基本数据类型,只能提供一个参数,所以需要使用Java实体类,或Map类型做参数类型。通过#{}可以直接得到其属性。

    2.6.1基本类型参数

     根据入学时间,检索学生列表:

    Xml代码  收藏代码
    1. <!-- 查询学生list,根据入学时间  -->  
    2. <select id="getStudentListByDate"  parameterType="Date" resultMap="studentResultMap">  
    3.     SELECT *  
    4.       FROM STUDENT_TBL ST LEFT JOIN CLASS_TBL CT ON ST.CLASS_ID = CT.CLASS_ID  
    5.      WHERE CT.CLASS_YEAR = #{classYear};      
    6. </select>  

     

    Java代码  收藏代码
    1. List<StudentEntity> studentList = studentMapper.getStudentListByClassYear(StringUtil.parse("2007-9-1"));  
    2. for (StudentEntity entityTemp : studentList) {  
    3.     System.out.println(entityTemp.toString());  
    4. }  


    2.6.2 Java实体类型参数

     根据姓名和性别,检索学生列表。使用实体类做参数:

    Xml代码  收藏代码
    1. <!-- 查询学生list,like姓名、=性别,参数entity类型 -->  
    2. <select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap">  
    3.     SELECT * from STUDENT_TBL ST  
    4.         WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')  
    5.           AND ST.STUDENT_SEX = #{studentSex}  
    6. </select>  

     

    Java代码  收藏代码
    1. StudentEntity entity = new StudentEntity();  
    2. entity.setStudentName("李");  
    3. entity.setStudentSex("男");  
    4. List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity);  
    5. for (StudentEntity entityTemp : studentList) {  
    6.     System.out.println(entityTemp.toString());  
    7. }  

     

    2.6.3 Map参数

    根据姓名和性别,检索学生列表。使用Map做参数:

    Xml代码  收藏代码
    1. <!-- 查询学生list,=性别,参数map类型 -->  
    2. <select id="getStudentListWhereMap" parameterType="Map" resultMap="studentResultMap">  
    3.     SELECT * from STUDENT_TBL ST  
    4.      WHERE ST.STUDENT_SEX = #{sex}  
    5.           AND ST.STUDENT_SEX = #{sex}  
    6. </select>  

     

    Java代码  收藏代码
    1. Map<String, String> map = new HashMap<String, String>();  
    2. map.put("sex""女");  
    3. map.put("name""李");  
    4. List<StudentEntity> studentList = studentMapper.getStudentListWhereMap(map);  
    5. for (StudentEntity entityTemp : studentList) {  
    6.     System.out.println(entityTemp.toString());  
    7. }  

     

    2.6.4多参数的实现 

     如果想传入多个参数,则需要在接口的参数上添加@Param注解。给出一个实例:
     接口写法:

    Java代码  收藏代码
    1. public List<StudentEntity> getStudentListWhereParam(@Param(value = "name") String name, @Param(value = "sex") String sex, @Param(value = "birthday") Date birthdar, @Param(value = "classEntity") ClassEntity classEntity);  

     

    SQL写法:

    Xml代码  收藏代码
    1. <!-- 查询学生list,like姓名、=性别、=生日、=班级,多参数方式 -->  
    2. <select id="getStudentListWhereParam" resultMap="studentResultMap">  
    3.     SELECT * from STUDENT_TBL ST  
    4.     <where>  
    5.         <if test="name!=null and name!='' ">  
    6.             ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{name}),'%')  
    7.         </if>  
    8.         <if test="sex!= null and sex!= '' ">  
    9.             AND ST.STUDENT_SEX = #{sex}  
    10.         </if>  
    11.         <if test="birthday!=null">  
    12.             AND ST.STUDENT_BIRTHDAY = #{birthday}  
    13.         </if>  
    14.         <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">  
    15.             AND ST.CLASS_ID = #{classEntity.classID}  
    16.         </if>  
    17.     </where>  
    18. </select>  

     

    进行查询:

    Java代码  收藏代码
    1. List<StudentEntity> studentList = studentMapper.getStudentListWhereParam("""",StringUtil.parse("1985-05-28"), classMapper.getClassByID("20000002"));  
    2. for (StudentEntity entityTemp : studentList) {  
    3.     System.out.println(entityTemp.toString());  
    4. }  

     

    2.6.5字符串代入法

            默认的情况下,使用#{}语法会促使MyBatis 生成PreparedStatement 属性并且使用PreparedStatement 的参数(=?)来安全的设置值。尽量这些是快捷安全,也是经常使用的。但有时候你可能想直接未更改的字符串代入到SQL 语句中。比如说,对于ORDER BY,你可能会这样使用:ORDER BY ${columnName}但MyBatis 不会修改和规避掉这个字符串。
            注意:这样地接收和应用一个用户输入到未更改的语句中,是非常不安全的。这会让用户能植入破坏代码,所以,要么要求字段不要允许客户输入,要么你直接来检测他的合法性 。

     

    2.7 cache缓存


            MyBatis 包含一个强在的、可配置、可定制的缓存机制。MyBatis 3 的缓存实现有了许多改进,既强劲也更容易配置。默认的情况,缓存是没有开启,除了会话缓存以外,它可以提高性能,且能解决全局依赖。开启二级缓存,你只需要在SQL 映射文件中加入简单的一行:<cache/>


    这句简单的语句的作用如下:

    1. 所有在映射文件里的select 语句都将被缓存。
    2. 所有在映射文件里insert,update 和delete 语句会清空缓存。
    3. 缓存使用“最近很少使用”算法来回收
    4. 缓存不会被设定的时间所清空。
    5. 每个缓存可以存储1024 个列表或对象的引用(不管查询出来的结果是什么)。
    6. 缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用
    7. 者或线程潜在修改。

     

    例如,创建一个FIFO 缓存让60 秒就清空一次,存储512 个对象结果或列表引用,并且返回的结果是只读。因为在不用的线程里的两个调用者修改它们可能会导致引用冲突。

    Xml代码  收藏代码
    1. <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true">  
    2. </cache>  


        还可以在不同的命名空间里共享同一个缓存配置或者实例。在这种情况下,你就可以使用cache-ref 来引用另外一个缓存。

    Xml代码  收藏代码
    1. <cache-ref namespace="com.liming.manager.data.StudentMapper"/>  


    Cache 语句属性配置细节:

    属性说明取值默认值
    eviction缓存策略:
    LRU - 最近最少使用法:移出最近较长周期内都没有被使用的对象。
    FIFI- 先进先出:移出队列里较早的对象
    SOFT - 软引用:基于软引用规则,使用垃圾回收机制来移出对象
    WEAK - 弱引用:基于弱引用规则,使用垃圾回收机制来强制性地移出对象
    LRU
    FIFI
    SOFT
    WEAK
    LRU
    flushInterval代表一个合理的毫秒总计时间。默认是不设置,因此使用无间隔清空即只能调用语句来清空。正整数

    不设置

    size缓存的对象的大小正整数1024
    readOnly

    只读缓存将对所有调用者返回同一个实例。因此都不能被修改,这可以极大的提高性能。可写的缓存将通过序列

    化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是false。

    true|falsefalse





  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/jeffen/p/6230362.html
Copyright © 2011-2022 走看看