< id column = " id " property = " id_ " /> < result property = " userName " column = " user_Name_ " /> < result property = " userAge " column = " user_age " /> _@select">
当前位置:   article > 正文

Mybatis(2)_@select

@select

参数传递

  • 单个参数直接传递

    User selectUsers(int id);

多个参数使用@Param(“id”)绑定

User selectUsers(@Param(“id”)int id,@Param(“name”)String name);

<select id="selectUsers" resultType="User">
	select id, username, password from users where id = #{id} and username=#{name}
</select>
  • 1
  • 2
  • 3

如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如:

void insertUser(User user);

<insert id="insertUser" parameterType="User">
	insert into users (id, username, password)
	values (#{id}, #{username}, #{password})
</insert>
  • 1
  • 2
  • 3
  • 4

增删改查

#{} 和${} 的区别
  • #{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
  • #{}:select * from t_user where uid=#{uid}
  • 拼 接 符 , 会 传 入 参 数 字 符 串 , 取 值 以 后 再 去 编 译 S Q L 语 句 , {} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句, ,SQL,方式无法防止 Sql 注入 ${}
  • ${}:select * from t_user where uid= ‘1’

注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#

<insert id="唯一标识" useGeneratedKeys="把新增加的主键赋值到自己定义的
	keyProperty " keyProperty= 接收主键的属性 parameterType="参数类型">
insert into
		user(userName,userAge)values(#{userName},#{userAge})
</insert>
  • 1
  • 2
  • 3
  • 4
  • 5
<delete id="唯一标识" parameterType="参数类型">
	delete from ts_user where userId = #{id}
</delete>
  • 1
  • 2
  • 3
<update id="唯一标识" parameterType="参数类型">
	update ts_user set userName = #{userName},userAge = #{userAge}
	where userId = #{userId};
</update>
  • 1
  • 2
  • 3
  • 4
<select id="唯一标识" resultType="返回结果集类型">
	select * from ts_user where id= #{id}
</select>
  • 1
  • 2
  • 3

结果处理

简单输出类型
//返回简单基本类型
<select id="findUserInfoCount" resultType="int">
select count(*) from userInfo
</select>
  • 1
  • 2
  • 3
  • 4
对象映射
  • 如果表中的名和类中的属性名完全相同,mybatis会自动将查询结果封装到对象中

    如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置自动转换

<setting name="mapUnderscoreToCamelCase" value="true"/>
	<select id="findUserInfoById" parameterType="int"resultType="User">
	select * from t_user where id=#{id}
</select>
  • 1
  • 2
  • 3
  • 4
特殊处理定义 resultMap
//定义resultMap
<resultMap id="userResultMap" type="User">
	<id column="id" property="id_"/>
	<result property="userName" column="user_Name_" />
	<result property="userAge" column="user_age" />
</resultMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • (1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“useresultMap”
    (2). resutlMap 的 id 属性是映射的 POJO 类
    (3). id 标签映射主键,result 标签映射非主键
    (4). property 设置 POJO 的属性名称,column 映射查询结果的列名称
//使用resultMap
<select id="findUserInfoResultMap" resultMap="userResultMap">
	SELECT id id_,user_name,user_age FROM t_user
</select>
  • 1
  • 2
  • 3
  • 4
  • (1). 本例的输出映射使用的是 resultMap,而非 resultType
    (2). resultMap 引用了 userResultMap
多表关联处理结果集

resultMap 元素中 association , collection 元素. Collection 关联元素处理一对多关联。

  • 部门一方 配置多方集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPXNQbpZ-1669961433994)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667028833601.png)]

  • 员工多方,在多方配置一方

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sq3JsgQj-1669961433995)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667028862790.png)]

  • 使用resultMap 组装查询结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQndAoAx-1669961433995)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667028895118.png)]

  • 使用resultMap 组装查询结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y67wx9j1-1669961433996)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667028933031.png)]

嵌套查询
  • 将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.

    <association property="dept" javaType="Dept" select="findDeptByID" column="dept_id"> </association
    
    • 1
    • (1). select:指定关联查询对象的 Mapper Statement ID 为 findDeptByID
    • (2). column=“dept_id”:关联查询时将 dept_id 列的值传入 findDeptByID,并将 findDeptByID 查询的结果映射到 Emp 的 dept 属性中
    • (3).collection 和 association 都需要配置 select 和 column 属性,两者配置方法
      相同

注解方式

常用注解标签
  • @Insert : 插入 sql , 和 xml insert sql 语法完全一样
    @Select : 查询 sql, 和 xml select sql 语法完全一样
    @Update : 更新 sql, 和 xml update sql 语法完全一样
    @Delete : 删除 sql, 和 xml delete sql 语法完全一样
    @Param : 入参
    @Results : 设置结果集合
    @Result : 结果
使用案例
查询所有信息
@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true), @Result(column = "emp_name",property = "empName"), @Result(column = "emp_tel",property = "empTel"), @Result(column = "emp_education",property = "empEducation"), @Result(column = "emp_birthday",property = "empBirthday")
})
List<Employee> getAll()
  • 1
  • 2
  • 3
  • 4
  • 5
查询单个信息
@Select("select * from t_emp where emp_id=#{empId}")
@ResultMap(value="empMap")
Employee getById(@Param("empId") Integer empId);
  • 1
  • 2
  • 3
插入信息
@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +
" )" values (#{empId}, #{empName}, #{empTel}, " +
" #{empEducation}, #{empBirthday}, #{fkDeptId}" +
" )")
int insert(Employee record);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
删除信息
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId)
  • 1
  • 2

Mybatis 动态 SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种问题。

MyBatis 中用于实现动态 SQL 的元素主要有:
If、where、trim、set、choose (when, otherwise)、foreach

If元素
  • if标签可以对传入的条件进行判断

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JINc8oJ6-1669961433997)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667031009712.png)]

  • 对于查询条件个数不确定的情况,可使用元素。如下:

    <select id="id" parameterType="" resultType="">
    SELECT xxx... FROM table t
    <where>
    <if test="name != null &amp; name!=’’ ">
    name like #{name}
    </if>
    <if test="age!=null &amp; age > 0">
    AND age> #{value}
    </if>
    </where>
    </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    元素会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。
    此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉 AND 或 OR

trim元素
  • where 标签,其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IwfRa5i-1669961433998)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667031333424.png)]
Choose元素

在这里插入图片描述

Set元素可以把最后一个逗号去掉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M69d7KSq-1669961434000)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667031382610.png)]

  • 也可以用trim实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVojfnQ9-1669961434001)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667031414152.png)]

foreach元素
  • 主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item 表示集合中每一个元素进行迭代时的别名,index 指定一个名字,用于
    表示在迭代过程中,每次迭代到的位置,open 表示该语句以什么开始,separator 表示在每次进行迭代之间以什么符号作为分隔符,close 表示以什么结束,在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。
  • 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list – 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1U5Zi5hE-1669961434002)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1667031487382.png)]

特殊符号处理

在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:

特殊字符    转义字符
   <          &lt;
   >          &gt;
   "          &quot;
   '          &apos;
   &          &amp;
```除了可以使用上述转义字符外,还可以使用来包裹特殊字符。如下所示

```xml
<if test="id != null">
	AND <![CDATA[ id <> #{id} ]]>
</if>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

<![CDATA[ ]]>是 XML 语法。在 CDATA 内部的所有内容都会被解析器忽略。但是有个问题那就是 <if> </if> <where> </where> <choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在<![CDATA[ ]]> 尽量缩小<![CDATA[ ]]>的范围

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/114922
推荐阅读