${}和#{}的用法区分:
${}表示拼接字符串,通过${}可以将parameterType传入的
内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单
类型值或pojo属性值,如果parameter传输的是单个简单类
型值,${}括号内只能是value
#{}表示一个占位符,通过#{}向占位符中设置值,自动进行
java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可
以接收简单类型值或pojo属性值,如果parameterType传输
单个简单类型值,#{}括号内可以是value或其他名称
${}
如果传入的是基础数据类型; 大括号中只能写一个叫做value, 也就是说${value}
;
如果传入的pojo或者map类型, 那么只能写属性名或key名:${username}
;
存在sql注入的风险。
#{}
如果传入的是字符串;预编译时会自动带上单引号'
不存在sql注入的风险。
![4165335-adf827114540e6f3.png](https://i-blog.csdnimg.cn/blog_migrate/dffe6e370c53a06d50f3335e2280d1d2.png)
唯一性id返回
primary key return
前提是数据库得支持 auto-generated key fields
http://www.mybatis.org/mybatis-3/sqlmap-xml.html
![4165335-4178e2053a09d229.png](https://i-blog.csdnimg.cn/blog_migrate/5f12e4f504ed1183409c42a6e1a7fc98.png)
keyProperty="id"
id是pojo的一个属性, 最终把被插入的行数是存放在id属性的。
当插入多行 id是数组类型的,或者是List类型的。
<selectKey>
数据库不支持 auto-generated key fields,就生成随机数
http://www.mybatis.org/mybatis-3/sqlmap-xml.html
![4165335-2f23ca765d8d7947.png](https://i-blog.csdnimg.cn/blog_migrate/ce8a7b6cd3f1a569a0b55e3a854f5462.png)
resultMap和resultType
resultType
注意如果是List集合,那应该是集合可以包含的类型,而不能是集合本身。
public interface UserMapper {
List<User> findUserByQueryVo(QueryVo queryVo);
}
public class QueryVo {
private User user;
private Integer[] ids;
}
<select id="findUserByQueryVo" parameterType="QueryVo" resultType="User">
select * from mybatis.user where username like '%${user.username}%'
</select>
resultMap
引入:
当数据库字段列名和pojo属性字段名映射不上;
但是又没有修改pojo的打算;或者修改表字段名的打算;
咋办呢?
用 resultMap 手动映射;
<!--
查询结果用 包装的pojo 封装
resultMap
引入:
当数据库字段列名和pojo属性字段名映射不上;
但是又没有修改pojo的打算;或者修改表字段名的打算;
咋办呢?
用 resultMap 手动映射;
-->
<resultMap id="findById3ResultMap" type="User">
<!--<id column="id" property="id"/>-->
<result column="user_name" property="username"/>
<result column="gender" property="sex"/>
<!--<result column="birthday" property="birthday"/>-->
<!--<result column="address" property="address"/>-->
</resultMap>
<select id="findById3" parameterType="int" resultMap="findById3ResultMap">
select * from user_copy where id=#{id};
</select>
动态sql:动态拼装sql
ognl语言: object graph navigation language
![4165335-bcf8e73848df3376.png](https://i-blog.csdnimg.cn/blog_migrate/ee037fd824d1b397945344ded02b6849.png)
if
choose,when,otherwise
when,set
foreach
sql:复用sql语句
<sql>
引用
<include refid="sql_id" >