动态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>
- 动态SQL
- 动态SQL
- 动态sql
- 动态SQL
- 动态SQL
- 动态sql
- 动态sql
- 动态SQL
- 动态SQL
- 动态SQL
- 动态SQL
- 动态sql
- 动态SQL
- 动态sql
- 动态SQL
- 动态sql
- 动态sql
- 动态sql
- Jmeter后置处理器-正则表达式提取器
- adaBoost 源码
- MySQL引擎详解
- MPAndroidChart开源图表库之饼状图
- 前端安全之XSS攻击
- 动态sql
- xml解析
- 使用Windriver生成CPCI驱动
- selenium遇到的问题
- 解决archlinux(manjaro)无法启动mysql(mariaDB):ERROR 2002 (HY000): Can't connect to local MySQL server throu
- 无线通信开题报告-GuoKunpeng
- 设计模式之状态模式
- Android APK之间的调用返回值
- Android平台下JNI调用第三方so库