前言
在第一部分实现完依赖和一些配置后,第二部分就实现一下mybatis-plus联表查询和批量删除
一对一联表查询操作
1.在联表的类中添加要链接的类
private User user;
2.修改一下toString,不然看不到
sb.append(", user=").append(user.toString());
3. 创建自定义方法mapper
@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
Page<Article> getAllInnerJoinUser(
IPage<?> page
, @Param("title") String title
, @Param("name") String name);
}
4. 编写对应mapper.xml文件的getAllInnerJoinUser方法
1.先写一个resultMap 实现多对一查询
<resultMap id="ResultMapAndUser" type="com.aslife.server.entity.Article">
<id property="aid" column="aid" jdbcType="BIGINT"/>
<result property="title" column="title" jdbcType="VARCHAR"/>
<result property="text" column="text" jdbcType="VARCHAR"/>
<result property="img" column="img" jdbcType="VARCHAR"/>
<result property="goods" column="goods" jdbcType="BIGINT"/>
<result property="uid" column="uid" jdbcType="BIGINT"/>
<result property="deleted" column="deleted" jdbcType="TINYINT"/>
<!--关联单个对象要使用association-->
<association property="user" autoMapping="true">
<id property="uid" column="uid" jdbcType="BIGINT"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="headimg" column="headimg" jdbcType="VARCHAR"/>
<result property="sex" column="sex" jdbcType="VARCHAR"/>
<result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="role" column="role" jdbcType="TINYINT"/>
<result property="deleted" column="deleted" jdbcType="TINYINT"/>
</association>
</resultMap>
2.实现getAllInnerJoinUser的sql
<select id="getAllInnerJoinUser" resultType="com.aslife.server.entity.Article" resultMap="ResultMapAndUser">
SELECT
article.aid,
article.title,
article.text,
article.img,
article.goods,
article.deleted,
`user`.*
FROM
article
INNER JOIN
`user`
ON
article.uid = `user`.uid
WHERE
article.title like #{title,jdbcType=VARCHAR} AND
`user`.`name` like #{name,jdbcType=VARCHAR} AND
article.deleted = 0
</select>
5. 实现service
1. serviceImpl
@Override
@Cacheable(cacheNames = "getArticleAll")
public Page<Article> getAll(int pageNo,int pageNum,String title, String name){
Page<Article> page = new Page<>(pageNo,pageNum);
return mapper.getAllInnerJoinUser(page,"%"+title+"%","%"+name+"%");
}
2. service
Page<Article> getAll(int pageNo, int pageNum , String title, String name);
6. 实现controller
@GetMapping("/getAll")
public ResponseData getAll(@ApiParam(value = "起始页面") @RequestParam(required = false,value = "page",defaultValue = "1")Integer pageNo,
@ApiParam(value = "每页记录数") @RequestParam(required = false,value = "limit",defaultValue = "10")Integer pageSize,
@ApiParam(value = "作者名字") @RequestParam(required = false,value = "name",defaultValue ="")String name,
@ApiParam(value = "作者名字") @RequestParam(required = false,value = "title",defaultValue ="")String title){
ResponseData responseData = new ResponseData();
responseData.setData(service.getAll(pageNo,pageSize,title,name));
return responseData;
}
7. 接口测试
8. 修改article.html
9.测试网页
批量删除
1. 先创建一个config类,来帮助我们清理redis缓存
@Configuration
public class RedisConfig {
/**
* 自定义Key为String类型Value为Object类型的Redis操作模板
*/
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// key采用String的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
// hash的key也采用String的序列化方式
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
2. 在Service中添加batchDeleted方法
int batchDeleted(List<String> ids);
3. 在ServiceImpl中编写batchDeleted的方法
@Override
@Transactional
public int batchDeleted(List<String> ids) {
if (mapper.deleteBatchIds(ids)==ids.size()){
Set<String> keys = redisTemplate.keys("getArticleAll*");
redisTemplate.delete(keys);
return 1;
}
throw new RuntimeException("没有删除成功");
}
4. 在Controller中编写batchRemove
@DeleteMapping("/batchRemove/{ids}")
public ResponseData batchRemove(@ApiParam(value = "编号数组") @PathVariable("ids")String ids){
ResponseData responseData = new ResponseData();
List<String> idsList = new ArrayList<>();
String[] strIds = ids.split(",");
Collections.addAll(idsList, strIds);
try {
service.batchDeleted(idsList);
}catch (RuntimeException r){
responseData.setCode(1);
responseData.setMsg(r.getMessage());
return responseData;
}
return responseData;
}
5. 前端后台页面修改
修改成自己对应的id名
这个判断要重写
其他说明
- mybatis-plus中使用自定义mapper时,在参数里加一个IPage类型来实现分页,例如:
Page<User> get( IPage<?> page );
- 当对数据库进行操作时要使用事务,例如@Transactional。
- 使用事务时抛出异常会回滚但程序就不会return了,所以要捕捉异常然后完成程序,例如:
try {
运行的内容;
}catch (RuntimeException r){
错误时操作;
return responseData;
}
总结
下一部分写修改和增加的内容。