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

OSCHINA-MIRROR/wdyun-mybatis-plugs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.en.md

Конфигурация, используемая тестировщиками для тестирования программного обеспечения

  1. Конфигурация, используемая производственной средой для онлайн-развёртывания

Конфигурация в 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. Метод использования.

  1. Выполните метод main.
  2. В консоли введите автора и таблицу для генерации кода.
  3. После ввода нажмите Enter.
  4. Когда будет выведена следующая информация, генерация кода будет успешной.
  5. Перейдите в место генерации кода, чтобы просмотреть сгенерированный код.
    👉3. Создайте пакет кода.
    Создайте пакет кода: entity, controller, mapper, service, impl, а также папки файлов xml.
    👉4. Скопируйте код.
    Скопируйте сгенерированный код в соответствующую папку.
    👉5. Запустите проект.
    Запустите проект, получите доступ к http://localhost:8080/v1/sys_user/list для запроса списка всех пользователей.

🐮 Интерфейс CRUD

Примечание: инкапсулируя интерфейс 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 Пакетная вставка

/**

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

Использование: напишите код в слое 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);

  1. Интерфейс удаления

2.1 Одиночное удаление

/**

  • Удалить часть данных по ID
  • @param id Входящий запрос ID
  • @return Количество удалённых элементов */ int deleteById(Serializable id);

Использование: напишите код в слое serviceImpl следующим образом:

super.deleteById(12000012);

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

/**

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

Использование: напишите код в слое serviceImpl следующим образом:

Wrapper wrapper = new Wrapper(); wrapper.eq("age",30); wrapper.like("name","Tom"); super.delete(wrapper);

Примечание: специальный конструктор условий будет объяснён отдельно.

3 Интерфейс обновления

3.1 Одиночное обновление

/**

  • Обновить часть данных по ID
  • @param bean Входящий объект обновления
  • @return Возвращает количество обновлений */ int updateById(T bean);

Использование: напишите код в слое serviceImpl следующим образом:

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

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

/**

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

Использование: напишите код в слое 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);

  1. Интерфейс запроса списка

/**

  • Запрос данных списка
  • @param wrapper Условие запроса
  • @return список */ List list(Wrapper wrapper);

Использование: напишите код в слое serviceImpl следующим образом:

Wrapper wrapper = new Wrapper(); wrapper.like("name","Tom"); List list = super.list(wrapper);

  1. Страничный запрос

/**

  • Страничный запрос
  • @param page
  • @param wrapper
  • @return */ Page page(Page page, Wrapper wrapper);

Использование: напишите код в контроллере следующим образом:

@PostMapping("/page") public ResultReturn<Page> getPage(@RequestBody SysUser user){ return success(sysUserService.page( getPage(),new Wrapper(user))); }

Примечание: контроллер должен расширять BaseController.

  1. Запрос одиночного объекта

/**

  • Получить по ID
  • @param id Объект ID
  • @return объект */ T getById(Serializable id);

Использование: напишите код в контроллере следующим образом:

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

  1. Запрос количества объектов

/**

  • запрос количества
  • @param wrapper условие запроса
  • @return число */ int selectCount(Wrapper wrapper);

Использование: напишите код в слое 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 для анализа токенов. Конкретные методы следующие:

/**

  • decrypt
  • @param jsonWebToken token String
  • @param security security Encrypted string
  • @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. Инкапсуляция сущности входа  
После успешного входа вы можете использовать токен для получения учётной записи сущности входа для получения пользователя входа. Конкретный метод следующий:

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); }

🐮 Преобразование enum

Иногда база данных хранит числовые типы, но нам нужно использовать классы перечисления в классах сущностей. В этом случае MyBatils Plugs предоставляет удобный и быстрый способ удовлетворить требования.

  1. Определите класс перечисления

Сначала настройте класс перечисления и реализуйте интерфейс 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;
    }
}
  1. Ссылка на класс сущности перечисления

Необходимо изменить поле на тип перечисления в классе сущности, как показано ниже:

/**
 * Orde status(
 */
private StatusEnum status;
  1. Добавьте профиль

Вам необходимо добавить класс для преобразования 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
Image text

Поддержка Alipay Sweep

Image text

Комментарии ( 0 )

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

Введение

Расширение и улучшение mybatis. Развернуть Свернуть
Java и 3 других языков
Apache-2.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