Привет всем, я Сяо Цай, Сяо Цай, который хочет быть Цай Буцаем в интернет-индустрии. Она может быть мягкой или жесткой, как она мягкая, а белая проституция жесткая!Черт~ Не забудьте поставить мне тройку после прочтения!
Эта статья в основном знакомит
MybatisPlus的使用
При необходимости вы можете обратиться к
Если это поможет, не забудьтеподобно❥
Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!
Если вы все еще пишете каждый деньCRUDизSQL, если вас интересуют этиSQLНетерпение, так почему бы не потратить некоторое время на чтение этой статьи и обновление существующего старого проекта, это окупится!
1. Что такое МП
MPполное имяMybatis-Plus, чтобы применить официальное объяснение, чтобы стать лучшим партнером MyBatis, именуемымгей друг. он находится вMyBatisНа основе внесения только улучшений без внесения изменений он был создан для упрощения разработки и повышения эффективности.
1. Три характеристики
1) Увлажнение бесшумное
Просто делайте улучшения без изменений, внедряйте их, не затрагивая существующий проект, гладко и гладко.
2) Эффективность превыше всего
Благодаря простой настройке вы можете быстро выполнять операции CRUD с одной таблицей, экономя много времени.
3) Богатые функции
Генерация кода, физическая подкачка, анализ производительности и другие функции легко доступны.
2. Поддержка базы данных
- mysql,mariadb,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,presto,Gauss,Firebird
- Phoenix,clickhouse,Sybase ASE,OceanBase, база данных Dameng, база данных Xugu, база данных Jincang Национального собрания народных представителей, общая база данных NTU
3. Каркасная структура
Честно говоря, вы можете видеть вышеуказанный контент, пока открываете официальный сайт, поэтому давайте начнем с фактической работы!
2. Реальный бой МП
1. Рукопашная проектная практика
1) Подготовка базы данных и таблиц
оператор sql:
use test;
CREATE TABLE `student` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`dept_id` int(0) NULL DEFAULT NULL,
`name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`remark` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 1, '小菜', '关注小菜不迷路!');
INSERT INTO `student` VALUES (2, 2, '小明', '好好学习,天天向上!');
2) зависимость пом
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
<!--MP插件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<!--JUNIT-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
3) Файл конфигурации
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
4) Класс сущности
@Data
@Builder
@TableName("student")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer deptId;
private String name;
private String remark;
}
5) Картограф
public interface UserMapper extends BaseMapper<User> {}
6) Тестовый класс
@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void getAll() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
/** OUTPUT:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
User(id=2, deptId=1, name=小明, remark=好好学习,天天向上!)
**/
Гарнир:
В приведенных выше результатах мы видим, что все данные в базе данных (две части) были распечатаны. И не видел, что нам обычно нужно писатьmapper.xmlфайл, только что использованныйusermapperсерединаselectList()метод, в то время какUserMapperнаследоватьBaseMapperЭтот интерфейс, этот интерфейсMybatisPlusПредоставленный нам, давайте посмотрим, какие методы предоставляет нам этот интерфейс.
2. Основные операции CRUD
1) вставить
@Test
public void insert() {
//这里使用了 lombok 中的建造者模式构建对象
User user = User.builder().deptId(1).name("小华").remark("小华爱学习").build();
int insertFlag = userMapper.insert(user);
log.info("插入影响行数,{} | 小华的ID: {}", insertFlag, user.getId());
}
/** OUTPUT:
插入影响行数,1 | 小华的ID: 8
**/
Видно, что мы не только вставили данные, но и получили вставленные данныеID, но стоит отметить, что здесьIDНесмотря на то, что он самовозрастающий, он неMPдефолтСтратегия генерации идентификатора, а то, что мы указали в классе сущности:
существуетMPСтратегии генерации первичного ключа, поддерживаемые в:
Поскольку мы видели@TableIdЭта аннотация, тогда давайте обратим внимание на общую аннотацию@TableField
Из названия аннотации мы видим, что@TableIdиспользуется для обозначения первичного ключаID, пока@TableFieldиспользуется для обозначения других полей.
Видно, что в этой аннотации еще много значений, вот несколько часто используемых значений:
- value
Используется для устранения несоответствий имен полей и верблюжьего регистра имен, таких как имена атрибутов в классах сущностей.remark, но поле в таблице называетсяdescribe, то вы можете использовать@TableField(value="describe")
для преобразования. Преобразование CamelCase Если именование CamelCase настроено глобально, это место не нужно записывать.
- exist
Для полей, которых нет в таблице данных, мы можем использовать@TableField(exist = false)
помечать
- condition
используется в предварительной обработкеWHEREПользовательские правила работы условия объекта, такие как я настроил@TableField(condition = SqlCondition.LIKE)
, выходSQLдля:select 表 where name LIKE CONCAT('%',值,'%')
,вSqlConditionЗначения следующие:
- update
используется в предварительной обработкеsetПользовательская инъекция поля, такая как я настроил@TableField(update = "%s+1")
,в%sзаполнит поля, выведетSQLдля:update 表名 set 字段 = 字段+1 where 条件
- select
Используется для ограничения времени запроса, если у нас есть полеremarkдаtextтип, вы не хотите запрашивать это поле при запросе, тогда вы можете использовать@TableField(select = false)
Не запрашивайте это поле, когда вы ограничены запросом
2) обновить
MybatisPlusСуществует два типа операций обновления:
int updateById(Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
Обновить по идентификатору
@Test
public void update() {
User user = User.builder().id(3).name("小华").remark("小华爱玩游戏").build();
userMapper.updateById(user);
}
/** 更新结果:
User(id=3, deptId=1, name=小华, remark=小华爱玩游戏)
**/
Обновление согласно условиям
@Test
public void update() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name","小华").set("remark","小华爱下棋");
userMapper.update(null, updateWrapper);
}
/** 更新结果:
User(id=3, deptId=1, name=小华, remark=小华爱下棋)
**/
Мы также можем поместить условие для обновления впользовательский объектв:
@Test
public void update() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name","小华");
User user = User.builder().remark("小华爱游泳").build();
userMapper.update(user, updateWrapper);
}
/** 更新结果:
User(id=3, deptId=1, name=小华, remark=小华爱游泳)
**/
3) удалить
существуетMybatisPlusСпособов удалить больше, чем обновить, всего их четыре:
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
удалить по идентификатору
@Test
public void deleteById() {
userMapper.deleteById(3);
}
/** SQL语句:
DELETE FROM student WHERE id = 3;
**/
Удалить по карте
@Test
public void deleteByMap() {
HashMap<String, Object> columnMap = new HashMap<>();
columnMap.put("name","小华");
columnMap.put("remark","小华爱游泳");
userMapper.deleteByMap(columnMap);
}
/** SQL语句:
DELETE FROM student WHRE name = '小华' AND remark = '小华爱游泳';
**/
Удалить согласно Wrapper
@Test
public void delete() {
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("remark","小华爱下棋");
userMapper.delete(wrapper);
}
/** SQL语句:
DELETE FROM student WHRE remark = '小华爱下棋';
**/
согласно сWrapperЕсть еще один способ удалить, напрямую поместить класс сущности вWrapperСредняя упаковка:
@Test
public void delete() {
User user = User.builder().remark("小华爱下棋").build();
UpdateWrapper<User> wrapper = new UpdateWrapper<>(user);
userMapper.delete(wrapper);
}
/** SQL语句:
DELETE FROM student WHRE remark = '小华爱下棋';
**/
Массовое удаление по ID
@Test
public void deleteBatchIds() {
List<Integer> idList = new ArrayList<>();
idList.add(4);
idList.add(7);
userMapper.deleteBatchIds(idList);
}
/** SQL语句:
DELETE FROM student WHERE id In (4,7)
**/
4) выбрать
Операции запросов являются наиболее часто используемыми и наиболее важными в нашей разработке.MybatisPlusСуществует также множество способов поддержки запросов в , например:
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@aram("ew") Wrapper<T> queryWrapper);
IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
Видно, что всего10метод, мы будем тестировать один за другим
запросить все
@Test
public void selectList() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
/**
OUTPUT:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
User(id=2, deptId=1, name=小明, remark=好好学习,天天向上!)
SQL语句:
SELECT id, dept_id, name, remark FROM student;
**/
Количество запросов
@Test
public void selectCount() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","小");
System.out.println(userMapper.selectCount(queryWrapper));
}
/**
OUTPUT:
2
SQL语句:
SELECT COUNT( 1 ) FROM student WHERE (name LIKE '%小%');
**/
Запрос по идентификатору
@Test
public void selectById() {
User user = userMapper.selectById(1);
System.out.println(user);
}
/**
OUTPUT:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
SQL语句:
SELECT id, dept_id, name, remark FROM student WHERE ID = 1;
**/
Массовый запрос по ID
@Test
public void selectBatchIds() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2));
users.forEach(System.out::println);
}
/**
OUTPUT:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
User(id=2, deptId=1, name=小明, remark=好好学习,天天向上!)
SQL语句:
SELECT id, dept_id, name, remark FROM student WHERE ID IN (1, 2);
**/
Запрос одного элемента по условию
@Test
public void selectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","小菜");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
/**
OUTPUT:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
SQL语句:
SELECT id, name, dept_id, remark FROM student WHERE (name = '小菜');
**/
Запрос нескольких элементов на основе условий
пройти черезmapпередавать параметры, а не черезLIKEзапрос, но через=Запрос
@Test
public void selectByMap() {
HashMap<String, Object> columnMap = new HashMap<>();
columnMap.put("name","小");
List<User> users = userMapper.selectByMap(columnMap);
users.forEach(System.out::println);
}
/**
OUTPUT:
null
SQL语句:
SELECT id, name, dept_id, remark FROM student WHERE name = '小';
**/
Если у нас нет нового класса сущностей для инкапсуляции результатов, мы также можем использоватьMapчтобы получить результирующий набор:
@Test
public void selectMaps() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","小");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
/**
OUTPUT:
{name=小菜, remark=关注小菜不迷路!, id=1, dept_id=1}
{name=小明, remark=好好学习,天天向上!, id=2, dept_id=1}
SQL语句:
SELECT id, name, dept_id, remark FROM student WHERE (name LIKE '%小%');
**/
также можно использоватьObjectобъект для получения набора результатов:
@Test
public void selectObjs() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "小");
List<Object> objects = userMapper.selectObjs(queryWrapper);
}
/**
OUTPUT:
{name=小菜, remark=关注小菜不迷路!, id=1, dept_id=1}
{name=小明, remark=好好学习,天天向上!, id=2, dept_id=1}
SQL语句:
SELECT id, name, dept_id, remark FROM student WHERE (name LIKE '%小%');
**/
Пейджинговый запрос
@Test
public void selectPage() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "小");
Page<User> page = new Page<>(1, 1);
IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);
System.out.println("数据总数:" + userIPage.getTotal());
System.out.println("总页数:" + userIPage.getPages());
System.out.println("当前页:" + userIPage.getCurrent());
System.out.println("页大小:" + userIPage.getSize());
userIPage.getRecords().forEach(System.out::println);
}
/**
OUTPUT:
数据总数:2
总页数:2
当前页:1
页大小:1
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
SQL语句:
SELECT id, name, dept_id, remark
FROM student
WHERE (name LIKE '%小%')
LIMIT 0,1;
**/
3. Условный конструктор
существуетCRUDВ базовой операции мы хотим запросить по условию всеWrapperКласс инкапсулирован, и приведенное выше просто используетсяeqа такжеlikeработать. На самом деле, этот класс очень мощный, и мы подробно расскажем о нем ниже.
1) всеEq
всеeqили индивидуальноisNull
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
Описание параметра:
параметр:key — имя поля базы данных, value — значение поля
**nullsIsNull: ** true для вызова, когда значение карты равно nullisNullметод, если он ложный, он будет игнорировать, если значение равно нулю, и не будет вызыватьсяisNullметод
фильтр:Функция фильтра, чтобы определить, разрешено ли передавать поле в условие сравнения
Пример использования:
allEq(Map<R, V> params)
@Test
public void testAllEq() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String,Object> params = new HashMap<>();
params.put("name","小菜");
params.put("dept_id",1);
params.put("remark",null);
queryWrapper.allEq(params); //会调用 isNull 方法
userMapper.selectList(queryWrapper);
}
/**
结果:
{}
SQL语句:
SELECT id,name,dept_id,remark
FROM student
WHERE (name = '小菜' AND dept_id = 1 AND remark IS NULL);
**/
allEq(Map<R, V> params, boolean null2IsNull)
@Test
public void testAllEq() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String,Object> params = new HashMap<>();
params.put("name","小菜");
params.put("dept_id",1);
params.put("remark",null);
queryWrapper.allEq(params, false); //不会调用 isNull 方法
userMapper.selectList(queryWrapper);
}
/**
结果:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!)
SQL语句:
SELECT id,name,dept_id,remark
FROM student
WHERE (name = '小菜' AND dept_id = 1);
**/
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
@Test
public void testAllEq() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String,Object> params = new HashMap<>();
params.put("name","小菜");
params.put("dept_id",1);
params.put("remark",null);
queryWrapper.allEq(false,params,false); //不会带入条件进行查询
userMapper.selectList(queryWrapper);
}
/**
结果:
{name=小菜, remark=关注小菜不迷路!, id=1, dept_id=1}
{name=小明, remark=好好学习,天天向上!, id=2, dept_id=1}
SQL语句:
SELECT id,name,dept_id,remark
FROM student;
**/
allEq(BiPredicate<R, V> filter, Map<R, V> params)
@Test
public void testAllEq() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> params = new HashMap<>();
params.put("name", "小菜");
params.put("dept_id", 1);
params.put("remark", null);
//只有 key 中含有 “m” 才会用作条件判断
queryWrapper.allEq((k, v) -> (k.contains("m")), params);
userMapper.selectList(queryWrapper);
}
/**
结果:
0
SQL语句:
SELECT id,name,dept_id,remark
FROM student
WHERE (name = '小菜' AND remark IS NULL);
**/
2) Операция сравнения
-
экв.:эквивалентно
=
-
ne:эквивалентно
!=
-
гт:эквивалентно
>
-
индивидуальный:эквивалентно
>=
-
л:эквивалентно
<
-
сейчас:эквивалентно
<=
-
между:эквивалентно
between ... and ...
-
немежду:эквивалентно
not between ... and ...
-
в:эквивалентно
in(.., .., ..)
-
не в:эквивалентно
not in(.., .., ..)
3) Нечеткий запрос
-
подобно:
like("name","小菜") --> name like "%小菜%"
-
не как:
notLike("name","小菜") --> name not like "%小菜%"
-
нравитсяСлева:
like("name","小菜") --> name like "%小菜"
-
нравитсяПравильно:
like("name","小菜") --> name like "小菜%"
4) Сортировать
- Сортировать по:
orderBy(boolean condition, boolean isAsc, R... columns)
orderBy(true, true, "id", "name") --> order by id ASC, name ASC
- заказ по возрастанию:
orderByAsc("id","name") --> order by id ASC, name ASC
- заказ по наименованию:
orderByDesc("id","name) --> order by id Desc, name Desc
5) Логический запрос
- или:
Сращивание: активный вызовorУказывает, что следующий метод не используетсяandподключиться!(не звонитьorпо умолчанию используетсяandсоединять),eq("id",1).or().eq("name","老王")
Вложенные:or(i -> i.eq("name", "李白").ne("status", "活着"))
- и:
Вложенные:and(i -> i.eq("name", "李白").ne("status", "活着"))
6) выбрать
В MP-запросе по умолчанию запрашиваются все поля.При необходимости вы также можете указать поля через метод выбора, напримерselect("id", "name")
4. Объяснение конфигурации
1) Базовая конфигурация
- configLocation
Используется для указания местоположения конфигурационного файла **MyBatis**, если у нас естьMyBatisконфигурационном файле, вам необходимо указать путь к конфигурационному файлуconfigLocationсередина
Спрингбут:
mybatis-plus.config-location = classpath:mybatis-config.xml
SpringMvc:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean
- mapperLocations
используется для указанияMapperсоответствующийXMLместоположение файла, мы находимся вОбщий CRUDиспользуется вMapperэто прямое наследствоMPкоторый предоставилBaseMapper, мы также можем настроить метод, а затем вXMLпользовательский файлSQL, и тогда нам нужно сказатьMapperсоответствующийXMLрасположение файла
Спрингбут:
mybatis-plus.mapper-locations = classpath*:mybatis/*.xml
СпрингМВК:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="mapperLocations" value="classpath*:mybatis/*.xml"/>
</bean>
- typeAliasesPackage
используется дляMyBatisПуть сканирования пакета псевдонимов, по которому можно прописать псевдонимы для классов в пакете.MapperсоответствующийXMLИмя класса можно использовать непосредственно в файле вместо полного имени класса.
Спрингбут:
mybatis-plus.type-aliases-package = cbuc.life.bean
СпрингМВК:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="typeAliasesPackage"
value="com.baomidou.mybatisplus.samples.quickstart.entity"/>
</bean>
2) Расширенная конфигурация
- mapUnderScoreToCamelCase
Включить ли автоматическое сопоставление правил именования верблюжьих регистров, значение по умолчанию для этой конфигурации равноtrue, но это свойство находится вMyBatisЗначение по умолчанию вfalse, так что эта конфигурация будет включена в нашей обычной разработке.
#关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
mybatis-plus.configuration.map-underscore-to-camel-case = false
- cacheEnabled
Глобально включает или выключает любой кеш, настроенный всеми картографами в файле конфигурации, по умолчаниюtrue.
mybatis-plus.configuration.cache-enabled = false
3) Конфигурация политики БД
- idType
Глобальный тип первичного ключа по умолчанию. После настройки вы можете опустить@TableId(type = IdType.AUTO)
конфигурация. Значение по умолчанию для этой конфигурацииID_WORKER
Спрингбут:
mybatis-plus.global-config.db-config.id-type = auto
СпрингМВК:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<property name="idType" value="AUTO"/>
</bean>
</property>
</bean>
</property>
</bean>
- tablePrefix
Префикс имени таблицы, который можно опустить после глобальной настройки.@TableName()
конфигурация. Значение по умолчанию для этой конфигурацииnull
Спрингбут:
mybatis-plus.global-config.db-config.table-prefix = yq_
СпрингМВК:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<property name="idType" value="AUTO"/>
<property name="tablePrefix" value="yq_"/>
</bean>
</property>
</bean>
</property>
</bean>
5. Другие расширения
1) Автозаполнение
Иногда, когда мы вставляем или обновляем данные, мы хотим, чтобы некоторые поля заполнялись автоматически. Например, у нас обычно есть таблица данных вВставить времяилиВремя обновленияЭто поле, мы заполним его текущим временем по умолчанию, вMPМы также можем настроить его.
Сначала нам нужно использовать@TableField(fill = FieldFill.INSERT)
Эта аннотация заполняется при вставке.
@TableField(fill = FieldFill.INSERT)
private String remark;
Автоматически заполняемые режимы следующие:
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
Затем мы пишем собственный режим обработки заливки:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Object remark = getFieldValByName("remark", metaObject);
if (null == remark) {
setFieldValByName("remark", "好好学习", metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
//自定义更新时填充
}
}
тестовое задание:
@Test
public void testObjectHandler() {
User user = User.builder().deptId(1).name("小明").build();
userMapper.insert(user);
}
/**
SQL语句:
INSERT INTO student ( name, dept_id, remark )
VALUES ( '小明', 1, '好好学习' );
**/
Вы можете видеть, что при вставке поля, которые мы заполнили, были автоматически объединены.
2) Надгробие
В процессе разработки часто нам не требуется физическое удаление в реальном смысле для удаления данных, но используется логическое удаление, Таким образом, для подзапросов требуются условия состояния, чтобы гарантировать, что помеченные данные не запрашиваются.MPРазумеется, эта функция также поддерживается.
нам нужно сначалаstudentДобавить поле в таблицуstatus
объявить, были ли данные удалены,0 означает удалено, 1 означает не удалено, а затем вам также нужно добавить это свойство в класс сущности:
@TableLogic
private Integer status;
существуетapplication.yaml
Средняя конфигурация:
mybatis-plus:
global-config:
db-config:
logic-delete-value: 0
logic-not-delete-value: 1
тестовое задание:
@Test
public void testLogicDelete() {
userMapper.deleteById(1);
}
/**
SQL语句:
UPDATE student SET status=0
WHERE id=1 AND status=1;
**/
Видно, что этоSQLНа самом деле не удалил, а захоронен, просто обновил идентификатор удаления
3) Общее перечисление
Если есть такое поле, как пол, мы обычно используем0а также1Чтобы представить, но мы узнаем, что мы должны выполнить преобразование значения, В настоящее время мы можем использовать перечисление для решения этой проблемы:
первый дляstudentдобавить таблицуsexполе для указания пола,0 для женщин, 1 для мужчин, а затем определите класс перечисления:
public enum SexEnum implements IEnum<Integer> {
MAN(1, "男"),
WOMEN(0, "女");
private int code;
private String value;
SexEnum(int code, String value) {
this.code = code;
this.value = value;
}
@Override
public Integer getValue() {
return this.code;
}
//注意要重写此方法,不然会将值转换成 ‘MAN’,而不是 ‘男’
@Override
public String toString() {
return this.value;
}
}
Затем добавьте соответствующие свойства в класс сущности:
private SexEnum sex;
существуетapplication.yaml
Средняя конфигурация:
mybatis-plus:
type-enums-package: cbuc.life.enums
тестовое задание:
@Test
public void selectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "小菜");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
/**
输出结果:
User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!, status=1, sex=男)
SQL语句:
SELECT id,sex,name,dept_id,remark,status
FROM student
WHERE status=1 AND (name = '小菜');
**/
END
На этом статья подошла к концу.Содержание немного длинное, но если вы сможете прочитать его полностью, я думаю, вы сможете использовать его с пользой.MybatisPlusЛа! Дорога длинная, Сяокай будет искать ее вместе с вами!
Если вы будете усердно работать сегодня, завтра вы сможете сказать на одну вещь меньше, чтобы попросить о помощи!
Я Сяо Цай, человек, который учится у вас.
💋
Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!