mybatis generator 的日常使用
一、mybatis-generator的基本配置與使用
使用mybatis-generator來生成常用的dao層類與xml,可以滿足基礎的增刪改查功能
1. 新增pom依賴,常用的幾個依賴包
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.0</version> </dependency>
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 :生成器的一些基礎配置在這裡設定
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <properties resource="generator.properties"/> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <!-- 為模型生成序列化方法--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <!-- 為生成的Java模型建立一個toString方法 --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!--覆蓋生成XML檔案--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> <commentGenerator type="com.macro.mall.CommentGenerator"> <!-- 是否去除自動生成的註釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.connectionURL}" userId="${jdbc.userId}" password="${jdbc.password}"> </jdbcConnection> <javaModelGenerator targetPackage="com.macro.mall.alm.model" targetProject="mall-mbg\src\main\java"/> <sqlMapGenerator targetPackage="com.macro.mall.alm.mapper" targetProject="mall-mbg\src\main\resources"/> <javaClientGenerator type="XMLMAPPER" targetPackage="com.macro.mall.alm.mapper" targetProject="mall-mbg\src\main\java"/> <!--生成全部表tableName設為%--> <table tableName="alm_goods_sift"> <generatedKey column="id" sqlStatement="MySql" identity="true"/> </table> </context> </generatorConfiguration>
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 執行過程中的警告資訊 List<String> warnings = new ArrayList<String>(); //當生成的程式碼重複時,覆蓋原始碼 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 List<AlmGoodsSift> pageSift(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 List<SmsCoupon> coupons; }
1.2 新建介面 AlmGoodsSiftDao.java檔案
package com.macro.mall.alm.mapper; import com.macro.mall.alm.dto.GoodsSiftDTO; import java.util.List; public interface AlmGoodsSiftDao { // 自定義引數,自定義返回物件 List<GoodsSiftDTO> listGoodsSiftDTO(GoodsSiftDTO goodsSiftDTO); }
1.3 新建xml配置檔案,AlmGoodsSiftDao.xml ,編寫listGoodsSiftDTO方法的sql語句,用到了association、collection,聯表查詢不外乎這幾種情況,使用以上配置基本上都可以滿足業務需求了
<?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="com.macro.mall.alm.mapper.AlmGoodsSiftDao">
<!-- resultMap繼承AlmGoodsSiftMapper的BaseResultMap配置 --> <resultMap id="GoodsSiftResultMap" type="com.macro.mall.alm.dto.GoodsSiftDTO" extends="com.macro.mall.alm.mapper.AlmGoodsSiftMapper.BaseResultMap"> <!--dto中自定義的屬性對映--> <result column="goods_name" jdbcType="VARCHAR" property="goodsName" /> <result column="goods_pic" jdbcType="VARCHAR" property="goodsPic" /> <!--關聯物件--> <association property="product" resultMap="com.macro.mall.pms.mapper.PmsProductMapper.BaseResultMap" columnPrefix="p_" /> <!--關聯集合--> <collection property="coupons" columnPrefix="c_" resultMap="com.macro.mall.sms.mapper.SmsCouponMapper.BaseResultMap"></collection> </resultMap> <select id="listGoodsSiftDTO" parameterType="com.macro.mall.alm.dto.GoodsSiftDTO" resultMap="GoodsSiftResultMap"> select -- 返回goods_name、goods_pic的值,欄位名稱與配置中column名稱匹配上即可 ags.name goods_name , ags.pic goods_pic -- 返回alm_goods_sift的所有欄位資訊,resultMap繼承了AlmGoodsSiftMapper的配置,所以這裡無需重複定義對映關係 ags.* , -- product表的欄位都用p_開頭重新命名,會使用resultMap中相應的配置進行轉換 pp.name p_name , pp.price p_price , pp.sale p_sale ,pp.status p_status , pp.stock p_stock ,pp.note p.note, pp.freight p_freight , -- coupon表的欄位都用c_開頭重新命名 sc.note c_note, sc.code s_code , sc.amount s_amount sc.start_time s_start_time ,sc.end_time s_end_time from alm_goods_sift ags -- 與product表的關係是一對一,使用association來配置,將結果對映為dto中的一個物件屬性 left join pms_product pp on pp.id = ags.productId -- 與coupon表的關係是一對多,使用collection來配置,結果將封裝成集合 left join sms_coupon sc on sc.coupon_id = ags.coupon_id </select> </mapper>
1.4 dao介面多引數傳遞,普通引數+集合引數
// 查詢集合範圍內的資料 void listInIds(@Param("goodsId") Long goodsId, @Param("ids") List<Long> ids);
對應xml的sql配置
<select id="listInIds"> select * from alm_goods_sift ags where ags.good_id=#{goodsId} and ags.id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </select>
ok,以上就是小弟在日常工作環境中比較常用的例子了,基本上能夠滿足日常開發需求了~~~~~~