三.三 编写 UserMapper.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="top.yueshushu.learn.mapper.UserMapper"> <insert id="batchAdd"> insert into user(name,sex,age,description) values <foreach collection="userList" item="user" open="" close="" separator=","> (#{user.name},#{user.sex},#{user.age},#{user.description}) </foreach> </insert> <update id="batchUpdate"> <foreach collection="userList" item="user" open="" close="" separator=";"> update user set name=#{user.name},sex=#{user.sex}, age=#{user.age},description=#{user.description} where id=#{user.id} </foreach> </update> <delete id="batchDeleteByIds"> delete from user where id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete> </mapper>
三.四 修改 Service 和对应的实现类
定义的方法,与 Mybatis 项目时的方法,基本一致。
UserService.java 接口
public interface UserService { void addUser(User user); void updateUser(User user); void deleteUser(int id); void saveUser(User user); void batchAddUser(List<User> userList); void batchUpdateUser(List<User> userList); void batchDeleteByIds(List<Integer> ids); User findById(int id); List<User> findAll(); List<User> findAllByIds(List<Integer> ids); Long count(); List<User> findByNameSexAndDesc(User user); }
UserServiceImpl 实现类
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public void addUser(User user) { userMapper.insert(user); } @Override public void updateUser(User user) { userMapper.updateById(user); } @Override public void deleteUser(int id) { userMapper.deleteById(id); } @Override public void saveUser(User user) { userMapper.insert(user); } @Override public void batchAddUser(List<User> userList) { userMapper.batchAdd(userList); } @Override public void batchUpdateUser(List<User> userList) { userMapper.batchUpdate(userList); } @Override public void batchDeleteByIds(List<Integer> ids) { userMapper.batchDeleteByIds(ids); } @Override public User findById(int id) { return userMapper.selectById(id); } @Override public List<User> findAll() { return userMapper.selectList(null); } @Override public List<User> findAllByIds(List<Integer> ids) { return userMapper.selectBatchIds(ids); } @Override public Long count() { return Long.valueOf(userMapper.selectCount(null)); } @Override public List<User> findByNameSexAndDesc(User user) { // 注意查询的方式,用的是 QueryWrapper 接口 QueryWrapper<User> queryWrapper=new QueryWrapper<User>(); queryWrapper.like(!StringUtils.isEmpty(user.getName()),"name",user.getName()); queryWrapper.eq(!StringUtils.isEmpty(user.getSex()),"sex",user.getSex()); queryWrapper.eq(!StringUtils.isEmpty(user.getDescription()),"description", user.getDescription()); return userMapper.selectList(queryWrapper); } }
三.五 MyBatisTests 测试实现
@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) @Log4j2 public class MyBatisTests { @Autowired private UserService userService; @Test public void insertTest(){ //1. 构建对象 User user=new User(); user.setName("欢欢"); user.setAge(22); user.setSex("女"); user.setDescription("一个非常可爱的女孩纸"); //2. 添加方法 userService.addUser(user); log.info("添加成功,{}",user); } @Test public void updateTest(){ //1. 构建对象 User user=new User(); user.setId(1); //id不存在,会添加 user.setName("欢欢"); user.setDescription("岳泽霖最好的朋友"); //2. 修改方法 userService.updateUser(user); log.info("修改成功,{}",user); } @Test public void deleteTest(){ userService.deleteUser(16); } // 批量添加,批量修改操作。 @Test public void saveTest(){ //1. 构建对象 User user=new User(); user.setId(2); user.setName("欢欢A"); user.setDescription("岳泽霖最好的朋友"); //2. 修改方法 userService.saveUser(user); log.info("添加或者修改成功,{}",user); } @Test public void batchAddTest(){ //1. 构建对象 User user=new User(); user.setName("小欢欢"); user.setAge(22); user.setSex("女"); user.setDescription("一个小坏蛋"); User user1=new User(); user1.setName("小泽霖"); user1.setAge(25); user1.setSex("男"); user1.setDescription("一个大坏蛋"); //这是修改的操作,id=2已经存在这条记录了。 User user2=new User(); user2.setName("岳泽霖"); user2.setAge(25); user2.setSex("男性"); user2.setDescription("一个快乐的程序员"); //2. 放置到集合里面 List<User> userList=new ArrayList<>(); userList.add(user); userList.add(user1); userList.add(user2); userService.batchAddUser(userList); } @Test public void batchUpdateTest(){ //1. 构建对象 User user=new User(); user.setId(2); user.setName("小欢欢A"); user.setAge(22); user.setSex("女"); user.setDescription("一个小坏蛋"); User user1=new User(); user1.setId(3); user1.setName("小泽霖A"); user1.setAge(25); user1.setSex("男"); user1.setDescription("一个大坏蛋"); // User user2=new User(); user2.setId(4); user2.setName("岳泽霖A"); user2.setAge(25); user2.setSex("男性"); user2.setDescription("一个快乐的程序员"); //2. 放置到集合里面 List<User> userList=new ArrayList<>(); userList.add(user); userList.add(user1); userList.add(user2); userService.batchUpdateUser(userList); } @Test public void batchDeleteTest(){ List<Integer> ids= Arrays.asList(3,4,6); userService.batchDeleteByIds(ids); } @Test public void findByIdTest(){ User user=userService.findById(2); log.info(user); } @Test public void findAllTest(){ List<User> userList=userService.findAll(); userList.forEach(n->log.info(n)); } @Test public void findByIdsTest(){ List<Integer> ids= Arrays.asList(2,4,6); List<User> userList=userService.findAllByIds(ids); userList.forEach(n->log.info(n)); } @Test public void countTest(){ Long count=userService.count(); log.info("总数目{}",count); } @Test public void nameAndSexAndDescTest(){ User user=new User(); user.setName("小欢欢A"); user.setSex("女"); user.setAge(27); user.setDescription("小坏蛋"); List<User> userList=userService.findByNameSexAndDesc(user); userList.forEach(n->log.info(n)); } }
这些方法,是可以运行的,数据库表里面的数据也会同步进行更新。
基础的 Crud 功能实现完成
四. 自动填充 创建时间和修改时间功能
在公司业务里面,每一个表都有 创建时间,修改时间。 希望这两个字段 create_time, update_time 可以由系统进行处理,并不是由调用者进行手动处理。
四.一 数据库表 user 添加相应字段
-- 添加开始时间和修改时间字段, 用于验证自动插入 -- 修改数据库中表结构 ALTER TABLE user ADD column create_time TIMESTAMP null COMMENT '记录插入时间'; ALTER TABLE user ADD column update_time TIMESTAMP null COMMENT '记录修改时间'; -- 更新所有表中数据 UPDATE user SET create_time=NOW(); UPDATE user SET update_time=NOW();
四.二 User.java 添加属性
public class User implements Serializable { /** * @param id id编号 * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param description 描述 */ @TableId(value="id",type = IdType.AUTO) private Integer id; @TableField(value="name") private String name; @TableField(value="sex") private String sex; @TableField(value="age") private Integer age; @TableField(value="description") private String description; /*处理自动插入创建时间,自动更新修改时间*/ @TableField(value="create_time",fill = FieldFill.INSERT) private Date createTime; @TableField(value="update_time",fill = FieldFill.UPDATE) private Date updateTime; }
createTime 和 updateTime 上面 的注解 @TableField 注解上面,添加 fill 属性,
public enum FieldFill { /** * 默认不处理 */ DEFAULT, /** * 插入时填充字段 */ INSERT, /** * 更新时填充字段 */ UPDATE, /** * 插入和更新时填充字段 */ INSERT_UPDATE }
四.三 实现元对象 MetaObject 处理器
@Component @Log4j2 public class FillDateHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("createTime 字段插入开始日期"); //3.3.0 及其以上的写法。 createTime 对应的是类中属性名称,所以创建时间的那个字段要想自动填入,必须是 createTime // 可以会多个字段设置自动填充值。 this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); } @Override public void updateFill(MetaObject metaObject) { log.info("updateTime 字段更新修改日期"); //3.3.0 及其以上的写法。 updateTime 对应的是类中属性名称,所以创建时间的那个字段要想自动填入,必须是 updateTime this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } }