动态sql

来源:互联网 发布:如何判断存在sql注入 编辑:程序博客网 时间:2024/04/24 06:33

先在数据库可视化界面中写sql语句进行调试后,再写映射文件

创建映射文件,在映射文件中配置sql语句

映射文件命名规则:Mapper代理开发的映射文件名为XxxxMapper.xml(原始ibatis命名方式为Xxxx.xml)。

映射文件的约束文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

nameSpace命名空间:对sql进行分类化管理,理解sql隔离。
Mybatis中namespace用于绑定dao接口,dao接口的方法对应mapper中的sql语句中id。

映射文件编写完成之后,如果未配置自动扫描,需要在SqlMapConfig中加载对应的映射文件。

1.查询

id:标识映射文件中的sql,将sql语句封装到mappedStatement,作为statement的ID。

#{}:表示一个占位符号,接收输入参数。参数类型可以是简单类型,dto,hashMap。
如果接收dto对象,则使用OGNL对象导航图读取对象中的属性值。即对于包装的dto,采用属性.属性.属性名的方式取数据。

${}:拼接字符串,类型可以是简单类型,dto和hashMap。
此时MyBatis 不会修改或转义字符串,传入的为指定字符串,会存在潜在的sql注入攻击。

parameterMap:parameterMap为早期版本

parameterType:指定输入映射的java类型,int时指定为int,String时指定为java.lang.String。

resultType:表示输出结果类型,指定sql输出结果所映射的java对象类型,表示将单条记录映射成的java对象(注意输出映射和数据库表字段的对应)。即无论返回单个dto还是list,resultType的值都是表示单条记录的类型。

<1>根据id查询单条记录

<select id="getAgreement" resultType="dto位置" parameterType="java.lang.String">      SELECT *      FROM        T_RES_AGR TRA      WHERE        TRA.NO = #{no, jdbcType=VARCHAR}</select>

2.插入

配置添加用户的statement,返回主键(主键返回,作为子表的外键)。

2.1 mysql自增主键:执行insert提交之前,自动生成一个自增主键。
在insert之后,通过mysql的函数,获取到刚插入记录的自增主键。
LAST-INSERT-ID

添加用户,并将插入数据的主键返回,到user对象中。只适用于自增主键。
keyProperty:将查询到的主键值设置到parameterType指定的属性值中去,即keyProperty的值。
order:相对于insert语句来说,SELECT LAST-INSERT-ID()语句的执行顺序。
resultType:指定返回结果的类型。

<insert id="doCreateAgreement" parameterType="com.ceair.acm.reservation.dto.AgreementDTO">        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">                SELECT LAST-INSERT-ID()        </selectKey>        INSERT INTO T_RES_AGREEMENT TRA(            STATUS        ) VALUES (            #{insertDTO.status, jdbcType=VARCHAR}        )</insert>

2.2非自增主键的返回——使用uuid()
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为String,长度设置为35位。

执行思路:先根据uuid()查询出主键,再根据主键执行sql语句。
执行顺序:相对于insert语句,为 之前。
执行过程:首先通过uuid得到主键,将主键值设置到dto的id属性中;在insert执行时,从dto对象中取出id属性值。

<insert id="doCreateAgreement" parameterType="com.ceair.acm.reservation.dto.AgreementDTO">        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">                SELECT uuid()        </selectKey>        INSERT INTO TRA(            STATUS        ) VALUES (            #{id},            #{insertDTO.status, jdbcType=VARCHAR}        )</insert>

2.3通过oracle的序列生成主键
SELECT Xxx序列名.nextVal()

<insert id="doCreateAgreement" parameterType="com.ceair.acm.reservation.dto.AgreementDTO">        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">                SELECT Xxx序列名.nextVal()        </selectKey>        INSERT INTO TRA(            STATUS        ) VALUES (            #{id},            #{insertDTO.status, jdbcType=VARCHAR}        )</insert>

3.删除

<delete id="deleteKey" parameterType="java.math.BigDecimal" >      delete from user      where id = #{Id,jdbcType=DECIMAL}</delete>

4.更新

id为必需参数

<update id="update" parameterType="com.AgreementDTO">        UPDATE USER        SET          STATUS = #{status, jdbcType=VARCHAR}        WHERE          USER.ID = #{id, jdbcType=VARCHAR}</update>
原创粉丝点击