国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

MyBatis官方代碼生成工具給力(解放雙手)

瀏覽:70日期:2023-10-20 15:35:31
摘要

在我們使用MyBatis的過程中,如果所有實體類和單表CRUD代碼都需要手寫,那將會是一件相當麻煩的事情。MyBatis官方代碼生成器MyBatis Generator可以幫助我們解決這個問題,在我的開源項目mall中也是使用的這個代碼生成器,用習慣了也挺不錯的。本文將介紹MyBatis Generator的使用方法及使用技巧,希望對大家有所幫助!

簡介

MyBatis Generator(簡稱MBG)是MyBatis官方提供的代碼生成工具。可以通過數據庫表直接生成實體類、單表CRUD代碼、mapper.xml文件,從而解放我們的雙手!

開始使用

首先我們通過一個入門示例將MBG用起來,該示例會包含基礎的CRUD操作。

集成MBG

在 pom.xml 中添加如下依賴,主要添加了MyBatis、PageHelper、Druid、MBG和MySQL驅動等依賴;

<dependencies> <!--SpringBoot整合MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--MyBatis分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!--集成druid連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- MyBatis 生成器 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> <!--Mysql數據庫驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency></dependencies>

在application.yml中對數據源和MyBatis的mapper.xml文件路徑進行配置,這里做個約定,MBG生成的放在resources/com/**/mapper目錄下,自定義的放在resources/dao目錄下;

# 數據源配置spring: datasource: url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root# MyBatis mapper.xml路徑配置mybatis: mapper-locations: - classpath:dao/*.xml - classpath*:com/**/mapper/*.xml

添加Java配置,用于掃碼Mapper接口路徑,這里還有個約定,MBG生成的放在 mapper 包下,自定義的放在 dao 包下。

/** * MyBatis配置類 * Created by macro on 2019/4/8. */@Configuration@MapperScan({'com.macro.mall.tiny.mbg.mapper','com.macro.mall.tiny.dao'})public class MyBatisConfig {}使用代碼生成器

在使用MBG生成代碼前,我們還需要對其進行一些配置,首先在 generator.properties 文件中配置好數據庫連接信息;

jdbc.driverClass=com.mysql.cj.jdbc.Driverjdbc.connectionURL=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaijdbc.userId=rootjdbc.password=root

然后在 generatorConfig.xml 文件中對MBG進行配置,配置屬性說明直接參考注釋即可;

<?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 targetRuntime='MyBatis3' defaultModelType='flat'> <property name='beginningDelimiter' value='`'/> <property name='endingDelimiter' value='`'/> <property name='javaFileEncoding' value='UTF-8'/> <!--生成mapper.xml時覆蓋原文件--> <plugin type='org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin' /> <!-- 為模型生成序列化方法--> <plugin type='org.mybatis.generator.plugins.SerializablePlugin'/> <!-- 為生成的Java模型創建一個toString方法 --> <plugin type='org.mybatis.generator.plugins.ToStringPlugin'/> <!--可以自定義生成model的代碼注釋--> <commentGenerator type='com.macro.mall.tiny.mbg.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}'> <!--解決mysql驅動升級到8.0后不生成指定數據庫代碼的問題--> <property name='nullCatalogMeansCurrent' value='true' /> </jdbcConnection> <!--指定生成model的路徑--> <javaModelGenerator targetPackage='com.macro.mall.tiny.mbg.model' targetProject='mall-tiny-generatorsrcmainjava'/> <!--指定生成mapper.xml的路徑--> <sqlMapGenerator targetPackage='com.macro.mall.tiny.mbg.mapper' targetProject='mall-tiny-generatorsrcmainresources'/> <!--指定生成mapper接口的的路徑--> <javaClientGenerator type='XMLMAPPER' targetPackage='com.macro.mall.tiny.mbg.mapper'targetProject='mall-tiny-generatorsrcmainjava'/> <!--生成全部表tableName設為%--> <table tableName='ums_admin'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_role'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_admin_role_relation'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_resource'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_resource_category'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> </context></generatorConfiguration>

這里值得一提的是 targetRuntime 這個屬性,設置不同的屬性生成的代碼和生成代碼的使用方式會有所不同,常用的有 MyBatis3 和 MyBatis3DynamicSql 兩種,這里使用的是 MyBatis3 ;

