数据库
首页 > 数据库> > Mybatis 多参处理 模糊查询 主键获取 动态sql

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映射文件 常用比较符

&lt;<小于
&gt;>大于
&amp;&
&apos;单引
&quot;"双引

动态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