Mybatis 多参处理 模糊查询 主键获取 动态sql
作者:互联网
目录
MyBatis高级查询
标签中
入参:
int 可以忽略parameterType
String 可以忽略parameterType
HashMap
Person
List
多参 不写parameterType
返回值:
int
Person
List
ResultMap标签
如果数据库结果集中的列名和要封装的javaBean的属性名有不一致的情况下,我们查询的结果中不一致的属性值会为null,这个时候我们可以使用 resultMap 标签手动的建立映射关系,可以很好的解决数据不对应的问题。
PersonMapper.xml
<!--类中的属性名和表中的字段名一样时 可以使用resultMap
类中的属性名和表中的字段名不一样时 不使用resultType 使用resultMap
可以只配置不相同的字段名
-->
<!--手动映射对象-->
<resultMap id="personResultMap" type="person">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="bir" property="bir"></result>
<result column="address" property="address"></result>
</resultMap>
<!--查询所有 resultMap-->
<select id="findAllResultMap" resultMap="personResultMap">
select id as id, name, bir, address from person
</select>
MyBatis多参数处理
MyBatis 方法中出现了多个参数的处理方式:
第一种
select * from person where pname = #{0} and address = #{1}
是否生效与jdk版本有关
第二种 使用方法索引
select * from person where pname = #{param1} and address = #{param2}
不加注解的情况下 会报错:
Parameter ‘pname’ not found. Available parameters are [1, 0, param1, param2]
Parameter ‘pname’ not found. Available parameters are [1, 0, arg0, arg1]
Parameter ‘pname’ not found. Available parameters are [mm1,mm2]
第三种 使用注解
抽象方法定义 使用Param注解
List<Person> selectPersonByNameAndAddress(@Param("pname") String pname, @Param("address") String address);
select * from person where pname = #{pname} and address = #{address}
第四种 使用Map
<!--
解决多参问题 方式四:
对于多参类型》》我们推出了一款新产品: Map
-->
<!--List<Person> selectPersonByPnameAndAddress(Map<String,Object> map);-->
<select id="selectPersonByPnameAndAddress" parameterType="java.util.Map" resultType="com.offcn.pojo.Person">
select * from person where pname = #{pname} and address = #{address}
</select>
不是多参方式的解决办法,同理还有将入参的数据封装成一个自定义对象,如Person
坑:注意 标签内部不能注释
模糊查询
直接使用 $ 拼接
<!-- ${} 直接编译 容易出现sql注入 -->
<select id="selectPersonByMoHu" parameterType="per" resultType="per">-->
SELECT * FROM person WHERE pname LIKE '%${pname}%' AND address LIKE '%${address}%'
</select>
利用占位符 #{}
这种方式只能在mysql数据库中使用,其他 不承认双引号
<!-- #{} sql语句会提前编译好 -->
<select id="selectPersonByMoHu" parameterType="per" resultType="per">
SELECT * FROM person WHERE pname LIKE "%"#{pname}"%" AND address LIKE "%"#{address}"%"
</select>
利用 concat 函数 拼接数据
<!-- 推荐使用,concat() 字符串拼接函数 注意:在Oracle中,concat() 函数只能传递二次参数,我们解决方案是嵌套拼接 -->
<select id="selectPersonByMoHu" parameterType="per" resultType="per">
SELECT * FROM person WHERE pname LIKE CONCAT("%",CONCAT(#{pname},"%")) AND address LIKE CONCAT("%",CONCAT(#{address},"%"))
</select>
总结: ${} 与 #{} 区别
#{} :表示一个占位符号
通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{} 可以接收简单类型值或pojo属性值。
如果parameterType传输单个简单类型值, #{} 括号中可以是value或其它名称。
${} :表示拼接sql串
通过 ${} 可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。
${} 可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值, ${} 括号中可以使任意名称。
主键字段值的获取
应用场景
我们很多时候有这种需求,向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的自动生成的主键值。以便后续业务的使用
方式一 设置insert标签属性
useGeneratedKeys=“true” 开启主键自增获取 主键值的模式
keyProperty=“pid” 对象中的属性名:将获取的主键赋值到对象属性上
<insert id="insertPerson" parameterType="per" useGeneratedKeys="true" keyProperty="pid" >
INSERT INTO person (pname , address) VALUES (#{pname},#{address})
</insert>
方式二 使用selectKey标签:
selectKey 即将执行一次 查询
keyProperty 配置对象中的主键对应的属性
keyColumn 配置表中的主键对应的字段
resultType 返回的类型(必须和类中的属性类型相同)
order 先执行此函数查询,还是先执行下列的sql
<insert id="insertPerson" parameterType="per">
<selectKey keyProperty="pid" keyColumn="pid" resultType="String" order="AFTER">
select LAST_INSERT_ID();
</selectKey>
INSERT INTO person (pname , address) VALUES (#{pname},#{address})
</insert>
动态sql语句
sql语句块
<sql id="sql001">
select * from person
</sql>
<select id="selectPersonByNameAndAddress" resultType="com.offcn.pojo.Person">
<include refid="sql01"></include> where pname = #{pname} and address = #{address}
</select>
xml映射文件 常用比较符
< | < | 小于 |
> | > | 大于 |
& | & | 与 |
' | ’ | 单引 |
" | " | 双引 |
动态sql之 <if> <where>
坑! and 尽量打在 where之内的标签内
where标签相当于 where 1=1,但是如果没有条件,就不会拼接where关键字
同时where标签可以 忽略我们 成立条件前面的 第一个and 或者是or关键字
第二个不可以
<select id="findByIdAndNameIf" parameterType="person" resultType="person">
SELECT * FROM `person`
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name= #{name}
</if>
</where>
</select>
动态sql之 <choose> <when>
如果有id只使用id做查询,没有id的话看是否有name,有name就根据name做查询,如果都没有,就不带条件查询全部内容。
choose标签相当于swtich语句 when标签相当于case语句 otherwise标签相当于default语句
<select id="findByIdAndNameChoose" parameterType="person" resultType="person"> SELECT * FROM `person`
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="name!= null">
AND name= #{name}
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
动态sql之 <set>
坑:set标签只能自动清除sql拼接的if标签最后一个逗号
动态更新user表数据,如果该属性有值就更新,没有值不做处理。
<update id="updateIf" parameterType="person">
UPDATE `person`
<set>
<if test="name!= null"> name= #{name}, </if>
<if test="bir!= null"> bir= #{bir}, </if>
<if test="address !=null"> address = #{address}, </if>
</set>
WHERE id = #{id}
</update>
动态sql之 <trim>(了解)
重写set标签 消除标签中内容两端的空格
<update id="updateIf" parameterType="person">
UPDATE `person`
<trim prefix="set" suffixOverrides=",">
<if test="name!= null"> name= #{name}, </if>
<if test="bir!= null"> bir= #{bir}, </if>
<if test="address !=null"> address = #{address}, </if>
</trim>
WHERE id = #{id}
</update>
标签:ybatis,标签,address,多参,id,person,pname,sql,主键 来源: https://blog.csdn.net/hxc2u/article/details/110964772