# 使用mybatis自动生成的代码 ## 1 内容概要 1. 代码自动生成的文件说明 2. 自动代码生成,关于主键自增序列的处理 3. 如何使用Example做sql操作 > 此系列文章主旨是说明怎样在springboot环境下用好mybatis,提高效率。而非深入的讲解原理。 ## 2.代码自动生成的文件说明 可以看到自动生成了四个文件 1. MessageMapper.java,持久层api操作接口 2. MessageMapper.xml ,动态sql配置文件 3. Message的实体类,POJO,Java bean,与数据库表字段一一对应 3. MessageExample,数据库单表操作模板,Example可以理解为“条件”。可以作为"查询条件","更新条件“,”删除条件“! > 注意:一旦数据库表结构发生变化,需要重新生成4个文件!请先删除xml,如:MessageMapper.xml ,因为追加不覆盖导致报错. 也是基于这个原因,开发规范:自动生成的代码不允许修改,因为数据库可能变化重新生成,导致修改部分的代码丢失。 另外数据库表需要设置主键,mysql通常设置id为主键,自增。否则生成的代码及方法数量会减少。 ``` public interface MessageMapper { //根据"条件"做count(*) int countByExample(MessageExample example); //根据"条件"删除记录 int deleteByExample(MessageExample example); //根据表主键删除记录 int deleteByPrimaryKey(Long id); //插入一条完整记录,record对象的所有属性都将插入数据库 int insert(Message record); //插入一条记录,只插入record对象中不为空的属性。 int insertSelective(Message record); //查询符合"条件"的对象列表 List<Message> selectByExample(MessageExample example); //根据主键查询对象 Message selectByPrimaryKey(Long id); //根据example将record中不为空的属性更新到数据库中 int updateByExampleSelective(@Param("record") Message record, @Param("example") MessageExample example); //根据example将record中所有属性更新到数据库中(所有值覆盖) //一旦record属性为空,对应的数据库字段不允许为空,则异常 int updateByExample(@Param("record") Message record, @Param("example") MessageExample example); //根据主键将record中不为空的属性更新到数据库中 int updateByPrimaryKeySelective(Message record); //根据主键将record中所有属性更新到数据库中(所有值覆盖) int updateByPrimaryKey(Message record); } ``` ## 3.如何使用Example做sql操作 自动生成的代码比较适合单表简单的sql操作。 1. 不适用于多表关联查询, 2. 不建议用于带OR的,带IN的,带Exists关系的sql处理。 ### 3.1增加insert 1.创建增加的对象,并设置要增加对象的内容 ``` SysUser sysUser = new SysUser(); sysUser.setUserId(userId); sysUser.setUserName(userName); int count = userMapper.insertSelective(sysUser); ``` > 注意 xxxxmapper中有两个insert方法,其中insertSelective是选择性插入,即:字段有值插入,空字段不做sql插入处理。 如下SQL,sys_user表除了user_id,user_name还有其他字段 2.同样作用的sql ``` INSERT INTO sys_user (user_id,user_name) VALUES (#{userId},#{userName}); ``` ### 3.2删除Delete 1.创建要删除的模板,并设置删除条件 ``` SysUserExample userExample = new SysUserExample(); userExample.createCriteria().andUserIdEqualTo(userId); userExample.createCriteria().andUserNameEqualTo(userName); int count = userMapper.deleteByExample(userExample ) ``` 2.同样作用的sql ``` DELETE FROM sys_user where user_id = #{userId} AND user_name = #{userName}; ``` ### 3.3修改update 1.创建修改的对象,并设置要修改对象的内容 ``` SysUser sysUser = new SysUser(); sysUser.setUserName(userName); ``` 2.创建要修改条件的模板,并设置修改的条件 ``` SysUserExample userExample = new SysUserExample(); userExample.createCriteria().andUserIdEqualTo(userId); int count = userMapper.updateByExample(sysUser,userExample); ``` 3.同样作用的sql ``` update sys_user set user_name = #{userName} where user_id = #{userId} ``` ### 3.4简单查询 1.创建查询的模板并设置查询的条件 ``` SysUserExample userExample = new SysUserExample(); userExample.createCriteria().andUserIdEqualTo(userId); //根据查询获取登录人信息 SysUser myself = userMapper.selectByExample(userExample).get(0); ``` 2.同样作用的sql ``` SELECT id,user_id,user_name,`password`,org_id,role_id, phone,address FROM sys_user WHERE user_id = 'dhadmin'; ```