1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wdyun-mybatis-plugs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 15:02 0ae458b

Запрос 1

maxPoolPreparedStatementPerConnectionSize: 20

Значение ключа maxPoolPreparedStatementPerConnectionSize устанавливается равным 20.

useGlobalDataSourceStat: true

Логическое значение ключа useGlobalDataSourceStat устанавливается равным true.

connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

Устанавливаются свойства соединения connectionProperties:

  • druid.stat.mergeSql = true;
  • druid.stat.slowSqlMillis = 500.

Запрос 2

  1. Изменить запуск класса

В стартовом классе добавить аннотацию для сканирования маппера:

@MapperScan("com.xxxxx.xxxxx.mapper")
  1. Код-генератор

Мы можем быстро сгенерировать entity,controller,mapper,service,serviceImpl,mapping.xml на основе таблицы базы данных. Для генерации кода необходимо подключиться к базе данных, поэтому мы должны настроить базовую информацию о базе данных и использовать класс генератора кода CodeGenerator2 из mybatis-plugs.

  1. Настроить генератор кода

Создать класс генератора CodeGenerate в том же каталоге, что и стартовый класс.

public class CodeGenerate {
  private static String url="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false";
   private static String user="root";
   private static String psd="111111";
   private static String filePath="D://generate_code//";
   public static void main(String[] args) {
    CodeGenerator2 codeGenerator2=new CodeGenerator2(url,user,psd,filePath);
    codeGenerator2.generate(CodeGenerate.class);
  }
}

Здесь:

  • url — URL подключения к базе данных;
  • root — имя пользователя базы данных;
  • psd — пароль базы данных;
  • filePath — путь для сохранения сгенерированного кода (чтобы избежать перезаписи существующего кода).

CodeGenerator2 — основной генератор кода mybatis-plugs.

  1. Использовать метод

Для использования метода необходимо выполнить следующие шаги:

  • Выполнить метод main().
  • Ввести автора и таблицу, для которой нужно сгенерировать код.
  • Нажать Enter после ввода.
  • Если выводится сообщение об успешном завершении генерации, перейти к следующему шагу.
  • Перейти в каталог, где должен быть сохранён сгенерированный код, и проверить его наличие.
  1. Создать пакет кода

Необходимо создать пакеты для кода: entity, controller, mapper, service, impl и xml.

  1. Скопировать код

Скопировать сгенерированный код в соответствующие пакеты.

  1. Запустить проект

Запустить проект и обратиться к нему по адресу http://localhost:8080/v1/sys_user/list, чтобы получить список всех пользователей.

Запрос 3

Интерфейс CRUD используется для быстрой реализации операций CRUD (Create, Read, Update, Delete) в базе данных путём инкапсуляции интерфейса BaseService от mybatis.

Параметры:

  • T — любой объект сущности;
  • Serializable — любой тип первичного ключа.

Методы:

  1. Вставка

Однострочная вставка:

/**
 * Вставка одной записи
 * @param entity передаваемый объект вставки
 * @return T
 */
T insert(T entity);

Пример использования:

SysUser user = new SysUser();
user.setName("Чжан Сань");
user.setAge(32);
user.setPhone("13615425135");
super.insert(user);

Пакетная вставка:

/**
  * Пакетная вставка
  * @param entityList
  * @return
*/
int saveBatch(List<T> entityList);

Пример использования:

List<SysUser> sysUserList = new ArrayList<>();
for (int i = 0; i <10 ; i++) {
    SysUser sysUser = new SysUser();
    sysUser.setName("Чжан Сань"+i);
    sysUser.setAge(30+i);
    sysUser.setPhone("1361542513"+i);
    sysUserList.add(sysUser);
}
super.saveBatch(sysUserList);
  1. Удаление

По первичному ключу:

/**
 * Удаление по первичному ключу
 * @param id передаваемый первичный ключ
 * @return количество удалённых записей
 */
int deleteById(Serializable id);

Пример использования:

super.deleteById(12000012);

Пакетное удаление:

/**
 * Пакетное удаление
 * @param wrapper
 * @return
 */
int delete(Wrapper<T> wrapper);

Пример использования:

Wrapper wrapper = new Wrapper<SysUser>();
wrapper.eq("age",30);
wrapper.like("name","Чжан Сань");
super.delete(wrapper);
  1. Обновление

Обновление по первичному ключу:

/**
 * Обновление по первичному ключу
 * @param bean передаваемый обновляемый объект
 * @return количество обновлённых записей
 */
