Mybatis generator 1.4.x 入门教程--转载
生活随笔
收集整理的這篇文章主要介紹了
Mybatis generator 1.4.x 入门教程--转载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Mybatis generator 1.4.x 入門教程
一、前言
? 最近因為公司開了新的項目,所以在構建骨架的時候發現mybatis最新的版本已經更新到了1.4.0了,嘗試了一下,比起之前的mybatis版本,有了更好的優化,用上了lamada表達式,還支持動態sql查詢,所以在這里安利一波,因為之前我用的Laravel ORM,所以比較習慣使用這種lamada表達式來查詢,可能之前用習慣了以前的查詢方式的
二、官方文檔地址
官方文檔地址
三、集成 mybatis Generator 1.4.0
pom文件
?
<!-- dependencies 依賴 --> <dependencies>...<!-- 這里需要引入 動態sql相關的包--><!-- https://mvnrepository.com/artifact/org.mybatis.dynamic-sql/mybatis-dynamic-sql --><dependency><groupId>org.mybatis.dynamic-sql</groupId><artifactId>mybatis-dynamic-sql</artifactId><version>1.1.4</version></dependency> </dependencies> <!-- build 相關配置 --> <build> <plugins> ... <!--mybatis自動生成代碼--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><dependencies></dependencies><configuration><!-- 這里設置配置文件的位置 --><configurationFile>src/main/resources/mybatis/configuration.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin> </plugins> </build>配置文件 mybatis configuration.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"> <!--配置參考 http://mybatis.org/generator/configreference/xmlconfig.html--> <generatorConfiguration><!-- 屬性配置文件 --><properties resource="mybatis/db.properties"/><classPathEntry location="${jdbc.jar.path}"/><context id="testTables"defaultModelType="flat"><plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin><commentGenerator><!-- 是否去除自動生成的注釋 true:是 : false:否 --><property name="suppressAllComments" value="true"/></commentGenerator><!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼,這里配置的是mysql的,當然也可以配置oracle等數據庫 --><jdbcConnection driverClass="${jdbc.driver}"connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"></jdbcConnection><!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL和 NUMERIC 類型解析為java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- targetProject:生成PO類的位置 --><javaModelGenerator targetPackage="com.xxx.entity" targetProject="src/main/java"><!-- enableSubPackages:是否讓schema作為包的后綴 --><property name="enableSubPackages" value="true"/><!-- 從數據庫返回的值被清理前后的空格 --><property name="trimStrings" value="true"/></javaModelGenerator><!-- targetPackage:mapper接口生成的位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.xxx.mapper"targetProject="src/main/java"><!-- enableSubPackages:是否讓schema作為包的后綴 --><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 指定數據庫表 --><table tableName="xxx" schema="xxx"></table></context> </generatorConfiguration>配置屬性文件 db.properties
?
jdbc.jar.path=/Users/xxx/.m2/repository/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://xxx:xxx:xxx:xxx:port/dbname?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&verifyServerCertificate=false jdbc.username=username jdbc.password=password ...四、執行generator生成 dao類和mapper接口
- 生成dao類中每個屬性會自動加上@Generated
?
生成的dao類
- 生成的mapper接口類,會自動生成Mapper和DynamicSqlSupport
?
五、使用舉例
- Dao實例
5.1 查找
源碼
// 根據provider查詢多個記錄@Generated("org.mybatis.generator.api.MyBatisGenerator")@SelectProvider(type=SqlProviderAdapter.class, method="select")@ResultMap("TeacherResult")Optional<Teacher> selectOne(SelectStatementProvider selectStatement);// 根據provider查詢多個記錄@Generated("org.mybatis.generator.api.MyBatisGenerator")@SelectProvider(type=SqlProviderAdapter.class, method="select")@Results(id="TeacherResult", value = {@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),@Result(column="teacher_number", property="teacherNumber", jdbcType=JdbcType.VARCHAR),@Result(column="teacher_name", property="teacherName", jdbcType=JdbcType.VARCHAR),@Result(column="telephone", property="telephone", jdbcType=JdbcType.VARCHAR),@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),@Result(column="password", property="password", jdbcType=JdbcType.VARCHAR),@Result(column="deleted", property="deleted", jdbcType=JdbcType.BIT),@Result(column="created_time", property="createdTime", jdbcType=JdbcType.TIMESTAMP),@Result(column="updated_time", property="updatedTime", jdbcType=JdbcType.TIMESTAMP)})List<Teacher> selectMany(SelectStatementProvider selectStatement);// 根據dsl 查詢單個記錄@Generated("org.mybatis.generator.api.MyBatisGenerator")default Optional<Teacher> selectOne(SelectDSLCompleter completer) {return MyBatis3Utils.selectOne(this::selectOne, selectList, teacher, completer);} // 根據dsl 查詢多個記錄@Generated("org.mybatis.generator.api.MyBatisGenerator")default List<Teacher> select(SelectDSLCompleter completer) {return MyBatis3Utils.selectList(this::selectMany, selectList, teacher, completer);}@Generated("org.mybatis.generator.api.MyBatisGenerator")default List<Teacher> selectDistinct(SelectDSLCompleter completer) {return MyBatis3Utils.selectDistinct(this::selectMany, selectList, teacher, completer);} // 根據主鍵查詢記錄@Generated("org.mybatis.generator.api.MyBatisGenerator")default Optional<Teacher> selectByPrimaryKey(Integer id_) {return selectOne(c ->c.where(id, isEqualTo(id_)));}實例
// 基本條件查詢@Overridepublic Teacher findById(Integer teacherId) {Optional<Teacher> teacher = teacherMapper.selectOne(c ->c.where(TeacherDynamicSqlSupport.deleted, isEqualTo(false)).and(TeacherDynamicSqlSupport.id, isEqualTo(teacherId)));if (teacher.isPresent()){return teacher.get();}return null;}// 條件查詢分頁@Overridepublic List<Teacher> getListByPager(TeacherSearchModel model) {QueryExpressionWhereBuilder builder = select(TeacherDynamicSqlSupport.teacher.allColumns()).from(TeacherDynamicSqlSupport.teacher).where(TeacherDynamicSqlSupport.deleted, isEqualTo(false));if (!StringUtils.isEmpty(model.getNumberKeyWord())){builder.and(TeacherDynamicSqlSupport.teacherNumber,isLike(model.getNumberKeyWord()));}if (!StringUtils.isEmpty(model.getNameKeyWord())){builder.and(TeacherDynamicSqlSupport.teacherName,isLike(model.getNameKeyWord()));}builder.limit(model.getPageSize()).offset(((model.getPageNumber()-1)*model.getPageSize()));SelectStatementProvider provider = builder.build().render(RenderingStrategy.MYBATIS3);List<Teacher> teachers = teacherMapper.selectMany(provider);return teachers;}5.2 更新
源碼
// 根據provide更新@Generated("org.mybatis.generator.api.MyBatisGenerator")@UpdateProvider(type=SqlProviderAdapter.class, method="update")int update(UpdateStatementProvider updateStatement);@Generated("org.mybatis.generator.api.MyBatisGenerator")default int update(UpdateDSLCompleter completer) {return MyBatis3Utils.update(this::update, teacher, completer);}@Generated("org.mybatis.generator.api.MyBatisGenerator")static UpdateDSL<UpdateModel> updateAllColumns(Teacher record, UpdateDSL<UpdateModel> dsl) {return dsl.set(id).equalTo(record::getId).set(teacherNumber).equalTo(record::getTeacherNumber).set(teacherName).equalTo(record::getTeacherName).set(telephone).equalTo(record::getTelephone).set(email).equalTo(record::getEmail).set(password).equalTo(record::getPassword).set(deleted).equalTo(record::getDeleted).set(createdTime).equalTo(record::getCreatedTime).set(updatedTime).equalTo(record::getUpdatedTime);}@Generated("org.mybatis.generator.api.MyBatisGenerator")static UpdateDSL<UpdateModel> updateSelectiveColumns(Teacher record, UpdateDSL<UpdateModel> dsl) {return dsl.set(id).equalToWhenPresent(record::getId).set(teacherNumber).equalToWhenPresent(record::getTeacherNumber).set(teacherName).equalToWhenPresent(record::getTeacherName).set(telephone).equalToWhenPresent(record::getTelephone).set(email).equalToWhenPresent(record::getEmail).set(password).equalToWhenPresent(record::getPassword).set(deleted).equalToWhenPresent(record::getDeleted).set(createdTime).equalToWhenPresent(record::getCreatedTime).set(updatedTime).equalToWhenPresent(record::getUpdatedTime);}// 通過主鍵更新數據@Generated("org.mybatis.generator.api.MyBatisGenerator")default int updateByPrimaryKey(Teacher record) {return update(c ->c.set(teacherNumber).equalTo(record::getTeacherNumber).set(teacherName).equalTo(record::getTeacherName).set(telephone).equalTo(record::getTelephone).set(email).equalTo(record::getEmail).set(password).equalTo(record::getPassword).set(deleted).equalTo(record::getDeleted).set(createdTime).equalTo(record::getCreatedTime).set(updatedTime).equalTo(record::getUpdatedTime).where(id, isEqualTo(record::getId)));}// 通過主鍵條件更新數據@Generated("org.mybatis.generator.api.MyBatisGenerator")default int updateByPrimaryKeySelective(Teacher record) {return update(c ->c.set(teacherNumber).equalToWhenPresent(record::getTeacherNumber).set(teacherName).equalToWhenPresent(record::getTeacherName).set(telephone).equalToWhenPresent(record::getTelephone).set(email).equalToWhenPresent(record::getEmail).set(password).equalToWhenPresent(record::getPassword).set(deleted).equalToWhenPresent(record::getDeleted).set(createdTime).equalToWhenPresent(record::getCreatedTime).set(updatedTime).equalToWhenPresent(record::getUpdatedTime).where(id, isEqualTo(record::getId)));}實例
@Overridepublic int update(Teacher teacher) {return teacherMapper.updateByPrimaryKeySelective(teacher);}5.3 添加(插入)
源碼
// 直接完整插入@Generated("org.mybatis.generator.api.MyBatisGenerator")@InsertProvider(type=SqlProviderAdapter.class, method="insert")int insert(InsertStatementProvider<Teacher> insertStatement);@Generated("org.mybatis.generator.api.MyBatisGenerator")@InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple")int insertMultiple(MultiRowInsertStatementProvider<Teacher> multipleInsertStatement);// 直接完整插入@Generated("org.mybatis.generator.api.MyBatisGenerator")default int insert(Teacher record) {return MyBatis3Utils.insert(this::insert, record, teacher, c ->c.map(id).toProperty("id").map(teacherNumber).toProperty("teacherNumber").map(teacherName).toProperty("teacherName").map(telephone).toProperty("telephone").map(email).toProperty("email").map(password).toProperty("password").map(deleted).toProperty("deleted").map(createdTime).toProperty("createdTime").map(updatedTime).toProperty("updatedTime"));}@Generated("org.mybatis.generator.api.MyBatisGenerator")default int insertMultiple(Collection<Teacher> records) {return MyBatis3Utils.insertMultiple(this::insertMultiple, records, teacher, c ->c.map(id).toProperty("id").map(teacherNumber).toProperty("teacherNumber").map(teacherName).toProperty("teacherName").map(telephone).toProperty("telephone").map(email).toProperty("email").map(password).toProperty("password").map(deleted).toProperty("deleted").map(createdTime).toProperty("createdTime").map(updatedTime).toProperty("updatedTime"));}// 條件部分插入@Generated("org.mybatis.generator.api.MyBatisGenerator")default int insertSelective(Teacher record) {return MyBatis3Utils.insert(this::insert, record, teacher, c ->c.map(id).toPropertyWhenPresent("id", record::getId).map(teacherNumber).toPropertyWhenPresent("teacherNumber", record::getTeacherNumber).map(teacherName).toPropertyWhenPresent("teacherName", record::getTeacherName).map(telephone).toPropertyWhenPresent("telephone", record::getTelephone).map(email).toPropertyWhenPresent("email", record::getEmail).map(password).toPropertyWhenPresent("password", record::getPassword).map(deleted).toPropertyWhenPresent("deleted", record::getDeleted).map(createdTime).toPropertyWhenPresent("createdTime", record::getCreatedTime).map(updatedTime).toPropertyWhenPresent("updatedTime", record::getUpdatedTime));}實例
?
@Overridepublic int create(Teacher teacher) {return teacherMapper.insertSelective(teacher);}5.4 刪除
源碼
@Generated("org.mybatis.generator.api.MyBatisGenerator")@DeleteProvider(type=SqlProviderAdapter.class, method="delete")int delete(DeleteStatementProvider deleteStatement);@Generated("org.mybatis.generator.api.MyBatisGenerator")default int delete(DeleteDSLCompleter completer) {return MyBatis3Utils.deleteFrom(this::delete, teacher, completer);}@Generated("org.mybatis.generator.api.MyBatisGenerator")default int deleteByPrimaryKey(Integer id_) {return delete(c -> c.where(id, isEqualTo(id_)));}5.5 查詢數量 Count
源碼
@Generated("org.mybatis.generator.api.MyBatisGenerator")@SelectProvider(type=SqlProviderAdapter.class, method="select")long count(SelectStatementProvider selectStatement);@Generated("org.mybatis.generator.api.MyBatisGenerator")@SelectProvider(type=SqlProviderAdapter.class, method="select")long count(SelectStatementProvider selectStatement);@Generated("org.mybatis.generator.api.MyBatisGenerator")default long count(CountDSLCompleter completer) {return MyBatis3Utils.countFrom(this::count, teacher, completer);}實例
// 這里比較坑的是select的參數是count,如果是其他的會報錯@Overridepublic long getCountByModel(TeacherSearchModel model) {QueryExpressionWhereBuilder builder = select(count()).from(TeacherDynamicSqlSupport.teacher).where(TeacherDynamicSqlSupport.deleted, isEqualTo(false));if (!StringUtils.isEmpty(model.getNumberKeyWord())){ builder.and(TeacherDynamicSqlSupport.teacherNumber,isLike(model.getNumberKeyWord()));}if (!StringUtils.isEmpty(model.getNameKeyWord())){builder.and(TeacherDynamicSqlSupport.teacherName,isLike(model.getNameKeyWord()));}SelectStatementProvider provider = builder.build().render(RenderingStrategy.MYBATIS3);long count = teacherMapper.count(provider);return count;}5.6 查詢條件
| isNull/isNotNull | 是否為空/不為空 |
| isEqualTo/isNotEqualTo | 是否等于/不等于 |
| isEqualToWhenPresent/isNotEqualToWhenPresent | 當存在時是否(不)等于 |
| isGreaterThan/isGreaterThanWhenPresent | 大于 |
| isGreaterThanOrEqualTo/isGreaterThanOrEqualToWhenPresent | 大于等于 |
| isLessThan/isLessThanWhenPresent/ | 小于 |
| isLessThanOrEqualTo/isLessThanOrEqualToWhenPresent | 小于等于 |
| isIn/isNotIn | in操作 |
| isInWhenPresent/isNotInWhenPresent | in操作 |
| isBetween/isNotBetween | 是否在區間 |
| isBetweenWhenPresent/isNotBetweenWhenPresent | 是否在區間 |
| isLike/isNotLike | like(需要添加%) |
| isLikeWhenPresent/isNotLikeWhenPresent | like(需要添加%) |
| isTrue/isFalse | 是否是true/false |
| isLikeCaseInsensitive/isLikeCaseInsensitiveWhenPresent | like(需要添加%) |
| isNotLikeCaseInsensitive/isNotLikeCaseInsensitiveWhenPresent | like(需要添加%) |
| isInCaseInsensitive/isInCaseInsensitiveWhenPresent | in操作 |
| isNotInCaseInsensitive/isNotInCaseInsensitiveWhenPresent | in操作 |
六、自定義查詢
6.1 自定義mapper接口查詢
@Generated(value = "org.mybatis.generator.api.MyBatisGenerator",comments = "Source Table: user")@SelectProvider(type = SqlProviderAdapter.class,method = "select")@Results(id="UserVOResult", value = {@Result(column="id", property="id", jdbcType= JdbcType.VARCHAR, id=true),@Result(column="user_name", property="userName", jdbcType=JdbcType.VARCHAR),@Result(column="gender", property="gender", jdbcType=JdbcType.BIT),@Result(column="avatar", property="avatar", jdbcType=JdbcType.VARCHAR),@Result(column="mobile", property="mobile", jdbcType=JdbcType.VARCHAR),@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),@Result(column="organization_name", property="organizationName", jdbcType=JdbcType.VARCHAR),@Result(column="real_name", property="realName", jdbcType=JdbcType.VARCHAR),@Result(column="main_organization", property="mainOrganization", jdbcType=JdbcType.INTEGER),@Result(column="organization", property="organization", jdbcType=JdbcType.VARCHAR),@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP)})List<UserVO> selectManyJoin(SelectStatementProvider selectStatementProvider);6.2 自定義sql解析器查詢
import java.util.regex.Matcher; import java.util.regex.Pattern;import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.scripting.LanguageDriver; import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; import org.apache.ibatis.session.Configuration;/*** 解析sql語句該類主要用作select*/ public class SimpleSelectInLangDriver extends XMLLanguageDriver implements LanguageDriver {private static final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");@Overridepublic SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {Matcher matcher = inPattern.matcher(script);if (matcher.find()) {script = matcher.replaceAll("<foreach collection=\"$1\" item=\"_item\" open=\"(\" "+ "separator=\",\" close=\")\" >#{_item}</foreach>");}script = "<script>" + script + "</script>";return super.createSqlSource(configuration, script, parameterType);} }?
import java.util.regex.Matcher; import java.util.regex.Pattern;import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.scripting.LanguageDriver; import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; import org.apache.ibatis.session.Configuration;/*** 解析sql語句*/ public class SimpleUpdateLangDriver extends XMLLanguageDriver implements LanguageDriver{private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");@Overridepublic SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) { // Matcher matcher = inPattern.matcher(script); // if (matcher.find()) { // StringBuilder sb = new StringBuilder(); // sb.append("<set>"); // // sb.append("<if test=\"name != null \"> name = #{name},</if>"); // sb.append("<if test=\"price != null \"> price = #{price},</if>");/* for (Field field : parameterType.getDeclaredFields()) {String tmp = "<if test=\"_field != null\">_column=#{_field},</if>";sb.append(tmp.replaceAll("_field", field.getName()).replaceAll("_column",CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName())));}*/// sb.deleteCharAt(sb.lastIndexOf(",")); // sb.append("</set>");// script = matcher.replaceAll(sb.toString()); // script = "<script>" + script + "</script>"; // }return super.createSqlSource(configuration, script, parameterType);} }?
import cn.jhunicom.visitor.miniapp.model.entity.mysql.UserBaseEntity; import cn.jhunicom.visitor.miniapp.utils.SimpleSelectInLangDriver; import cn.jhunicom.visitor.miniapp.utils.SimpleUpdateLangDriver; import org.apache.ibatis.annotations.Lang; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update;import java.util.List;public interface UserBaseEntityMapperExt extends UserBaseEntityMapper {@Select("SELECT * FROM user_base")@Lang(SimpleSelectInLangDriver.class)List<UserBaseEntity> selectUserEntity();@Select("SELECT * FROM user_base WHERE `name` NOT IN (SELECT name FROM user_base WHERE id IN (#{idList}))")@Lang(SimpleSelectInLangDriver.class)List<UserBaseEntity> getUserByIdInBatch(@Param("idList") List<String> idList);@Update("UPDATE user_base set name = #{name} WHERE id = #{id}")@Lang(SimpleUpdateLangDriver.class)void updateUsersById(UserBaseEntity userBaseEntity); }七、bug記錄
7.1 in操作的坑
isIn/isNotIn/isInCaseInsensitive/isInCaseInsensitiveWhenPresent/isNotInCaseInsensitive/isNotInCaseInsensitiveWhenPresent 操作中,如果給的List(獲取其他可迭代對象)為空的話,這個條件就不生效了。
- 例如你要進行如下操作
- mybatis 中寫法
- bug
如果userIds 不為空(length = 0)的話,sql 語句是對的,如果userIds為空的話,sql語句就變成select * from user 了。÷
?
總結
以上是生活随笔為你收集整理的Mybatis generator 1.4.x 入门教程--转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map反转key value
- 下一篇: 将文件转为stream流_NIO之文件I