如果你想自定義MBG生成的代碼的話,可以自己寫一個CommentGenerator來繼承DefaultCommentGenerator,這里我自定義了實體類代碼的生成,添加了Swagger注解的支持;

package com.macro.mall.tiny.mbg;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.dom.java.CompilationUnit;import org.mybatis.generator.api.dom.java.Field;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;import org.mybatis.generator.internal.DefaultCommentGenerator;import org.mybatis.generator.internal.util.StringUtility;import java.util.Properties;/** * 自定義注釋生成器 * Created by macro on 2018/4/26. */public class CommentGenerator extends DefaultCommentGenerator { private boolean addRemarkComments = false; private static final String EXAMPLE_SUFFIX='Example'; private static final String MAPPER_SUFFIX='Mapper'; private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME='io.swagger.annotations.ApiModelProperty'; /** * 設置用戶配置的參數 */ @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)){ //數據庫中特殊字符需要轉義 if(remarks.contains(''')){ remarks = remarks.replace(''','’'); } //給model的字段添加swagger注解 field.addJavaDocLine('@ApiModelProperty(value = ''+remarks+'')'); } } @Override public void addJavaFileComment(CompilationUnit compilationUnit) { super.addJavaFileComment(compilationUnit); //只在model中添加swagger注解類的導入 String fullyQualifiedName = compilationUnit.getType().getFullyQualifiedName(); if(!fullyQualifiedName.contains(MAPPER_SUFFIX)&&!fullyQualifiedName.contains(EXAMPLE_SUFFIX)){ compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME)); } }}

最后我們寫個Generator類用于生成代碼,直接運行main方法即可生成所有代碼;

/** * 用于生產MBG的代碼 * Created by macro on 2018/4/26. */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); } }}

一切準備就緒,執行main方法,生成代碼結構信息如下。

MyBatis官方代碼生成工具給力(解放雙手)

實現基本的CRUD操作

這里使用的是 mall-tiny 項目中權限管理功能相關表,具體可以參考 《還在從零開始搭建項目?手擼了款快速開發腳手架!》 。

查看下MBG生成的Mapper接口,發現已經包含了基本的CRUD方法,具體SQL實現也已經在mapper.xml中生成了,單表CRUD直接調用對應方法即可;

public interface UmsAdminMapper { long countByExample(UmsAdminExample example); int deleteByExample(UmsAdminExample example); int deleteByPrimaryKey(Long id); int insert(UmsAdmin record); int insertSelective(UmsAdmin record); List<UmsAdmin> selectByExample(UmsAdminExample example); UmsAdmin selectByPrimaryKey(Long id); int updateByExampleSelective(@Param('record') UmsAdmin record, @Param('example') UmsAdminExample example); int updateByExample(@Param('record') UmsAdmin record, @Param('example') UmsAdminExample example); int updateByPrimaryKeySelective(UmsAdmin record); int updateByPrimaryKey(UmsAdmin record);}

生成代碼中有一些Example類,比如UmsAdminExample,我們可以把它理解為一個條件構建器,用于構建SQL語句中的各種條件;

MyBatis官方代碼生成工具給力(解放雙手)

利用好MBG生成的代碼即可完成單表的CRUD操作了,比如下面最常見的操作。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Autowired private UmsAdminMapper adminMapper; @Autowired private UmsAdminDao adminDao; @Override public void create(UmsAdmin entity) { adminMapper.insert(entity); } @Override public void update(UmsAdmin entity) { adminMapper.updateByPrimaryKeySelective(entity); } @Override public void delete(Long id) { adminMapper.deleteByPrimaryKey(id); } @Override public UmsAdmin select(Long id) { return adminMapper.selectByPrimaryKey(id); } @Override public List<UmsAdmin> listAll(Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); return adminMapper.selectByExample(new UmsAdminExample()); }}進階使用

想要用好MBG,上面的基礎操作是不夠的,還需要一些進階的使用技巧。

條件查詢

使用Example類構建查詢條件可以很方便地實現條件查詢。

這里以按用戶名和狀態查詢后臺用戶并按創建時間降序排列為例,SQL實現如下;

