Конфигурация, используемая тестировщиками для тестирования программного обеспечения
Конфигурация в application.yml:
spring:
profiles:
active: dev
server:
port: 8080
Советы:
spring:
profiles:
active: dev
Укажите среду для использования
server:
port: 8080
Укажите, что порт, запущенный проектом, — это порт 8080.
Содержание application-dev.yml следующее:
mybatis:
mapper-locations: classpath:/mapping/*.xml
type-aliases-package: com.panpan.housesale.entity
configuration:
map-underscore-to-camel-case: true
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 111111
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat,wall
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
Мы можем быстро сгенерировать сущность, контроллер, маппер, сервис, сервис импл, 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);
}
}
node:
url: URL подключения к базе данных
root: Имя пользователя базы данных
psd: Пароль базы данных
filePath: Расположение для генерации Java-кода (чтобы предотвратить перезапись кода, мы не будем автоматически генерировать код в соответствующее расположение)
CodeGenerator2: ядро генератора кода mybatis-plugs
👉2. Метод использования.
Примечание: инкапсулируя интерфейс BaseService mybatis, можно быстро реализовать операции CRUD с базой данных. Вставить объект
@return T
T insert(T entity);
Использование: напишите код в слое serviceImpl следующим образом:
SysUser user = new SysUser(); user.setName("Tom"); user.setAge(32); user.setPhone("13615425135"); super.insert(user);
1.2 Пакетная вставка
/**
Использование: напишите код в слое serviceImpl следующим образом:
List sysUserList = new ArrayList<>(); for (int i = 0; i <10 ; i++) { SysUser sysUser = new SysUser(); sysUser.setName("Tom"+i); sysUser.setAge(30+i); sysUser.setPhone("1361542513"+i); sysUserList.add(sysUser); } super.saveBatch(sysUserList);
2.1 Одиночное удаление
/**
Использование: напишите код в слое serviceImpl следующим образом:
super.deleteById(12000012);
2.2 Пакетное удаление
/**
Использование: напишите код в слое serviceImpl следующим образом:
Wrapper wrapper = new Wrapper(); wrapper.eq("age",30); wrapper.like("name","Tom"); super.delete(wrapper);
Примечание: специальный конструктор условий будет объяснён отдельно.
3 Интерфейс обновления
3.1 Одиночное обновление
/**
Использование: напишите код в слое serviceImpl следующим образом:
SysUser sysUser = new SysUser(); sysUser.setId(1234561114L); sysUser.setPhone("13615425135"); sysUser.setAge(36); super.updateById(sysUser);
3.2 Пакетное обновление
/**
Использование: напишите код в слое serviceImpl следующим образом:
List 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);
/**
Использование: напишите код в слое serviceImpl следующим образом:
Wrapper wrapper = new Wrapper(); wrapper.like("name","Tom"); List list = super.list(wrapper);
/**
Использование: напишите код в контроллере следующим образом:
@PostMapping("/page") public ResultReturn<Page> getPage(@RequestBody SysUser user){ return success(sysUserService.page( getPage(),new Wrapper(user))); }
Примечание: контроллер должен расширять BaseController.
/**
Использование: напишите код в контроллере следующим образом:
@GetMapping("/{id}") public ResultReturn get(@PathVariable("id") Long id) { return success(sysUserService.getById(id)); }
/**
Использование: напишите код в слое serviceImpl следующим образом:
Wrapper wrapper = new Wrapper(); wrapper.like("name","Tom"); int count = super.selectCount(wrapper); 2. ne constructor
Если мы хотим быстро запросить таблицу базы данных sys_user и получить имена, отличные от «Tom», как это сделать?
Ответ: просто вызовите сервис для вызова списка, передав в конструктор-обёртку условие, и обёртка вызовет метод ne. Следующий метод — это запрос к списку sysuser, чьё имя не Tom.
sysUserService.list(new Wrapper<>(sysUser).ne("name","Tom"));
3. like constructor
Если мы хотим выполнить запрос с использованием подстановочных знаков по имени, как это сделать?
Ответ: просто вызовите список, чтобы передать в конструктор-обёртку условие, и обёртка вызовет метод like. Следующий метод представляет собой запрос на основе имени «Tom» с использованием подстановочного знака.
sysUserService.list(new Wrapper<>(sysUser).like("name","Tom"));
4. in constructor
Если мы хотим запросить имена «Tom», «Jack» и «June», как действовать?
Ответ: просто вызовите службу, чтобы передать в обёртку конструктора условие, а обёртке — вызвать метод 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.
## 🐮 Аутентификация при входе
Mybatis-plugs внутренне инкапсулирует аутентификацию JWT Token, которую можно использовать напрямую при выполнении функции входа.
1. Создайте JWT
Mybatis-плагины предоставляют инструментальные классы JwtUtil для создания токена. Конкретные методы следующие:
```/**
* Первые три параметра — это некоторая информация о пользовательском токене, такая как ID, разрешение, имя и т. д. Не помещайте конфиденциальную информацию (каждый может её получить)
* @param map Информация для шифрования
* @param security Зашифрованная строка
* @param expire Время отказа (MS)
* @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<SysUser> list=list(new Wrapper().eq("username",username).eq("password",password));
Optional<SysUser> 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); }
Mybatis-plugs предоставляет класс инструмента jwtutil для анализа токенов. Конкретные методы следующие:
/**
3. Инкапсуляция сущности входа
После успешного входа вы можете использовать токен для получения учётной записи сущности входа для получения пользователя входа. Конкретный метод следующий:
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) { }
/**
* @Description Этот метод используется для регистрации перехватчика. Написанный нами перехватчик необходимо зарегистрировать здесь, чтобы он вступил в силу
* @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 interface:
@Login(handler = Handler.PASS) @PostMapping("/login") public ResultReturn login(@RequestBody SysUserVO vo){ return sysUserService.login(vo,request,response); }
Иногда база данных хранит числовые типы, но нам нужно использовать классы перечисления в классах сущностей. В этом случае MyBatils Plugs предоставляет удобный и быстрый способ удовлетворить требования.
Сначала настройте класс перечисления и реализуйте интерфейс com.enbatis.mybatisplugs.enums.BaseEnum. Код выглядит следующим образом:
import com.enbatis.mybatisplugs.enums.BaseEnum;
public enum StatusEnum implements BaseEnum<StatusEnum,Integer> {
ORDERED(0,"OrderPlaced"),
PAYED(1,"Paid"),
DELIVER(2,"ToBeShipped"),
DELIVERED(3,"Shipped"),
RECEIVED(4,"ReceivedGoods"),
OK(5,"OrderEnd");
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;
}
}
Необходимо изменить поле на тип перечисления в классе сущности, как показано ниже:
/**
* Orde status(
*/
private StatusEnum status;
Вам необходимо добавить класс для преобразования enum в файле конфигурации: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 Sweep
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )