一、mybatis-generator的基本配置与使用
使用mybatis-generator来生成常用的dao层类与xml,可以满足基础的增删改查功能
1. 添加pom依赖,常用的几个依赖包
org.mybatis.generator mybatis-generator-core 1.3.7 com.github.pagehelper pagehelper-spring-boot-starter 1.2.3 org.mybatis mybatis 3.5.0
2. 在resource下添加配置文件
generator.properties 数据库连接信息
jdbc.driverClass=com.mysql.jdbc.Driver jdbc.connectionURL=jdbc:mysql://192.168.90.221:33010/mall jdbc.userId=root jdbc.password=123456
generatorConfig.xml :生成器的一些基础配置在这里设置
3. 配置java运行类,用于生成dao层
CommentGenerator.java :生成类中注释相关的配置
package com.macro.mall; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.internal.DefaultCommentGenerator; import org.mybatis.generator.internal.util.StringUtility; import java.util.Properties; /** * 自定义注释生成器 * https://gitee.com/zscat-platform/mall on 2018/4/26. */ public class CommentGenerator extends DefaultCommentGenerator { private boolean addRemarkComments = false; /** * 设置用户配置的参数 */ @Override public void addConfigurationProperties(Properties properties) { super.addConfigurationProperties(properties); this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments")); } /** * 给字段添加注释 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { String remarks = introspectedColumn.getRemarks(); //根据参数和备注信息判断是否添加备注信息 if (addRemarkComments && StringUtility.stringHasValue(remarks)) { //文档注释开始 field.addJavaDocLine("/**"); //获取数据库字段的备注信息 String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { field.addJavaDocLine(" * " + remarkLine); } addJavadocTag(field, false); field.addJavaDocLine(" */"); } } }
Generator.java :执行器,运行该类来进行代码的生成
package com.macro.mall; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class Generator { public static void main(String[] args) throws Exception { //MBG 执行过程中的警告信息 Listwarnings = new ArrayList (); //当生成的代码重复时,覆盖原代码 boolean overwrite = true; //读取我们的 MBG 配置文件 InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); is.close(); DefaultShellCallback callback = new DefaultShellCallback(overwrite); //创建 MBG MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); //执行生成代码 myBatisGenerator.generate(null); //输出警告信息 for (String warning : warnings) { System.out.println(warning); } } }
4. 执行Generator类用于生成具体的dao层中相关的文件,常用4个文件,model类,xml文件,Dao接口,Example类
示例中的代码将生成以下几个文件:具体内容我就不展示了。小伙伴们自己拿个数据表试一下就知道了
AlmGoodsSift.java :自动将数据库中下划线分隔的表名转换为驼峰命名的java实体类
AlmGoodsSiftExample.java :封装了一下增删改查优化的方法
AlmGoodsSiftMapper.java : 接口类
AlmGoodsSiftMapper.xml : sql语句
5. 常用的方法
5.1 查询举例使用 example条件分页查询 , 单表查询使用Example配置条件基本都可以满足了
public ListpageSift(PageParam pageParam) { //使用PageHelper来传递分页参数 PageHelper.startPage(pageParam.getPageNum(),pageParam.getPageSize(),true); AlmGoodsSiftExample goodsSiftExample = new AlmGoodsSiftExample(); AlmGoodsSiftExample.Criteria goodsSiftExampleCriteria = goodsSiftExample.createCriteria(); // 查询status与deleteStatus指定值 goodsSiftExampleCriteria.andStatusEqualTo(GoodsSiftStatusEnum.NORMAL.getCode()); goodsSiftExampleCriteria.andDeleteStatusEqualTo(DeleteStatusEnum.Normal.getValue()); // 可配置排序条件 goodsSiftExample.setOrderByClause("sort_time desc"); return goodsSiftMapper.selectByExample(goodsSiftExample); }
5.2 插入就不在多述了,调用insert方法即可,条件更新与删除
// 使用主键来更新,只更新参数中不为null的值 public void updateGoods(Long id) { AlmGoodsSift status2Delete = new AlmGoodsSift(); status2Delete.setId(id); status2Delete.setDeleteStatus(DeleteStatusEnum.Delete.getValue()); goodsSiftMapper.updateByPrimaryKeySelective(status2Delete); } // 使用example来更新,example配置查询条件,实体类中指定要更新的字段值 public void updateGoods(Long id) { AlmGoodsSift status2Delete = new AlmGoodsSift(); status2Delete.setDeleteStatus(DeleteStatusEnum.Delete.getValue()); AlmGoodsSiftExample goodsSiftExample = new AlmGoodsSiftExample(); AlmGoodsSiftExample.Criteria goodsSiftExampleCriteria = goodsSiftExample.createCriteria(); goodsSiftExampleCriteria.andIdEqualTo(id); goodsSiftMapper.updateByExampleSelective(status2Delete,goodsSiftExample); } // 删除的话调用以下方法即可 goodsSiftMapper.deleteByExample(goodsSiftExample); goodsSiftMapper.deleteByPrimaryKey(id);
5.3 注意方法名updateByExampleSelective中包含selective单词,意思是传递参数中有值的话就更新,为null不做任何处理,对于有些同学要将字段值置为null值的操作,selective就满足不了你了,使用不带 selective 的方法注意了,将全字段更新
二、使用自定义Dao来更新数据:使用mybatis生成工具只能满足简单的操作,复杂的sql语句还是得自己写
1. 配置自定义dao接口,基于生成的mapper,可以省去很多重复的配置性代码
1.1 新建DTO用来代替实体类,有时候实体类的属性满足不了业务,查询联表时,还会返回关联对象的数据,或者自定义属性数据。(示例中包含了对象与列表对象)
package com.macro.mall.alm.dto;
import com.macro.mall.alm.model.AlmGoodsSift; import com.macro.mall.pms.model.PmsProduct; import com.macro.mall.sms.model.SmsCoupon; import lombok.Data; import java.util.List; @Data public class GoodsSiftDTO extends AlmGoodsSift { /** * 名称 */ private String goodsName; /** * 图片 */ private String goodsPic; /** * 商品信息 */ private PmsProduct product; /** * 优惠券列表 */ private Listcoupons; }
1.2 新建接口 AlmGoodsSiftDao.java文件
package com.macro.mall.alm.mapper; import com.macro.mall.alm.dto.GoodsSiftDTO; import java.util.List; public interface AlmGoodsSiftDao { // 自定义参数,自定义返回对象 ListlistGoodsSiftDTO(GoodsSiftDTO goodsSiftDTO); }
1.3 新建xml配置文件,AlmGoodsSiftDao.xml ,编写 listGoodsSiftDTO方法的sql语句,用到了 association、collection,联表查询不外乎这几种情况,使用以上配置基本上都可以满足业务需求了
1.4 dao接口多参数传递,普通参数+集合参数
// 查询集合范围内的数据 void listInIds(@Param("goodsId") Long goodsId, @Param("ids") Listids);
对应xml的sql配置
ok,以上就是小弟在日常工作环境中比较常用的例子了,基本上能够满足日常开发需求了~~~~~~