SELECTid,username,PASSWORD,icon,email,nick_name,note,create_time,login_time,STATUS FROMums_admin WHERE( username = ’macro’ AND STATUS IN ( 0, 1 ) ) ORDER BYcreate_time DESC;

對應的Java代碼實現如下。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public List<UmsAdmin> list(Integer pageNum, Integer pageSize, String username, List<Integer> statusList) { PageHelper.startPage(pageNum, pageSize); UmsAdminExample umsAdminExample = new UmsAdminExample(); UmsAdminExample.Criteria criteria = umsAdminExample.createCriteria(); if(StrUtil.isNotEmpty(username)){ criteria.andUsernameEqualTo(username); } criteria.andStatusIn(statusList); umsAdminExample.setOrderByClause('create_time desc'); return adminMapper.selectByExample(umsAdminExample); }}子查詢

使用MBG生成的代碼并不能實現子查詢,需要自己手寫SQL實現。

這里以按角色ID查詢后臺用戶為例,首先定義一個UmsAdminDao接口,這里約定下Dao里面存放的方法都是自定義SQL實現的方法,首先在Dao接口中添加 subList 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { List<UmsAdmin> subList(@Param('roleId') Long roleId);}

然后創建一個UmsAdminDao.xml文件,對應UmsAdminDao接口的SQL實現,寫好對應的SQL實現,注意使用的resultMap MBG已經幫我們生成好了,無需自己手寫。

<select resultMap='com.macro.mall.tiny.mbg.mapper.UmsAdminMapper.BaseResultMap'> SELECT * FROM ums_admin WHERE id IN (SELECT admin_id FROM ums_admin_role_relation WHERE role_id = #{roleId})</select>Group和Join查詢

Group和Join查詢也不能使用MBG生成的代碼實現。

這里以按角色統計后臺用戶數量為例,首先在Dao接口中添加 groupList 方法;

public interface UmsAdminDao { List<RoleStatDto> groupList();}

然后在mapper.xml中添加對應的SQL實現,我們可以通過給查詢出來的列起別名,直接把列映射到resultType所定義的對象中去。

<select resultType='com.macro.mall.tiny.domain.RoleStatDto'> SELECT ur.id AS roleId, ur.NAME AS roleName, count(ua.id) AS count FROM ums_role ur LEFT JOIN ums_admin_role_relation uarr ON ur.id = uarr.role_id LEFT JOIN ums_admin ua ON uarr.admin_id = ua.id GROUP BY ur.id;</select>條件刪除

條件刪除很簡單,直接使用Example類構造刪除條件即可。

這里以按用戶名刪除后臺用戶為例,SQL實現如下;

DELETE FROMums_admin WHEREusername = ’andy’;

對應Java中的實現為。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public void deleteByUsername(String username) { UmsAdminExample example = new UmsAdminExample(); example.createCriteria().andUsernameEqualTo(username); adminMapper.deleteByExample(example); }}條件修改

條件刪除很簡單,直接使用Example類構造修改條件,然后傳入修改參數即可。

這里以按指定ID修改后臺用戶的狀態為例,SQL實現如下;

UPDATE ums_admin SET STATUS = 1 WHEREid IN ( 1, 2 );

對應Java中的實現為。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public void updateByIds(List<Long> ids, Integer status) { UmsAdmin record = new UmsAdmin(); record.setStatus(status); UmsAdminExample example = new UmsAdminExample(); example.createCriteria().andIdIn(ids); adminMapper.updateByExampleSelective(record,example); }}一對多查詢

一對多查詢無法直接使用MBG生成的代碼實現,需要手寫SQL實現,并使用resultMap來進行結果集映射。

這里以按ID查詢后臺用戶信息(包含對應角色列表)為例,先在Dao接口中添加 selectWithRoleList 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { AdminRoleDto selectWithRoleList(@Param('id') Long id);}

然后在mapper.xml中添加對應的SQL實現,這里有個小技巧,可以給角色表查詢出來的列取個別名,添加一個 role_ 前綴;

