Mybatis常用功能总结
Posted 知道什么是码怪吗?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis常用功能总结相关的知识,希望对你有一定的参考价值。
目录
获取参数值
@Param取别名
可以通过@Param注解标识mapper接口中的方法参数
方法名
User getUserByEmail(@Param(value = "email") String email);
sql代码
<!-- User getUserByEmail(@Param(value = "email") String email);-->
<select id="getUserByEmail" resultType="User">
select id,username,password
from t_user
where userEmail = #email
</select>
以类作为参数类型
以User类为参数,sql代码的参数与类中属性名一致。
List<User> getUser(User user);
sql代码
<!-- List<User> getUser(User user);-->
<select id="getUser" resultType="User">
select * from t_user where username=#username
</select>
获取插入的数据自增的主键
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参 数user对象的某个属性中
sql代码
<!-- int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user
values (null, #username, #password, null, null, null, null, null)
</insert>
测试代码
@Test
public void test8()
User user = new User(null, "小白", "123456", null, null, null, null, null);
System.out.println(user);
mapper.insertUser(user);
System.out.println(user);
输出结果
可以看到,第一次输出user的时候id的值为null,当插入数据之后,id变成了19。
字段名和属性名建立映射
字段名和属性名建立一对一映射
当数据库字段名和用于获取的类的属性名不一致时,需要建立字段名和属性名的映射来获取数据。
属性名
字段名
mybatis代码
<!--
resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
-->
<resultMap id="userMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
</resultMap>
<!-- List<TestUser> getAllUser();-->
<select id="getAllUser" resultMap="userMap">
select *
from t_user
</select>
字段名和属性名建立多对一映射
属性名
字段名
级联方式处理映射关系
mybatis代码
<resultMap id="userMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
<result property="user.password" column="password"></result>
<result property="user.gender" column="gender"></result>
<result property="user.admin" column="admin"></result>
</resultMap>
<!-- TestUser getUserById(@Param(value = "id") Integer id);-->
<select id="getUserById" resultMap="userMap">
select *
from t_user
where id = #id
</select>
association处理映射关系
<resultMap id="userMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
<association property="user" javaType="User">
<id property="password" column="password"></id>
<result property="gender" column="gender"></result>
<result property="admin" column="admin"></result>
</association>
</resultMap>
<!-- TestUser getUserById(@Param(value = "id") Integer id);-->
<select id="getUserById" resultMap="userMap">
select *
from t_user
where id = #id
</select>
分步查询处理映射关系
第二步的查询方式
<!-- User getUserByUserEmail(@Param(value = "email") String email);//通过邮箱查询用户信息-->
<select id="getUserByUserEmail" resultType="User">
select *
from t_user
where userEmail = #userEmail
</select>
通过第一步查询结果中的Email为条件,分步查询结果赋值给user属性。
<resultMap id="userMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
<association property="user" select="com.mybatis.mapper.UserMapper.getUserByUserEmail" column="userEmail"></association>
</resultMap>
<!-- TestUser getUserById(@Param(value = "id") Integer id);-->
<select id="getUserById" resultMap="userMap">
select *
from t_user
where id = #id
</select>
字段名和属性名建立一对多映射
属性名
collection处理映射关系
sql语句实际查询数据条数为3条
将根据userEmail字段在t_activity表中的查询到的数据放入到了activeFormList当中
<resultMap id="getUserMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
<collection property="activeFormList" ofType="ActiveForm">
<id property="activeId" column="activeId"></id>
<result property="activeAdminEmail" column="activeAdminEmail"></result>
<result property="activeAdminName" column="activeAdminName"></result>
</collection>
</resultMap>
<!-- TestUser getUser(@Param(value = "id") Integer id);-->
<select id="getUser" resultMap="getUserMap">
select *
from t_user
left join t_activity on t_user.userEmail = t_activity.activeAdminEmail
where t_user.id = #id
</select>
输出结果
分步查询处理映射关系
首先在t_user表中查询id为7的用户,然后根据用户的邮箱在t_activity表中以userEmail为条件查询
第二步的查询代码
<!-- List<ActiveForm> getActivityByUserEmail(@Param(value = "userEmail")String userEmail);//根据用户邮箱获取用户发布的活动-->
<select id="getActivityByUserEmail" resultType="ActiveForm">
select *
from t_activity
where activeAdminEmail = #activeAdminEmail
</select>
分步查询
<resultMap id="getUserMap" type="TestUser">
<id property="id" column="id"></id>
<result property="name" column="userName"></result>
<result property="email" column="userEmail"></result>
<collection property="activeFormList" fetchType="eager"
select="com.mybatis.mapper.ActivityMapper.getActivityByUserEmail" column="userEmail">
</collection>
</resultMap>
<!-- TestUser getUser(@Param(value = "id") Integer id);-->
<select id="getUser" resultMap="getUserMap">
select * from t_user where id = #id
</select>
动态SQL
if标签
if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中 的内容不会执行。
<!-- List<User> getUser(User user);-->
<select id="getUser" resultType="User">
select * from t_user where username=#username
<if test="userEmail != null and userEmail != '' ">
and userEmail = #userEmail
</if>
</select>
trim标签
trim用于去掉或添加标签中的内容,trim标签的功能比where标签的功能更强大,所以这里我只写另 trim标签,没有写where标签。
常用属性:
prefix:在trim标签中的内容的前面添加某些内容。
prefixOverrides:在trim标签中的内容的前面去掉某些内容。
suffix:在trim标签中的内容的后面添加某些内容。
suffixOverrides:在trim标签中的内容的后面去掉某些内容。
<!-- List<User> getUserByTrim(User user);-->
<select id="getUserByTrim" resultType="User">
select * from t_user
<trim prefix="where" prefixOverrides="and">
<if test="userEmail != null and userEmail != ''">
and userEmail = #userEmail
</if>
<if test="username != null and username != ''">
and username = #username
</if>
</trim>
</select>
choose、when、otherwise标签
和if () ... else if () ... else意思一样。不满足<when>标签的内容时,判断下一个<when>标签,满足条件就结束,都不满足执行<otherwise>标签中的内容。
<!-- List<User> getUserByChoose(User user);-->
<select id="getUserByChoose" resultType="User">
select * from t_user
<trim prefix="where">
<choose>
<when test="userEmail != null and userEmail != ''">
userEmail=#userEmail
</when>
<when test="username != null and username != ''">
userEmail=#userEmail
</when>
<otherwise>
id=#id
</otherwise>
</choose>
</trim>
</select>
foreach标签
常用属性:
collection:设置要循环的数组或集合。
item:表示集合或数组中的每一个数据。
separator:设置循环体之间的分隔符。
open:设置foreach标签中的内容的开始符。
close:设置foreach标签中的内容的结束符。
查询id为ids中的数的数据
<!-- List<ActiveForm> getActivityByForeach(Integer[] ids);-->
<select id="getActivityByForeach" resultType="ActiveForm">
select *
from t_activity
where activeId in
<foreach collection="ids" item="item" open="(" separator="," close=")">
#item
</foreach>
</select>
批量删除数据
<!-- int deleteActivityByForeach(@Param(value = "ids")Integer[] ids);-->
<delete id="deleteActivityByForeach">
delete from t_activity where activeId in
<foreach collection="ids" item="item" open="(" separator="," close=")">
#item
</foreach>
</delete>
批量添加数据
<!-- int insertActivityByForeach(@Param(value = "activeFormList") List<ActiveForm> activeFormList);-->
<insert id="insertActivityByForeach">
insert into t_activity values
<foreach collection="activeFormList" item="active" separator=",">
(null,#active.activeName,#active.acticeTime)
</foreach>
</insert>
sql标签
sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
<sql id="userSQL">id,username,password</sql>
<!-- User getUserByEmail(@Param(value = "email") String email);-->
<select id="getUserByEmail" resultType="User">
select <include refid="userSQL"></include>
from t_user
where userEmail = #email;
</select>
分页插件
Maven链接
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
sql代码
<!-- List<ActiveForm> getAllActive();-->
<select id="getAllActive" resultType="ActiveForm">
select *
from t_activity
</select>
测试代码
@Test
public void test9()
PageHelper.startPage(1, 5);//设置分页,从第1条数据到第5条数据
List<ActiveForm> allActive = mapper.getAllActive();
for (ActiveForm activeForm : allActive)
System.out.println(activeForm);
以上是关于Mybatis常用功能总结的主要内容,如果未能解决你的问题,请参考以下文章