Запрос 1
maxPoolPreparedStatementPerConnectionSize: 20
Значение ключа maxPoolPreparedStatementPerConnectionSize устанавливается равным 20.
useGlobalDataSourceStat: true
Логическое значение ключа useGlobalDataSourceStat устанавливается равным true.
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
Устанавливаются свойства соединения connectionProperties:
Запрос 2
В стартовом классе добавить аннотацию для сканирования маппера:
@MapperScan("com.xxxxx.xxxxx.mapper")
Мы можем быстро сгенерировать entity,controller,mapper,service,serviceImpl,mapping.xml на основе таблицы базы данных. Для генерации кода необходимо подключиться к базе данных, поэтому мы должны настроить базовую информацию о базе данных и использовать класс генератора кода CodeGenerator2 из mybatis-plugs.
Создать класс генератора 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);
}
}
Здесь:
CodeGenerator2 — основной генератор кода mybatis-plugs.
Для использования метода необходимо выполнить следующие шаги:
Необходимо создать пакеты для кода: entity, controller, mapper, service, impl и xml.
Скопировать сгенерированный код в соответствующие пакеты.
Запустить проект и обратиться к нему по адресу http://localhost:8080/v1/sys_user/list, чтобы получить список всех пользователей.
Запрос 3
Интерфейс CRUD используется для быстрой реализации операций CRUD (Create, Read, Update, Delete) в базе данных путём инкапсуляции интерфейса BaseService от mybatis.
Параметры:
Методы:
Однострочная вставка:
/**
* Вставка одной записи
* @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);
По первичному ключу:
/**
* Удаление по первичному ключу
* @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);
Обновление по первичному ключу:
/**
* Обновление по первичному ключу
* @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);
/**
* Запрос списка данных
* @param wrapper условие запроса
* @return список
*/
List<T> list(Wrapper<T> wrapper);
Пример использования:
Wrapper wrapper = new Wrapper<SysUser>();
wrapper.like("имя","Чжан Сань");
List<SysUser> list = super.list(wrapper);
/**
* Разбиение на страницы
* @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 для создания токенов. Конкретные методы описаны ниже:
/**
Если срок действия не указан, по умолчанию он составляет 24 часа. Мы предоставляем перегруженный метод:
/**
Как это использовать? Пожалуйста, обратитесь к следующему коду:
// Получаем имя пользователя для входа. 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 для анализа токенов. Конкретный метод описан ниже:
/**
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:

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

Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )