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

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

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

所写的位置为:

在这里插入图片描述
为了后续做项目时减少思考的时间,故在此进行一次汇总。

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数据。

PS:如果不生效,检查下jdbc连接。建议加上:?characterEncoding=utf-8&useSSL=false&useUnicode=true&useAffectedRows=true&generateSimpleParameterMetadata=true 后缀

举例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驱动器的设置),设置执行该操作的最大时限,超时将抛异常

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis ,`keyColumn` 和 `keyProperty` 都是用于获取插入数据后返回的自增主键或其他类型主键的属性,但它们的作用不同。 `keyColumn` 是用于指定自增主键或其他类型主键所对应的列名。在一些数据库,如 MySQL,自增主键列需要指定为主键列,并且通常是名为 `id` 的列。在一些其他数据库,如 PostgreSQL,自增主键列通常是一个名为 `id` 的列,但不需要显式指定为主键列。因此,`keyColumn` 的作用是指定自增主键或其他类型主键所对应的列名,以便 MyBatis 能够正确地获取该列的值。 `keyProperty` 是用于指定获取自增主键或其他类型主键所对应的属性名。当插入数据后,MyBatis 会将自增主键或其他类型主键的值设置到指定的属性,以便应用程序能够使用该值。因此,`keyProperty` 的作用是指定自增主键或其他类型主键所对应的属性名,以便 MyBatis 能够正确地设置该属性的值。 可以使用 `selectKey` 元素来获取插入数据后返回的自增主键或其他类型主键。以下是一个示例: ``` <insert id="insertData" parameterType="com.example.Data"> <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Long" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO data(column1, column2) VALUES (#{column1}, #{column2}) </insert> ``` 在上面的示例,`keyColumn` 指定了自增主键所对应的列名,`keyProperty` 指定了获取自增主键值的属性名。`resultType` 指定了返回值的类型,`order` 指定了在插入语句执行之后获取自增主键值。`LAST_INSERT_ID()` 是 MySQL 获取自增主键值的函数,在其他数据库,可能需要使用不同的函数或语句来获取自增主键值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值