动态sql
- sql
insert
<insert id="addUser" parameterType="User"> <selectKey resultType="Integer" keyColumn="id" order="AFTER" keyProperty="id"> select last_insert_id(); </selectKey> insert into t_user(id, `name`, age) values (#{id},#{name},#{age}); </insert>
- id: 唯一值, 一般对应mapper接口中的方法名
- parameterType: 传入的参数, 因为在核心配置文件里面配置了别名, 所以直接写的类名
- #{val}: 中间的字符串可以是任意值, 但是如果参数是对象的话, 必须是属性值
- selectKey 中, keyColumn是列名, keyProperty是属性名
- order表示的是数据库是先生成 id 再插入数据还是先插入数据再生成 id, mysql写AFTER就好
update
<update id="modifyUserById" parameterType="User"> update t_user set name = #{name}, age = #{age} where id = #{id}; </update>
delete
<delete id="deleteUserById" parameterType="Integer"> delete from t_user where id = #{id}; </delete>
- 此处#{}中间可以随便写
- select
selectList
<select id="getUsers" resultType="User"> select * from t_user; </select>
- resultType: 返回结果类型
selectOne
<select id="getUserById" parameterType="Integer" resultType="User"> select * from t_user where id = #{id}; </select>
模糊查询
<select id="getUsersByName" parameterType="String" resultType="cn.ann.bean.User"> select * from t_user where name like '%'#{name}'%'; <!-- select * from t_user where name like '%${name}%'; select * from t_user where name like #{name}; --> </select>
- #{name}
- "%"#{name}"%"
- '%${name}%'
- 以上三种写法都可以得到预期的结果, 但是从截图我们可以看到, a和b用的是预编译(PrepareStatement对象), c使用的是字符串拼接(Statement)
- b中必须使用 " " 包裹 % 才有效, 另外, b写法在idea中有红色波浪线, 不知道是啥原因
- #{name}
- 动态sql
- 准备: 创建queryVo类
- queryVo 是sql语句条件的集合, 里面存储了执行sql时需要用到的条件
- sql片段
创建
<sql id="query"> select * from t_user </sql>
- 引用
<include refid="query"/>
- 注意:
- 创建和引用的id要一致
- sql片段相当于是文本的替换, 所以不要加分号(;)
- 注意:
if
<select id="getUserByCondition" resultType="User" parameterType="User"> select * from t_user where 1=1 <if test="name != null"> and name = #{name} </if> <if test="age != null"> and age = #{age} </if> </select>
- test里面写添加即可. 注意: 字段需要和参数对象的属性名一致
where
<select id="getUserByCondition" resultType="User" parameterType="QueryVo"> select * from t_user <where> <if test="user.name != null"> and name = #{user.name} </if> <if test="user.age != null"> and age = #{user.age} </if> </where> </select>
- 用where标签包裹之后, 上面的sql语句就不能写where了
- where里面的sql语句的and只能写在前面, 不能写在后面
foreach
<select id="getUsersByIdsVo" parameterType="QueryVo" resultType="User"> <include refid="query"/> <where> <foreach collection="ids" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- 因为传入的是QueryVo, 所以forEach的collection属性的值是属性名即可
- 两个坑
当传入的参数是数组时
扫描二维码关注公众号,回复: 7622653 查看本文章<select id="getUsersByIds" parameterType="Integer" resultType="User"> <include refid="query"/> <where> <foreach collection="array" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- forEach的collection属性的值是必须是array
当传入的参数是列表时
<select id="getUsersByIdList" parameterType="Integer" resultType="User"> <include refid="query"/> <where> <foreach collection="list" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- forEach的collection属性的值必须是list
- 准备: 创建queryVo类