int updateById(T bean);

Пример использования:

SysUser sysUser = new SysUser();
sysUser.setId(1234561114L);
sysUser.setPhone("13615425135");
sysUser.setAge(36);
super.updateById(sysUser);

Пакетное обновление:

/**
 * Пакетное обновление
 * @param entityList
 * @return
 */
int updateBatchById(List<T> entityList);

Пример использования:

List<SysUser> sysUserList = new ArrayList<>();
    SysUser sysUser = new SysUser();
    sysUser.setId(111100001101L);
    sysUser.setAge(35);
sysUserList.add(sysUser);
    SysUser sysUser2 = new SysUser();
    sysUser2.setId(111100001102L);
    sysUser2.setAge(32);
sysUserList.add(sysUser);
super.updateBatchById(sysUserList);
  1. Список запросов
/**
 * Запрос списка данных
 * @param wrapper условие запроса
 * @return список
 */
List<T> list(Wrapper<T> wrapper);

Пример использования:

Wrapper wrapper = new Wrapper<SysUser>();
wrapper.like("имя","Чжан Сань");
List<SysUser> list = super.list(wrapper);
  1. Разбиение на страницы
/**
 * Разбиение на страницы
 * @param page
 * @param wrapper
 * @return
 */
Page<T> page(Page<T> page, Wrapper<T> wrapper);

Пример использования:

