mybatis调用数据库存储过程

mybatis调用数据库存储过程及常见属性详解

调用mapper

String visitCode = mapper.getVisitCode(objectMap);

Dao层,xml文件代码编写

 <select id="getVisitCode" parameterType="map" resultType="string" statementType="CALLABLE">
        <![CDATA[
        {
            call getMinSerial_withLeft(
                #{tableName, jdbcType=VARCHAR, mode=IN},
                #{columnName, jdbcType=VARCHAR, mode=IN},
                #{left, jdbcType=VARCHAR, mode=IN},
                #{rightLength, jdbcType=INTEGER, mode=IN}
            )
            }
        ]]>
    </select>

属性statementType的属性值有:STATEMENT,PREPARED ,CALLABLE

详解:

STATEMENT

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

PREPARED

  • 可变参数的SQL,编译一次,执行多次,效率高
  • 安全性高,有效防止了SQL注入
  • 支持批量删除,与批量更新
  • preparedStatement是预编译的,在执行可变参数的一条SQL的时候,PreparedStatement要比Statement的效率要高的,因为DBMS预编译一条SQL的效率要比多次编译一条SQL的效率要高,==另外PreparedStatement有效防止了SQL注入。==在进行多次执行重复语句的时候,PreparedStatement具有更高的运行效率,并且在这种情况下比较适合使用batch,其次就是编写的代码拥有更高的可读性与可维护性。

CALLABLE

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

其他常见的属性:databaseId,flushCache,keyColumn,keyProperty,timeout,useGeneratedKeys

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与userCache

其主要针对二级缓存进行使用,在没有配置的情况下,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的getGeneratedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。Mysql和SQLServer执行auto-generated key field,因此当数据库设置好自增主键后,可以通过JDBC的getGeneratedKeys方法或取,但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

例子

<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,最后在映射到实体类的HUser的userId中,所执行完你会发现HUSer的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驱动器的设置),设置执行该操作的最大时限,超时将抛异常

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值