<select resultMap='AdminRoleResult'> SELECT ua.*, ur.id AS role_id, ur.NAME AS role_name, ur.description AS role_description, ur.create_time AS role_create_time, ur.STATUS AS role_status, ur.sort AS role_sort FROM ums_admin ua LEFT JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_id LEFT JOIN ums_role ur ON uarr.role_id = ur.id WHERE ua.id = #{id}</select>

然后定義一個叫做AdminRoleResult的ResultMap,通過collection標簽直接將以role_開頭的列映射到UmsRole對象中去即可。

<resultMap type='com.macro.mall.tiny.domain.AdminRoleDto' extends='com.macro.mall.tiny.mbg.mapper.UmsAdminMapper.BaseResultMap'> <collection property='roleList' resultMap='com.macro.mall.tiny.mbg.mapper.UmsRoleMapper.BaseResultMap' columnPrefix='role_'> </collection></resultMap>一對一查詢

一對一查詢無法直接使用MBG生成的代碼實現,需要手寫SQL實現,并使用resultMap來進行結果集映射。

這里以按ID查詢資源信息(包括分類信息)為例,先在Dao接口中添加 selectResourceWithCate 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { ResourceWithCateDto selectResourceWithCate(@Param('id')Long id);}

然后在mapper.xml中添加對應的SQL實現,可以給分類表查詢出來的列取個別名,添加一個 cate_ 前綴;

<select resultMap='ResourceWithCateResult'> SELECT ur.*, urc.id AS cate_id, urc.`name` AS cate_name, urc.create_time AS cate_create_time, urc.sort AS cate_sort FROM ums_resource ur LEFT JOIN ums_resource_category urc ON ur.category_id = urc.id WHERE ur.id = #{id}</select>

然后定義一個叫做ResourceWithCateResult的ResultMap,通過association標簽直接將以cate_開頭的列映射到UmsResourceCategory對象中去即可。

<resultMap type='com.macro.mall.tiny.domain.ResourceWithCateDto' extends='com.macro.mall.tiny.mbg.mapper.UmsResourceMapper.BaseResultMap'> <association property='resourceCategory' resultMap='com.macro.mall.tiny.mbg.mapper.UmsResourceCategoryMapper.BaseResultMap' columnPrefix='cate_'> </association></resultMap>總結

總的來說MyBatis官方代碼生成器MBG還是很強大的,可以生成一些常用的單表CRUD方法,減少了我們的工作量。但是對于子查詢、多表查詢和一些復雜查詢支持有點偏弱,依然需要在mapper.xml中手寫SQL實現。

參考資料

官方文檔:https://mybatis.org/generator/index.html

項目源碼地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-generator

到此這篇關于MyBatis官方代碼生成工具給力(解放雙手)的文章就介紹到這了,更多相關MyBatis官方代碼生成工具內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 久久久久琪琪去精品色村长 | 欧美亚洲日本在线 | 91国在线视频| 免费看美女毛片 | 美国一级毛片片aa成人 | 成人久久 | 欧美一级高清视频在线播放 | 99久久综合 | 在线亚洲精品国产波多野结衣 | 大片在线播放日本一级毛片 | 亚洲第一中文字幕 | 一道精品视频一区二区三区图片 | 18videosex性欧美69超高清 | 国产精品女在线观看 | 国产欧美一区二区三区在线 | 日本www视频在线观看 | 国产免费午夜a无码v视频 | 国产永久高清免费动作片www | 亚洲欧美18v中文字幕高清 | 天天澡天天碰天天狠伊人五月 | 精品免费久久久久国产一区 | 国产aⅴ一区二区三区 | 亚洲欧美一区二区三区在饯 | 欧美一区二区三区在线观看 | 国产成人一区二区三区影院免费 | 日韩 欧美 中文 亚洲 高清 在线 | 国产成人精品天堂 | 欧美黑人巨大最猛性xxxxx | 国产成人精品日本亚洲语音2 | 国产精品 色| 亚洲欧美高清在线 | 国产黄三级三·级三级 | 日本精品久久久久中文字幕 1 | 国产一区亚洲一区 | 日本三级s级在线播放 | 欧美大片国产在线永久播放 | 日韩经典在线观看 | 揉揉胸摸腿摸下面va视频 | 草草久久97超级碰碰碰免费 | 鲁老汉精品视频在线观看 | 一级毛片免费 |