@PostMapping("/page")
``` **Текст запроса на русском языке:**

Публичный метод ResultReturn<Page<SysUser>> getPage(@RequestBody SysUser user) {
    return success(sysUserService.page(getPage(), new Wrapper(user)));
}

**Объяснение**: Контроллер должен наследовать BaseController.

6. Запрос одной записи:

/**
 * Получение по id.
 * @param id Идентификатор объекта.
 * @return Объект.
 */
T getById(Serializable id);

**Использование**: В контроллере (слой Controller) пример кода:

@GetMapping("/{id}")
public ResultReturn<SysUser> get(@PathVariable("id") Long id) {
    return success(sysUserService.getById(id));
}

7. Запрос количества:

/**
* Запрос count.
* @param wrapper Условия запроса.
* @return Количество.
*/
int selectCount(Wrapper<T> wrapper);

**Использование**: В serviceImpl слое пример кода:

Wrapper wrapper = new Wrapper<SysUser>();
wrapper.like("name", "张三");
int count = super.selectCount(wrapper);

## 🐮 Конструктор условий Wrapper
1. eq конструктор:
Если мы хотим быстро запросить таблицу базы данных sys_user по имени «Tom», как это сделать?
Ответ: Просто вызовите сервис list, передав в него конструктор условий Wrapper Wrapper, вызвав метод eq, и следующий метод вернёт список SysUser с именем «Tom».

sysUserService.list(new Wrapper<>(sysUser).eq("name", "Tom"));

2. ne конструктор:
Если мы хотим быстро запросить таблицу базы данных sys_user, где имя не «Tom», как это сделать?
Ответ: просто вызовите сервис list, передав в него конструктор условий Wrapper Wrapper, вызвав метод ne, и следующий метод вернёт список SysUser, где имя не «Tom».

sysUserService.list(new Wrapper<>(sysUser).ne("name", "Tom"));

3. like конструктор:
Если мы хотим выполнить запрос по имени, используя подстановочные знаки, как это сделать?
Ответ: просто вызовите сервис list, передав в него конструктор условий Wrapper Wrapper, вызвав метод like, и следующий метод будет выполнять запрос по имени «Tom» с использованием подстановочных знаков.

sysUserService.list(new Wrapper<>(sysUser).like("name", "Tom"));

4. in конструктор:
Если мы хотим запросить имена «Tom», «Jack», «June», как это сделать?
Ответ: просто вызовите сервис list, передав в него конструктор условий Wrapper Wrapper, вызвав метод in, и передайте ArrayList.

List arrayList = new ArrayList<>();
arrayList.add("Tom");
arrayList.add("Jack");
arrayList.add("June");
sysUserService.list(new Wrapper<>(sysUser).in("name", arrayList));

**Расширение**:
Выше приведены только некоторые методы конструктора условий, у нас также есть notNull (непустой запрос), isNull (запрос пустого значения), setSqlSelect (фиксированный столбец запроса) и другие. Для получения дополнительной информации см. mybatis-plugs.

## 🐮 Аутентификация входа
Mybatis-Plugs внутренне упаковывает аутентификацию JWT token, которую можно использовать при создании функции входа.
1. Создание JWT:
Mybatis-Plugs предоставляет класс инструментов JwtUtil для создания токенов. Конкретные методы описаны ниже:

/**

  • Первые три параметра — это информация о собственном токене пользователя, такая как идентификатор, разрешения и имя. Не помещайте конфиденциальную информацию (которую могут получить все) в неё.
  • @param map Информация, которая должна быть зашифрована.
  • @param security Строка шифрования.
  • @param expire Срок действия в миллисекундах.
  • @return */ public static String createJwt(Map<String, Object> map, String security, long expire) { // Добавляем параметры, составляющие JWT. JwtBuilder builder = Jwts.builder() .setHeaderParam("typ", "JWT") .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expire)) .setClaims(map) .signWith(generalKey(security), SignatureAlgorithm.HS256); // Создаём JWT. return builder.compact(); }
Если срок действия не указан, по умолчанию он составляет 24 часа. Мы предоставляем перегруженный метод:

/**

  • Создаёт JWT, срок действия которого по умолчанию составляет 24 часа.
  • @param map Информация, которая должна быть зашифрована.
  • @param base64Security Зашифрованная строка.
  • @return */ public static String createJwt(Map<String, Object> map, String base64Security) { return createJwt(map, base64Security, EXPIRE); }
Как это использовать? Пожалуйста, обратитесь к следующему коду:

// Получаем имя пользователя для входа. String username = user.getUsername(); String password = MD5Util.generate(user.getPassword()); List list = list(new Wrapper().eq("username", username).eq("password", password)); Optional first = list.stream().filter(dbUser -> dbUser.getUsername().equals(username) && dbUser.getPassword().equals(password)).findFirst(); if (first.isPresent()) { user.setUsername(username); SysUser sysUser = first.get(); Map<String, Object> userMap = new HashMap<>(); userMap.put("userId", sysUser.getId() + ""); userMap.put("name", sysUser.getName()); userMap.put("companyId", sysUser.getCompanyId()); userMap.put("username", sysUser.getUsername()); userMap.put("effective", System.currentTimeMillis() + (120 * 60 * 1000)); String token = JwtUtil.createJwt(userMap, JwtUtil.LOGIN_BASE); response.addHeader("authorization", token); Cookie cookie = new Cookie("authorization", token); cookie.setDomain(domain); cookie.setPath("/");

response.addCookie(cookie); SysUser user1 = first.get(); SysUserVO vo = new SysUserVO(); BeanUtils.copyProperties(user1, vo); vo.setAuthorization(token); vo.setImgHead(sysUser.getAvatarUrl()); return ResultReturn.success(vo); }


2. Анализ JWT:
Mybatis-Plugs предоставляет класс инструмента JwtUtil для анализа токенов. Конкретный метод описан ниже:

/**

  • Расшифровка.
  • @param jsonWebToken Строка токена.
  • @param security Зашифрованная строка.
  • @return */

public static Claims parseJwt(String jsonWebToken, String security) { try { Jws claimsJws = Jwts.parserBuilder() .setSigningKey(Keys.hmacShaKeyFor(security.getBytes(StandardCharsets.UTF_8))) .build().parseClaimsJws(jsonWebToken); return claimsJws.getBody(); } catch (Exception ex) { ex.printStackTrace(); return null; } }


3. 封装登录实体  

Логин успешно, можно использовать токен для получения объекта Account, который используется для получения пользователя. Метод:  

public static Account account(String token,String security){ Claims claims= JwtUtil.parseJwt(token,security); String userId= (String)claims.get("userId"); String username= (String)claims.get("username"); Integer companyId= (Integer)claims.get("companyId"); Account account = new Account(); account.setId(Long.parseLong(userId)); account.setUsername(username); if(null!=companyId){ account.setCompanyId(Long.parseLong(Integer.toString(companyId))); } return account; }


Здесь токен — это сгенерированный токен JWT, а security — строка шифрования. Токен можно получить из заголовка или cookie.  

Использование:  

Account account = JwtUtil.account(request.getHeader("Authorization"),"xxxx");

## 🐮 拦截器  
1. Введение  
Mybatis-plugs имеет функции регистрации времени выполнения запроса и фильтрации запросов не авторизованных пользователей. В контроллере можно использовать аннотации для перехвата запросов без авторизации.  

Способ использования: создать собственный перехватчик и наследовать класс com.enbatis.mybatisplugs.commons.Interceptor.Interceptor  

Пример кода:  

@Component public class ReqInterceptor extends Interceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{ return super.preHandle(request,response,handler); } }


Далее необходимо зарегистрировать перехватчик. Создайте класс WebConfigurer и реализуйте интерфейс WebMvcConfigurer.  

Код:  

@Configuration public class WebConfigurer implements WebMvcConfigurer { @Autowired private ReqInterceptor interceptor; /** * @Description Этот метод используется для настройки статических ресурсов, таких как HTML, JS, CSS и т. д. * @Param [registry] * @return void **/ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { }

/**
 * @Описание Этот метод используется для регистрации перехватчика. Нам нужно добавить регистрацию нашего собственного перехватчика, чтобы он вступил в силу.
 * @Date 9:34 2022/2/7
 * @Param [реестр]
 * @Return void
 **/
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // addPathPatterns("/**") означает перехват всех запросов,
    registry.addInterceptor(interceptor).addPathPatterns("/**");
}

}

После завершения конфигурации Mybatis-Plugs перехватчики могут быть реализованы.  
2. Перехват запросов  
Методы контроллера не требуют каких-либо аннотаций или аннотируются @Login(handler = Handler.INTERCEPT), чтобы перехват запросов работал. Если пользователь пытается получить доступ к интерфейсу без входа в систему, система выдаст сообщение о том, что пользователь не вошёл в систему.  
3. Пропуск запросов  
Некоторые запросы не требуют входа в систему для прямого доступа, например, регистрация интерфейса, вход в интерфейс и т.д. В этом случае используйте аннотацию @Login(handler = Handler.PASS), чтобы пропустить запрос. Код примера:  
Регистрация интерфейса:  

@Login(handler = Handler.PASS) @PostMapping("/register") public ResultReturn registerUser(@RequestBody SysUserVO sysUser){ sysUser.setCompanyId(0L); return sysUserService.registerUser(sysUser); }

Входной интерфейс:  

@Login(handler = Handler.PASS) @PostMapping("/login") public ResultReturn login(@RequestBody SysUserVO vo){ return sysUserService.login(vo,request,response); }

## 🐮 Преобразование перечисления  
Иногда база данных хранит числовые типы, но в классе сущности мы хотим использовать перечисление. Mybatils-Plugs предоставляет удобный способ реализации этой потребности.  
1. Определение перечисления  
Сначала определите перечисление и реализуйте интерфейс com.enbatis.mybatisplugs.enums.BaseEnum.  
Код:  

import com.enbatis.mybatisplugs.enums.BaseEnum; public enum StatusEnum implements BaseEnum<StatusEnum,Integer> { ORDERED(0,"已下单"), PAYED(1,"已付款"), DELIVER(2,"代发货"), DELIVERED(3,"已发货"), RECEIVED(4,"已收货"), OK(5,"订单完成");

private final Integer value;
private final String description;

StatusEnum(Integer value, String description) {
    this.value = value;
    this.description = description;
}
public StatusEnum getEnumByValue(Long value) {
    StatusEnum[] enums = StatusEnum.values();
    for (StatusEnum e : enums) {
        if (e.getValue().equals(value)) {
            return e;
        }
    }
    return null;
}
@Override
public Integer getValue() {
    return value;
}

@Override
public String getDescription() {
    return description;
}

}

2. Ссылка на перечисление в классе сущности  
Необходимо изменить поле в классе сущности на тип перечисления.  

/**

  • 订单状态( private StatusEnum status;

3. Добавить класс для обработки перечислений в конфигурационный файл:

com.enbatis.mybatisplugs.plugin.parser.AutoEnumTypeHandler

Код:

```mybatis:
  mapper-locations: classpath:/mapping/*.xml
  type-aliases-package: com.panpan.housesale.entity
  configuration:
    map-underscore-to-camel-case: true
    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
default-enum-type-handler: com.enbatis.mybatisplugs.plugin.parser.AutoEnumTypeHandler```

После выполнения этих трёх шагов будет реализовано соответствие между типами полей базы данных и типами перечислений.

## 🍺 Пожертвование
Если вам нравится, пожалуйста, угостите автора чашкой кофе.
Поддержка через WeChat:

![Image text](f1.jpg)

Поддержка через Alipay:

![Image text](f2.jpg)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wdyun-mybatis-plugs.git
git@api.gitlife.ru:oschina-mirror/wdyun-mybatis-plugs.git
oschina-mirror
wdyun-mybatis-plugs
wdyun-mybatis-plugs
dev