Mybatis Generator 使用手册
第一章 什么是Mybatis Generator?
MyBatis Generator Core – Introduction to MyBatis Generator
MyBatis生成器(MBG)是MyBatis框架的代码生成工具。它支持为所有版本的MyBatis生成代码,通过解析数据库表(或多个表)结构,自动生成用于访问这些表的相关组件。这有效减轻了手动配置对象和配置文件以实现数据库表交互的初始繁琐工作。MBG主要致力于简化大量基础性的数据库操作——即常见的增删改查(CRUD)操作。但对于涉及联合查询或存储过程等复杂场景,仍需开发者手动编写SQL和对象。
尽管限制新版本的MBG可以生成带注解版本(不包含xml)的Java代码,但是注解实现复杂场景(表join查询)时不是太方便,所以一般推荐使用传统版本的xml配置文件进行映射。
第二章 Mybatis Generator 各版本的功能?
我们主要使用的两个版本:
MyBatis3DynamicSQL:可生成不带xml配置的Java注解版代码。
Mybatis3:生成传统的使用XML进行映射的访问数据库代码。
Runtime | MyBatis Generator Version | MyBatis Version | MyBatis Dynamic SQL Version |
---|---|---|---|
MyBatis3, MyBatis3Simple | Any | 3.0+ | N/A |
MyBatis3DynamicSQL | 1.3.6 - 1.3.7 | 3.4.2+ | 1.1.0 - 1.2.1 |
MyBatis3DynamicSQL, MyBatis3Kotlin | 1.4.0 | 3.4.2+ | 1.1.3+ |
MyBatis3DynamicSQL | 1.4.1+ | 3.4.2+ | 1.3.1+ |
MyBatis3Kotlin | 1.4.1+ | 3.4.2+ | 1.4.0+ |
通常我们使用maven插件来进行代码的生成,多次运行代码Mybatis Generator的处理方式。
注意:当Mapper.java或者Mapper.xml有改动时,默认情况下时自动合并xml文件(保留已经修改的内容),但是Mapper.java会生成一个新的带版本的java文件(比如Mapper.java.1),需要手动合并。
比较推荐的做法是:使用原生的生成文件不做任何改动,需要修改时使用MapperExt.java, MapperExt.xml进行修改。这样省去了合并代码的工作。
第三章 怎样使用Mybatis Genrator?
3.1.引入依赖
<dependencies><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version><scope>provided</scope></dependency><!-- MyBatis 核心依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><!-- MySQL 连接器依赖 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.4.0</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.11.4</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version><configuration><configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile></configuration><dependencies><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.4.0</version></dependency></dependencies></plugin></plugins></build>
此处数据库默认使用的MySQL,所以引入mysql的driver. 同时使用maven运行mybatis generator,加入maven mybatis-generator-maven-plugin.
3.2 加入配置文件
配置文件名称: mybatis-generator-config.xml
<!DOCTYPE generatorConfiguration PUBLIC"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><context id="mybatis3" targetRuntime="MyBatis3"><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test_db"userId="user_name"password="my_password"/><javaModelGenerator targetPackage="com.my.model" targetProject="src/main/java"/><sqlMapGenerator targetPackage="com.my.mapper" targetProject="src/main/resources"/><javaClientGenerator type="XMLMAPPER" targetPackage="com.my.mapper" targetProject="src/main/java"/><table tableName="t_user" domainObjectName="User" /><table tableName="t_teacher" domainObjectName="Teacher" /><table tableName="t_student" domainObjectName="Student" /></context>
</generatorConfiguration>
根据配置文件中的内容,修改自己的数据库连接信息,需要放置的包名称,需要生成的表名称。
3.运行命令
mvn mybatis-generator:generate
然后代码就自动生成了。就可以完美的进行单表操作了。
第四章 生成代码的使用?
生成的Mapper.xml就不看了,写得很棒很专业。我们需要看看Mapper.java 和Example类,这样可以知道生成的类怎样使用?
4.1 UserExample类
下面以User的Example类进行说明,该类的含义和使用。
package com.my.model;import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class UserExample {/*** This field was generated by MyBatis Generator.* This field corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/protected String orderByClause;/*** This field was generated by MyBatis Generator.* This field corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/protected boolean distinct;/*** This field was generated by MyBatis Generator.* This field corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/protected List<Criteria> oredCriteria;/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public UserExample() {oredCriteria = new ArrayList<>();}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setOrderByClause(String orderByClause) {this.orderByClause = orderByClause;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public String getOrderByClause() {return orderByClause;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void setDistinct(boolean distinct) {this.distinct = distinct;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public boolean isDistinct() {return distinct;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public List<Criteria> getOredCriteria() {return oredCriteria;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void or(Criteria criteria) {oredCriteria.add(criteria);}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Criteria or() {Criteria criteria = createCriteriaInternal();oredCriteria.add(criteria);return criteria;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public Criteria createCriteria() {Criteria criteria = createCriteriaInternal();if (oredCriteria.size() == 0) {oredCriteria.add(criteria);}return criteria;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/protected Criteria createCriteriaInternal() {Criteria criteria = new Criteria();return criteria;}/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public void clear() {oredCriteria.clear();orderByClause = null;distinct = false;}/*** This class was generated by MyBatis Generator.* This class corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/protected abstract static class GeneratedCriteria {protected List<Criterion> criteria;protected GeneratedCriteria() {super();criteria = new ArrayList<>();}public boolean isValid() {return criteria.size() > 0;}public List<Criterion> getAllCriteria() {return criteria;}public List<Criterion> getCriteria() {return criteria;}protected void addCriterion(String condition) {if (condition == null) {throw new RuntimeException("Value for condition cannot be null");}criteria.add(new Criterion(condition));}protected void addCriterion(String condition, Object value, String property) {if (value == null) {throw new RuntimeException("Value for " + property + " cannot be null");}criteria.add(new Criterion(condition, value));}protected void addCriterion(String condition, Object value1, Object value2, String property) {if (value1 == null || value2 == null) {throw new RuntimeException("Between values for " + property + " cannot be null");}criteria.add(new Criterion(condition, value1, value2));}public Criteria andUserIdIsNull() {addCriterion("USER_ID is null");return (Criteria) this;}public Criteria andUserIdIsNotNull() {addCriterion("USER_ID is not null");return (Criteria) this;}public Criteria andUserIdEqualTo(Integer value) {addCriterion("USER_ID =", value, "userId");return (Criteria) this;}public Criteria andUserIdNotEqualTo(Integer value) {addCriterion("USER_ID <>", value, "userId");return (Criteria) this;}public Criteria andUserIdGreaterThan(Integer value) {addCriterion("USER_ID >", value, "userId");return (Criteria) this;}public Criteria andUserIdGreaterThanOrEqualTo(Integer value) {addCriterion("USER_ID >=", value, "userId");return (Criteria) this;}public Criteria andUserIdLessThan(Integer value) {addCriterion("USER_ID <", value, "userId");return (Criteria) this;}public Criteria andUserIdLessThanOrEqualTo(Integer value) {addCriterion("USER_ID <=", value, "userId");return (Criteria) this;}public Criteria andUserIdIn(List<Integer> values) {addCriterion("USER_ID in", values, "userId");return (Criteria) this;}public Criteria andUserIdNotIn(List<Integer> values) {addCriterion("USER_ID not in", values, "userId");return (Criteria) this;}public Criteria andUserIdBetween(Integer value1, Integer value2) {addCriterion("USER_ID between", value1, value2, "userId");return (Criteria) this;}public Criteria andUserIdNotBetween(Integer value1, Integer value2) {addCriterion("USER_ID not between", value1, value2, "userId");return (Criteria) this;}public Criteria andUserNameIsNull() {addCriterion("USER_NAME is null");return (Criteria) this;}public Criteria andUserNameIsNotNull() {addCriterion("USER_NAME is not null");return (Criteria) this;}public Criteria andUserNameEqualTo(String value) {addCriterion("USER_NAME =", value, "userName");return (Criteria) this;}public Criteria andUserNameNotEqualTo(String value) {addCriterion("USER_NAME <>", value, "userName");return (Criteria) this;}public Criteria andUserNameGreaterThan(String value) {addCriterion("USER_NAME >", value, "userName");return (Criteria) this;}public Criteria andUserNameGreaterThanOrEqualTo(String value) {addCriterion("USER_NAME >=", value, "userName");return (Criteria) this;}public Criteria andUserNameLessThan(String value) {addCriterion("USER_NAME <", value, "userName");return (Criteria) this;}public Criteria andUserNameLessThanOrEqualTo(String value) {addCriterion("USER_NAME <=", value, "userName");return (Criteria) this;}public Criteria andUserNameLike(String value) {addCriterion("USER_NAME like", value, "userName");return (Criteria) this;}public Criteria andUserNameNotLike(String value) {addCriterion("USER_NAME not like", value, "userName");return (Criteria) this;}public Criteria andUserNameIn(List<String> values) {addCriterion("USER_NAME in", values, "userName");return (Criteria) this;}public Criteria andUserNameNotIn(List<String> values) {addCriterion("USER_NAME not in", values, "userName");return (Criteria) this;}public Criteria andUserNameBetween(String value1, String value2) {addCriterion("USER_NAME between", value1, value2, "userName");return (Criteria) this;}public Criteria andUserNameNotBetween(String value1, String value2) {addCriterion("USER_NAME not between", value1, value2, "userName");return (Criteria) this;}public Criteria andAgeIsNull() {addCriterion("AGE is null");return (Criteria) this;}public Criteria andAgeIsNotNull() {addCriterion("AGE is not null");return (Criteria) this;}public Criteria andAgeEqualTo(Integer value) {addCriterion("AGE =", value, "age");return (Criteria) this;}public Criteria andAgeNotEqualTo(Integer value) {addCriterion("AGE <>", value, "age");return (Criteria) this;}public Criteria andAgeGreaterThan(Integer value) {addCriterion("AGE >", value, "age");return (Criteria) this;}public Criteria andAgeGreaterThanOrEqualTo(Integer value) {addCriterion("AGE >=", value, "age");return (Criteria) this;}public Criteria andAgeLessThan(Integer value) {addCriterion("AGE <", value, "age");return (Criteria) this;}public Criteria andAgeLessThanOrEqualTo(Integer value) {addCriterion("AGE <=", value, "age");return (Criteria) this;}public Criteria andAgeIn(List<Integer> values) {addCriterion("AGE in", values, "age");return (Criteria) this;}public Criteria andAgeNotIn(List<Integer> values) {addCriterion("AGE not in", values, "age");return (Criteria) this;}public Criteria andAgeBetween(Integer value1, Integer value2) {addCriterion("AGE between", value1, value2, "age");return (Criteria) this;}public Criteria andAgeNotBetween(Integer value1, Integer value2) {addCriterion("AGE not between", value1, value2, "age");return (Criteria) this;}public Criteria andCreatedTimeIsNull() {addCriterion("CREATED_TIME is null");return (Criteria) this;}public Criteria andCreatedTimeIsNotNull() {addCriterion("CREATED_TIME is not null");return (Criteria) this;}public Criteria andCreatedTimeEqualTo(Date value) {addCriterion("CREATED_TIME =", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeNotEqualTo(Date value) {addCriterion("CREATED_TIME <>", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeGreaterThan(Date value) {addCriterion("CREATED_TIME >", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeGreaterThanOrEqualTo(Date value) {addCriterion("CREATED_TIME >=", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeLessThan(Date value) {addCriterion("CREATED_TIME <", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeLessThanOrEqualTo(Date value) {addCriterion("CREATED_TIME <=", value, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeIn(List<Date> values) {addCriterion("CREATED_TIME in", values, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeNotIn(List<Date> values) {addCriterion("CREATED_TIME not in", values, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeBetween(Date value1, Date value2) {addCriterion("CREATED_TIME between", value1, value2, "createdTime");return (Criteria) this;}public Criteria andCreatedTimeNotBetween(Date value1, Date value2) {addCriterion("CREATED_TIME not between", value1, value2, "createdTime");return (Criteria) this;}public Criteria andCreatedByIsNull() {addCriterion("CREATED_BY is null");return (Criteria) this;}public Criteria andCreatedByIsNotNull() {addCriterion("CREATED_BY is not null");return (Criteria) this;}public Criteria andCreatedByEqualTo(String value) {addCriterion("CREATED_BY =", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByNotEqualTo(String value) {addCriterion("CREATED_BY <>", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByGreaterThan(String value) {addCriterion("CREATED_BY >", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByGreaterThanOrEqualTo(String value) {addCriterion("CREATED_BY >=", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByLessThan(String value) {addCriterion("CREATED_BY <", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByLessThanOrEqualTo(String value) {addCriterion("CREATED_BY <=", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByLike(String value) {addCriterion("CREATED_BY like", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByNotLike(String value) {addCriterion("CREATED_BY not like", value, "createdBy");return (Criteria) this;}public Criteria andCreatedByIn(List<String> values) {addCriterion("CREATED_BY in", values, "createdBy");return (Criteria) this;}public Criteria andCreatedByNotIn(List<String> values) {addCriterion("CREATED_BY not in", values, "createdBy");return (Criteria) this;}public Criteria andCreatedByBetween(String value1, String value2) {addCriterion("CREATED_BY between", value1, value2, "createdBy");return (Criteria) this;}public Criteria andCreatedByNotBetween(String value1, String value2) {addCriterion("CREATED_BY not between", value1, value2, "createdBy");return (Criteria) this;}public Criteria andUpdatedTimeIsNull() {addCriterion("UPDATED_TIME is null");return (Criteria) this;}public Criteria andUpdatedTimeIsNotNull() {addCriterion("UPDATED_TIME is not null");return (Criteria) this;}public Criteria andUpdatedTimeEqualTo(Date value) {addCriterion("UPDATED_TIME =", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeNotEqualTo(Date value) {addCriterion("UPDATED_TIME <>", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeGreaterThan(Date value) {addCriterion("UPDATED_TIME >", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeGreaterThanOrEqualTo(Date value) {addCriterion("UPDATED_TIME >=", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeLessThan(Date value) {addCriterion("UPDATED_TIME <", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeLessThanOrEqualTo(Date value) {addCriterion("UPDATED_TIME <=", value, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeIn(List<Date> values) {addCriterion("UPDATED_TIME in", values, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeNotIn(List<Date> values) {addCriterion("UPDATED_TIME not in", values, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeBetween(Date value1, Date value2) {addCriterion("UPDATED_TIME between", value1, value2, "updatedTime");return (Criteria) this;}public Criteria andUpdatedTimeNotBetween(Date value1, Date value2) {addCriterion("UPDATED_TIME not between", value1, value2, "updatedTime");return (Criteria) this;}public Criteria andUpdatedByIsNull() {addCriterion("UPDATED_BY is null");return (Criteria) this;}public Criteria andUpdatedByIsNotNull() {addCriterion("UPDATED_BY is not null");return (Criteria) this;}public Criteria andUpdatedByEqualTo(String value) {addCriterion("UPDATED_BY =", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByNotEqualTo(String value) {addCriterion("UPDATED_BY <>", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByGreaterThan(String value) {addCriterion("UPDATED_BY >", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByGreaterThanOrEqualTo(String value) {addCriterion("UPDATED_BY >=", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByLessThan(String value) {addCriterion("UPDATED_BY <", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByLessThanOrEqualTo(String value) {addCriterion("UPDATED_BY <=", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByLike(String value) {addCriterion("UPDATED_BY like", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByNotLike(String value) {addCriterion("UPDATED_BY not like", value, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByIn(List<String> values) {addCriterion("UPDATED_BY in", values, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByNotIn(List<String> values) {addCriterion("UPDATED_BY not in", values, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByBetween(String value1, String value2) {addCriterion("UPDATED_BY between", value1, value2, "updatedBy");return (Criteria) this;}public Criteria andUpdatedByNotBetween(String value1, String value2) {addCriterion("UPDATED_BY not between", value1, value2, "updatedBy");return (Criteria) this;}}/*** This class was generated by MyBatis Generator.* This class corresponds to the database table user** @mbg.generated do_not_delete_during_merge Sat Mar 08 07:25:49 CST 2025*/public static class Criteria extends GeneratedCriteria {protected Criteria() {super();}}/*** This class was generated by MyBatis Generator.* This class corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/public static class Criterion {private String condition;private Object value;private Object secondValue;private boolean noValue;private boolean singleValue;private boolean betweenValue;private boolean listValue;private String typeHandler;public String getCondition() {return condition;}public Object getValue() {return value;}public Object getSecondValue() {return secondValue;}public boolean isNoValue() {return noValue;}public boolean isSingleValue() {return singleValue;}public boolean isBetweenValue() {return betweenValue;}public boolean isListValue() {return listValue;}public String getTypeHandler() {return typeHandler;}protected Criterion(String condition) {super();this.condition = condition;this.typeHandler = null;this.noValue = true;}protected Criterion(String condition, Object value, String typeHandler) {super();this.condition = condition;this.value = value;this.typeHandler = typeHandler;if (value instanceof List<?>) {this.listValue = true;} else {this.singleValue = true;}}protected Criterion(String condition, Object value) {this(condition, value, null);}protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {super();this.condition = condition;this.value = value;this.secondValue = secondValue;this.typeHandler = typeHandler;this.betweenValue = true;}protected Criterion(String condition, Object value, Object secondValue) {this(condition, value, secondValue, null);}}
}
这个Example类,主要是使用Critiertion(单个的查询条件)和Critiera(多个查询条件)的封装类。
- 查询条件Critera --> List<Criterition>
- setDistinct 设置是否去重
- setOrderByClause(**) 设置排序的字段
使用它的方式如下:
UserExample example = new UserExample();
example.createCretiar().andCreatedByEqualTo("jack.zhang"); // 构建第一个and条件连接的查询链
example.or().anUserNameIsEqualTo("name"); // 构建第二个包含or里的 ( and 条件链)
example.setDistinct(true) // 设置去重
example.setOrderByClause("USER_NAME DESC"); // 设置排序字段
生成的SQL语句如下:
select distinct USER_ID, USER_NAME, AGE, CREATED_TIME, CREATED_BY
from user
WHERE ( CREATED_BY = ? ) or ( USER_NAME = ? )
order by USER_ID ASC
4.2 UserMapper.java类
package com.keyrus.mapper;import com.keyrus.model.User;
import com.keyrus.model.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;public interface UserMapper {/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/long countByExample(UserExample example);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int deleteByExample(UserExample example);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int deleteByPrimaryKey(Integer userId);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int insert(User row);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int insertSelective(User row);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/List<User> selectByExample(UserExample example);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/User selectByPrimaryKey(Integer userId);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int updateByExampleSelective(@Param("row") User row, @Param("example") UserExample example);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int updateByExample(@Param("row") User row, @Param("example") UserExample example);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int updateByPrimaryKeySelective(User row);/*** This method was generated by MyBatis Generator.* This method corresponds to the database table user** @mbg.generated Sat Mar 08 07:25:49 CST 2025*/int updateByPrimaryKey(User row);
}
按照新增/修改/查询/删除的顺序,方法归纳如下:
insert(User user) 插入整个User对象;
insertSelective(User user) 插入部分字段;
updateByPrimaryKey(User user) 根据主键更新User;
updateByPrimaryKeySelective (User user) 根据主键部分更新User的字段;
updateByExampleSelective(User user, UserExample example) 根据example条件筛选出记录进行部分user字段的更新。
selectByPrimaryKey(id) 根据主键查询User;
selectByExample(UserExample exapmle) 根据example条件筛选查询User;
countByExample(UserExample example) 根据example条件查询统计记录数目;
deleteByPrimaryKey(id) 根据主键进行删除单条记录;
deleteByExample(UserExample example) 根据example条件筛选出多条记录进行删除;
基本上上面的四类方法,包含了日常单表的所有操作。
有复杂的表与表直接的操作,需要自己手写去完成。
相关文章:
Mybatis Generator 使用手册
第一章 什么是Mybatis Generator? MyBatis Generator Core – Introduction to MyBatis Generator MyBatis生成器(MBG)是MyBatis框架的代码生成工具。它支持为所有版本的MyBatis生成代码,通过解析数据库表(或多个表&…...
Android中AIDL和HIDL的区别
在Android中,AIDL(Android Interface Definition Language) 和 HIDL(HAL Interface Definition Language) 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC(进程间通信࿰…...
Gazebo 启动时候配置物体
1. 准备模型 mkdir -p ~/.gazebo/models/table echo export GAZEBO_MODEL_PATH$HOME/.gazebo/models:$GAZEBO_MODEL_PATH >> ~/.bashrc source ~/.bashrc # 从https://github.com/osrf/gazebo_models下载模型 # 桌子 cd ~/.gazebo/models/table wget https://raw.github…...
展示深拷贝与移动语义的对比
定义 Buffer 类(含深拷贝和移动语义) #include <iostream> #include <chrono> #include <cstring>class Buffer { public:// 默认构造函数(分配内存)explicit Buffer(size_t size) : size_(size), data_(new in…...
STM32基础教程——对射式红外传感器计数实验
前言 对射式红外传感器介绍 对射式红外传感器是一种非接触式的距离检测器,主要由发射器和接收器两部分组成。发射器发出特定波长的红外光束,当物体阻挡了这条光束时,接收器无法接收到光线信号,从而产生一个开关信号来判断物体的存…...
Git与GitHub:理解两者差异及其关系
目录 Git与GitHub:理解两者差异及其关系Git:分布式版本控制系统概述主要特点 GitHub:基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub:理解两者差异及其关系 Git:分布式版本控…...
【时时三省】(C语言基础)赋值语句2
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 赋值运算符 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。如a 3的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以…...
服务器上通过ollama部署deepseek
2025年1月下旬,DeepSeek的R1模型发布后的一周内就火了,性能比肩OpenAI的o1模型,且训练成本仅为560万美元,成本远低于openAI,使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...
自动控制原理【知识点总结、复习笔记】
1.控制系统定义 控制系统是指通过监测和调整系统的行为,以达到预期目标的一套系统。它由一组相互关联的组件组成,这些组件协同工作,用于控制物理过程、机械设备、电子设备或其他系统。例如,一个简单的温控系统可以通过监测房间温…...
【AI】什么是Embedding向量模型?我们应该如何选择?
我们之前讲的搭建本地知识库,基本都是使用检索增强生成(RAG)技术来搭建,Embedding模型则是RAG的核心,同时也是大模型落地必不可少的技术。那么今天我们就来聊聊Embedding向量模型: 一、Embedding模型是什么? Embedding模型是一种将离散数据(如文本、图像、用户行为等)…...
openwrt路由系统------Linux 驱动开发的核心步骤
以下是 Linux 驱动开发的核心步骤,结合实践案例与注意事项,适合嵌入式设备(如 OpenWrt 路由器)开发: 一、驱动开发基本流程 1. 环境准备 工具链与内核源码 # 安装交叉编译工具链(如 ARM) sudo apt-get install gcc-arm-linux-gnueabihf# 获取目标内核源码(需匹配运行的…...
Educational Codeforces Round 7 F. The Sum of the k-th Powers 多项式、拉格朗日插值
题目链接 题目大意 求 ( ∑ i 1 n i k ) (\sum_{i1}^{n} i^k) (∑i1nik) m o d ( 1 0 9 7 ) mod(10^97) mod(1097) . 数据范围 : 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109 , 0 ≤ k ≤ 1 0 6 0 \leq k \leq 10^6 0≤k≤106 . 思路 令 f ( n ) ∑ …...
学习笔记:利用OpenAI实现阅卷智能体
https://zhuanlan.zhihu.com/p/18047953492 ### 学习笔记:利用OpenAI实现阅卷智能体 #### 一、背景与需求 在各类考试中,选择题、判断题、填空题的阅卷相对简单,只需对比答案与作答是否一致。然而,简答题的阅卷较为复杂ÿ…...
进程的简要介绍
一.进程 1.概念:担当分配系统资源的实体 2.进程内核数据结构对象自己的代码和数据 或进程PCB(task_struct)自己的代码和数据 注1:PCB:操作系统中描述进程的结构体 2.进程的所有属性均可在task_struct中找到,管理进程其实就是…...
每日一题——乘积最大子数组
乘积最大子数组问题详解 问题描述示例约束条件 问题分析难点分析解题思路 代码实现代码说明 测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个整数数组 nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字&#x…...
HttpServletRequest 和 HttpServletResponse 区别和作用
一、核心作用对比 对象HttpServletRequest(请求对象)HttpServletResponse(响应对象)本质客户端发给服务器的 HTTP 请求信息(输入)服务器返回客户端的 HTTP 响应信息(输出)生命周期一…...
黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 黄昏时分有着独特而迷人的光线,使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色,可以进一步强化这种特质并根据不同的风格需求进行创作。Lr(Lightroom)作为专业的图像后期处理软件,提供了丰富的调色…...
Docker Desktop 安装与使用详解
目录 1. 前言2. Docker Desktop 安装2.1 下载及安装2.2 登录 Docker 账号2.3 进入 Docker Desktop 主界面 3. Docker 版本查看与环境检查3.1 查看 Docker Desktop 支持的 Docker 和 Kubernetes 版本3.2 检查 Docker 版本 4. Docker Hub 和常用镜像管理方式4.1 使用 Docker Hub4…...
DeepSeek-R1与全光网络的医疗技术协同场景深度分析
一、DeepSeek-R1与全光网络的技术协同场景 1. 实时诊疗与数据交互 1. 实时诊疗与数据交互 1.1 场景示例分析 高带宽需求:医疗影像,尤其是CT和MRI影像,通常具有高分辨率和大数据量,要求医疗系统具备超高带宽来实时传输这些数据。全光网络,特别是基于华为F5G的解决方案,…...
热图回归(Heatmap Regression)
热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…...
模型微调-基于LLaMA-Factory进行微调的一个简单案例
模型微调-基于LLaMA-Factory进行微调的一个简单案例 1. 租用云计算资源2. 拉取 LLaMa-Factory3. 安装依赖环境4. 启动 LLaMa-Factory 界面5. 从 Huggingface 下载模型6. 模型验证7. 模型微调 1. 租用云计算资源 以下示例基于 AutoDL 云计算资源。 在云计算平台选择可用的云计…...
shell的模拟实现 ─── linux第16课
在shell的命令行中输入命令,会有两种执行命令的途径 shell自己执行 shell创建子进程(fork ,exit ,waitpid,exec) ,子进程去执行 shell自己执行的命令是自建命令(bulit command) 子进程执行的是非自建命令 第一版只能维护命令行参数表创建子进程, 执行非内建命令 我们先创…...
Luna——为游戏添加音效
1、在GameManager中声明 public AudioSource audiosource; public AudioClip normalClip; public AudioClip battleClip; 2、在GameManager资产中挂载“Audio Source”组件,并将该组件挂载到资产脚本中的声明对象 这就可以根据不同场景的需要切换背景音乐了&#x…...
计算机视觉算法实战——老虎个体识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域,旨在通过分析老虎的独特条纹图案,自动识别和区…...
技术速递|GitHub Copilot Agent 模式(预览版)介绍
作者:Isidor Nikolic 翻译:Alan Wang GitHub Copilot Agent 模式(预览版)是 AI 辅助编码的最新进化。它作为一个自主的编程助手,可以根据你的指令执行多步骤的编码任务——分析代码库、读取相关文件、提出文件编辑建议…...
《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期:DIY半导体…...
CSS—补充:CSS计数器、单位、@media媒体查询
目录 1. CSS计数器 嵌套计数器: 对列表元素: 2.单位 绝对长度: 相对长度: 3.media媒体查询 1. CSS计数器 CSS 计数器就像“变量”。变量值可以通过 CSS 规则递增(将跟踪它们的使用次数)。 如需使用…...
Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节
Phi-4-Multimodal 是一种参数高效的多模态模型,通过 LoRA 适配器和模式特定路由器实现文本、视觉和语音/音频的无缝集成。训练过程包括多阶段优化,确保在不同模式和任务上的性能,数据来源多样,覆盖高质量网络和合成数据。它的设计…...
Leetcode::将水果放入篮子II(c++)
3477. 将水果放入篮子 II 提示 给你两个长度为 n 的整数数组,fruits 和 baskets,其中 fruits[i] 表示第 i 种水果的 数量,baskets[j] 表示第 j 个篮子的 容量。 你需要对 fruits 数组从左到右按照以下规则放置水果: 每种水果必…...
【C语言系列】字符函数和字符串函数
字符函数和字符串函数 一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2strlen函数模拟实现 四、strcpy的使用和模拟实现4.1strcpy函数4.2strcpy函数的模拟实现 五、strcat的使用和模拟实现5.1strcat函数5.2strcat函数的模拟实现 六、strcmp的使用…...
【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式
网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议: HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站,就是通过HTTP协议来…...
InDraw6.2.3 | 甾体、核苷、黄酮类化合物实现简称命名
导语 当化学家对着屏幕输入"2-amino-1,9-dihydro-6H-purin-6-one"时,隔壁生物学家可能正在搜索"鸟嘌呤";这种命名差异如同"火星文"与"地球语"的碰撞。现在,鹰谷InDraw 6.2.3版带着53种多环化合物的…...
AI Copilot——维新派的贾维斯,守旧派的墓志铭(程序员视角)
6500万年前的那颗陨石好像要落下来了 这一段时间,伴随着claude sonnet 3.7的发布 以及cursor,windsurf 等一众AI智能编辑器的涌现,社区的programming自媒体坐不住了,有一个观点已经快要溢出屏幕:程序员这个岗位要黄&a…...
c++ 接口/多态
目录 接口的通用定义 特点: C 中的接口 接口的作用 接口与抽象类的区别 什么是多态? 多态的类型 1. 编译时多态 2. 运行时多态 多态的实现原理 注意事项 在编程中,接口(Interface) 是一个抽象概念ÿ…...
【大模型学习】第十二章 大模型获取智能机制
目录 引言 1. 模型架构 Transformer架构 层次结构和层数 2. 训练数据 3. 大规模训练 4. 迁移学习与微调 4.1 微调步骤 5. 机制实例 自注意力机制 多头注意力机制 总结 引言 随着深度学习的发展,特别是大型预训练模型(大模型)的出…...
神经网络|(十四)|霍普菲尔德神经网络-Hebbian训练
【1】引言 前序学习进程中,除了对基本的神经网络知识进行了学习,还掌握了SOM神经网络原理,文章链接包括且不限于: 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 神经网络|(十三)|SOM神经…...
华为鸿蒙系统全景解读:从内核设计到生态落地的技术革命
华为鸿蒙系统全景解读:从内核设计到生态落地的技术革命 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 华为鸿蒙系统全景解读&#x…...
基于大数据的Steam游戏数据分析可视化推荐系统
【大数据】🎮 项目名:游戏分析神器,用代码探析游戏世界——《基于大数据的Steam游戏分析与智能推荐系统》(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &a…...
将长上下文大语言模型研究从输入转向输出
将长上下文大语言模型研究从输入转向输出 摘要: 近年来,长上下文大语言模型(LLMs)的研发主要集中在处理更长的输入文本上,这使得模型在理解长篇内容时取得了显著进步。然而,生成长篇输出的研究却相对被忽视ÿ…...
Dify 开源大语言模型应用开发平台使用(二)
文章目录 说明Dify 使用报告1. 应用创建——专业的锂电池相关知识解答1.1 平台简介1.2 创建应用2. 知识库、工作流、变量、节点与编排节点详解2.1 知识库管理2.2 工作流配置2.3 变量管理2.4 节点与编排节点3. 测试和调试3.1 单元测试3.2 日志与监控3.3 实时调试3.4 性能测试总结…...
CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划
25年2月来自浙大和菜鸟网络的论文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 轨迹规划对于自动驾驶至关重要,可确保在复杂环境中安全高效地导航。虽然最近基于学习的方法&a…...
K8s面试题总结(十一)
1.如何优化docker镜像的大小? 使用多阶段构建(multi-stage build)选择更小的基础镜像(如alpine)减少镜像层数,合并RUN命令 2.请解释Docker中的网络模式(如bridge,host,none) Bridgeÿ…...
Android Telephony 四大服务和数据网络控制面数据面介绍
在移动通信和Android系统中,涉及的关键概念和服务以及场景案例说明如下: 一、概念 (一)Android Telephony 的四大服务 介绍Telephony Data 与 Android Data 的四大服务在Android系统中,与电话(Telephony)和移动数据(Data)相关的核心服务主要包括以下四类: 1. Tele…...
一文讲懂Go语言如何使用配置文件连接数据库
一文讲懂Go语言如何使用配置文件连接数据库 viper1. viper简介2. viper 读取.toml配置文件定义Go语言结构体编写与Go语言结构体对应的.toml配置文件定义初始化函数定义get函数 连接数据库1. 定义数据库对象2. 定义初始化函数3. 定义 get 函数4. 定义 main 函数, 连接数据库 配置…...
Jmeter使用介绍
文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一(仅一次性)方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...
MES机联网4:文档资料
目录信息 MES机联网1:技术方案MES机联网2:采集网关MES机联网3:管理后台MES机联网4:文档资料 MQ接入文档 1、建立连接 mqtt连接地址: 192.168.0.138 mqtt端口: 1883 mqtt用户名:admin mqtt密码:123456 …...
豆包大模型 MarsCode AI 刷题专栏 001
001.找单独的数 难度:易 问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…...
常用无功功率算法的C语言实现(二)
0 前言 尽管数字延迟法和积分移相法在不间断采样的无功功率计算中得到了广泛应用,但它们仍存在一些固有缺陷。 对于数字延迟法而言,其需要额外存储至少1/4周期的采样点,在高采样频率的场景下,这对存储资源的需求不可忽视。而积分移相法虽然避免了额外的存储开销,但为了抑制…...
23种设计模式简介
一、创建型(5种) 1.工厂方法 总店定义制作流程,分店各自实现特色披萨(北京店-烤鸭披萨,上海店-蟹粉披萨) 2.抽象工厂 套餐工厂(家庭装含大披萨薯条,情侣装含双拼披萨红酒&#…...
开发vue小游戏:数字华龙道
一、游戏介绍 1、历史背景 数字华容道脱胎于传统华容道,后者源自三国时期“曹操败走华容道”的故事。传统玩法是通过移动不同形状的木块,帮助“曹操”从出口逃脱。而数字华容道将棋子替换为数字,目标是通过滑动方块,将乱…...