MyBatis在insert插入操作时返回主键ID的配置:
MySQL用法:
<insert id="insert" parameterType="com.test.User" keyProperty="userId" useGeneratedKeys="true" >
上面配置中,“keyProperty”表示返回的id要保存到对象的那个属性中,“useGeneratedKeys”表示主键id为自增长模式。
Oracle用法:
<insert id="insert" parameterType="com.test.User"> <selectKey resultType="INTEGER" order="BEFORE" keyProperty="userId"> SELECT SEQ_USER.NEXTVAL as userId from DUAL </selectKey> insert into user (user_id,)values (#{userId,jdbcType=INTEGER}) </insert>
需要注意的是:由于Oracle没有自增长一说法,只有序列这种模仿自增的形式,所以不能再使用“useGeneratedKeys”属性。
而是使用<selectKey>将ID获取并赋值到对象的属性中,insert插入操作时正常插入id。
mybatis中的#{}和${}区别:
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,$将传入的数据直接显示生成在sql中。
#方式能够很大程度防止sql注入。$方式一般用于传入数据库对象,MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName},这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
使用语法: #{columnName}, ${columnName} , in (${departmentId}) #拼接数据时会自动加双引号所以使用$
MYSQL IF 和 IFNULL:
IF函数 表达式:IF(expr1,expr2,expr3) 满足条件expr1即条件expr1返回true 则expr2 否则就是expr3, SELECT IF(1=1,2,3); 则输出2
IFNULL函数 表达式:IFNULL(expr1,expr2) 如果expr1值为NULL,则输出expr2 如果expr1值不为空则输出expr1本身
MYSQL 字段拼接成新字段:
表达式: CONCAT() 示例:SELECT CONCAT(region_name,"-",store_name) name FROM Geography
MYSQL 查询方式:
普通查询: select * from t_system_user
条件查询: select * from t_system_user where name=#{name}
模糊查询: select * from t_system_user where name like CONCAT('%',#{name},'%')
或 select * from t_system_user where name like '%'+#{name}+'%'
查询排序: select * from t_system_user order by ${排序字段}
连接查询:
union 和 union all:
UNION 操作符用于合并两个或多个 SELECT 语句的结果集,并去除重复记录,
UNION all 也用于合并两个或多个 SELECT 语句的所有结果集,不去除重复记录,
示例: select * from t_system_user_A union select * from t_system_user_B
注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。
INNER JOIN(内连接)
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
包含等值(=),非等值(> 、>、=、 <、 <=、 !=, 还可以使用BETWEEN…AND 之类的谓词),自然连接(Natural join)-去除相同属性列
示例: SELECT * FROM press AS p INNER JOIN authors AS a ON p.city=a.city
全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以 NULL 填充.。 SELECT * FROM press FULL OUTER JOIN authors ON press.id= authors.press_id