MyBaits-基本使用
零、本文纲要
- 一、 CRUD
- 结果映射
- 参数占位符
- parameterType
- 特殊字段处理
- 多条件查询
- 动态SQL
- 主键返回
- 批量删除
- 注解实现CRUD
- 二、MyBatis参数传递
- 多个参数
- 单个参数
一、 CRUD
1. 结果映射
数据库字段brand_name与实体类brandName不匹配,无法正确封装数据的问题处理。
- ① 起别名
<select id="selectAll" resultType="brand">
select
id, brand_name as brandName, company_name as companyName, ordered, description, status
from tb_brand;
</select>
补充:SQL片段
Ⅰ 使用<sql>标签抽取共用片段
<sql id="brand_column">
id, brand_name as brandName, company_name as companyName, ordered, description, status
</sql>
Ⅱ 使用<include>标签引用共用片段
<select id="selectAll" resultType="brand">
select
<include refid="brand_column" />
from tb_brand;
</select>
- ② 使用resultMap
Ⅰ 使用<resultMap>标签配置数据映射
<resultMap id="brandResultMap" type="brand">
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
Ⅱ 引用<resultMap>于SQL中使用
<select id="selectAll" resultMap="brandResultMap">
select *
from tb_brand;
</select>
2. 参数占位符
- ① #{}
执行SQL时,会将 #{} 占位符替换为?,底层使用的是 PreparedStatement
- ② ${}
拼接SQL。底层使用的是 Statement
3. parameterType
对于有参数的mapper接口方法,在映射配置文件中应该配置 ParameterType
来指定参数类型。可以省略。
4. 特殊字段处理
参考xml的处理方式
- ① 实体引用
<
< less than
>
> greater than
&
& ampersand
'
' apostrophe
"
" quotation mark
- ② CDATA区
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束
5. 多条件查询
- ① 接口方法编写
Ⅰ 使用 @Param("参数名称")
标记每一个参数
List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);
Ⅱ 将多个参数封装成一个实体对象
List<Brand> selectByCondition(Brand brand);
Ⅲ 将多个参数封装到map集合中
List<Brand> selectByCondition(Map map);
- ② 编写SQL
注意:此处参数占位符内的名称,需与上述方式的@Param("名称")
、实体类属性
、Map的Key值
一致
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
where status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName}
</select>
6. 动态SQL
- ① <where> & <if> 标签
Ⅰ <if>标签
test属性:编写逻辑表达式,进行逻辑判断
Ⅱ <where>标签
会动态的去掉第一个条件前的 and
如果所有的参数没有值则不加 where 关键字
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
<where>
<if test="status != null">
and status = #{status}
</if>
<if test="companyName != null and companyName != '' ">
and company_name like #{companyName}
</if>
<if test="brandName != null and brandName != '' ">
and brand_name like #{brandName}
</if>
</where>
</select>
- ② <where> & <choose><when> 标签
Ⅰ <choose>标签
相当于switch
Ⅱ <when>标签
相当于case
test属性:编写逻辑表达式,进行逻辑判断
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose><!--相当于switch-->
<when test="status != null"><!--相当于case-->
status = #{status}
</when>
<when test="companyName != null and companyName != '' "><!--相当于case-->
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != ''"><!--相当于case-->
brand_name like #{brandName}
</when>
</choose>
</where>
</select>
- ③ <set><if> 标签
<update id="update">
update tb_brand
<set>
<if test="brandName != null and brandName != ''">
brand_name = #{brandName},
</if>
<if test="companyName != null and companyName != ''">
company_name = #{companyName},
</if>
<if test="ordered != null">
ordered = #{ordered},
</if>
<if test="description != null and description != ''">
description = #{description},
</if>
<if test="status != null">
status = #{status}
</if>
</set>
where id = #{id};
</update>
7. 主键返回
数据添加成功后,获取数据库自增生成的主键
Ⅰ 添加insert标签属性
useGeneratedKeys:是否获取自动增长的主键值。true表示获取
keyProperty:指定将获取到的主键值封装到哪个属性里
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
8. 批量删除
- ① 编写接口方法
/**
* 批量删除
*/
void deleteByIds(int[] ids);
- ② 编写SQL语句
<foreach>标签
<delete id="deleteByIds">
delete from tb_brand where id
in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
;
</delete>
9. 注解实现CRUD
- 查询 :@Select
- 添加 :@Insert
- 修改 :@Update
- 删除 :@Delete
在注解value属性中编写SQL语句即可
@Select(value = "select * from tb_user where id = #{id}")
public User select(int id);
二、MyBatis参数传递
1. 多个参数
User select(@Param("username") String username,@Param("password") String password);
2. 单个参数
- ① POJO 类型
直接使用。要求 属性名
和 参数占位符名称
一致
- ② Map 集合类型
直接使用。要求 map集合的键名
和 参数占位符名称
一致
- ③ Collection 集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",collection集合);
map.put("collection",collection集合;
可以使用 @Param
注解替换map集合中默认的 arg 键名。
- ④ List 集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",list集合);
map.put("collection",list集合);
map.put("list",list集合);
可以使用 @Param
注解替换map集合中默认的 arg 键名。
- ⑤ Array 类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",数组);
map.put("array",数组);
可以使用 @Param
注解替换map集合中默认的 arg 键名。
- ⑥ 其他类型
比如int类型,参数占位符名称
叫什么都可以。
三、结尾
以上即为MyBaits-基本使用的全部内容,感谢阅读。