【Mybatis】标签中statementType,databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys的使用

mybatis的xml文件中,配置SQL语句时。在标签上有很多属性可以选择,这些属性包括:

statementType,databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys

所写的位置为:

【Mybatis】标签中statementType,databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys的使用_第1张图片
为了后续做项目时减少思考的时间,故在此进行一次汇总。

statementType的使用

StatementType有三个值,分别为:STATEMENT,PREPARED 或 CALLABLE。其中:
STATEMENT

普通的不带参的查询SQL;
支持批量更新,批量删除;
Statement每次执行sql语句,数据库都要执行sql语句的编译 ,
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。 
对应于Statement对象,有SQL注入的风险。

PREPARED:

可变参数的SQL,编译一次,执行多次,效率高;
安全性好,有效防止Sql注入等问题;
支持批量更新,批量删除;
PreparedStatement是预编译的,使用PreparedStatement有几个好处:
1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
2. 安全性好,有效防止Sql注入等问题。
3. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
4. 代码的可读性和可维护性。 

CALLABLE:

继承自PreparedStatement,支持带参数的SQL操作;
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
当使用存储过程的时候,需要指定statementType的值为CALLABLE

databaseId

databaseId用于指定所配置的数据源id,在多数据源的时候,可以使用。如配置的数据源:

<bean id="vendorProperties"
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="Oracle">oracle</prop>
            <prop key="MySQL">mysql</prop>
        </props>
    </property>
</bean>

SQL语句在使用指定数据源时:

<select id="qryAllUserInfo" databaseId="oracle" parameterType="****" >
    select * from sys_user
</select>
<select id="qryAllUserInfo" databaseId="mysql" parameterType="****" >
    select * from sys_user
</select>

flushCache和useCache

这两者是针对二级缓存使用的,在没有配置的情况下,mybatis二级缓存默认如下:

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。
在insert、update、delete语句时: flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。 useCache属性在该情况下没有。update 的时候如果 flushCache="false",则当你更新后,查询的数据数据还是老的数据。

keyColumn,keyProperty,useGeneratedKeys

这三者可配合使用,使用场景有很多,比如:

在插入数据库后,还返回插入的主键如id值到相应的pojo模型中。这非常方便的在进行业务插入时,无需再次查询最后一次插入的数值id。

详细解释:

   keyColumn ,指定数据库的主键名是什么,如id 。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

   keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

   useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

举例1:

<insert id="addHuser" parameterType="com.xx.authorization.model.HUsers" useGeneratedKeys="true" keyColumn="USER_ID" keyProperty="userId">  
        INSERT INTO H_USERS(PHONE,PASSWORD,GENDERS,REGISTER_DATE,STATUS)  
        values (#{phone},#{password},  
        #{genders,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},  
        #{registerDate},#{status})  
    </insert> 

当执行完该条语句后,语句会获取插入的最新一条数据的主键,即USER_ID的值,然后映射到userId,最后再映射到实体类HUsers的userId中,所以执行完毕后你会发现HUsers的userId是最新的id数据。

举例2

<mapper namespace="com.dao.EmployeeDao">
 
    <insert id="insert">
        <selectKey order="BEFORE" keyColumn="employeeId,employeeGender" keyProperty="employeeId,employeeGender" resultType="com.entity.Employee">
            select employee_id employeeId,employee_gender employeeGender from employee where employee_id=13
        </selectKey>
        insert into subtable(employee_id,employee_name,employee_gender) values (#{employeeId},"mdzz",#{employeeGender})
    </insert>
</mapper>

该条语句,表示从employee 中查询employee_id=13的数据,查询到employeeId和employeeGender 并映射到keyProperty中,然后再下一个insert语句中,直接注入#{employeeId},#{employeeGender},这种情况多用在表2需要表1字段信息时,减少代码和SQL的编写。提高SQL执行速度

timeout

默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

你可能感兴趣的:(【SSM】,mybatis标签)