# testmyybatis
**Repository Path**: feiltel/testmyybatis
## Basic Information
- **Project Name**: testmyybatis
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-09-28
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#MyBatis 集成步骤
#####controller---Service--UserMapper--UserMapper.xml-Sql
1. 配置式:有xml文件 com.nut2014.mapper.UserDao
2. 注解式:无xml文件 com.nut2014.mapper.UserMapper
##一、分页配置
####1. pox.xml
```
com.github.pagehelper
pagehelper
5.1.2
com.github.pagehelper
pagehelper-spring-boot-autoconfigure
1.2.3
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.3
```
####2. application.properties
```
#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
```
####3. 创建配置类
```
@Configuration
public class PageHelperConfig {
@Bean
public PageHelper getPageHelper() {
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
```
####4. 使用
```
@RequestMapping("/getPageUser")
@Transactional(readOnly = true)
public List getPageUser(int pageNum) {
//pageNum:表示第几页 pageSize:表示一页展示的数据
PageHelper.startPage(pageNum, 3);
List list = userService.getAllUser();
//将查询到的数据封装到PageInfo对象
PageInfo pageInfo = new PageInfo(list, 3);
System.out.println(pageInfo.getTotal()+">>>>>>");
//分割数据成功
return list;
}
```
##二、开启二级缓存,通过接口操作数据会自动刷新缓存
####1. mapper.java
```
@CacheNamespace //开启二级缓存
```
####2. application.properties
```
mybatis.configuration.cache-enabled=true
```
##三、多数据源配置
####1. application.properties
```
spring.datasource.hikari.db1.jdbc-url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.hikari.db1.username=root
spring.datasource.hikari.db1.password=tf26535..
spring.datasource.hikari.db1.driver-class-name=com.mysql.cj.jdbc.Driver
```
####2. 创建数据源配置类
```
@Configuration
@MapperScan(basePackages = "com.nut2014.mapper", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DataSource1Config {
/**
* 生成数据源. @Primary 注解声明为默认数据源
*/
@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari.db1")
@Primary
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
/**
* 创建 SqlSessionFactory
*/
@Bean(name = "db1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
/**
* 配置事务管理
*/
@Bean(name = "db1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
####3. 使用
在mapper文件加上注解
```
@Qualifier("db1SqlSessionTemplate")
public interface UserDao {
```
##四、数据库支持emoji
####1. my.ini 增加配置 验证
```
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
```
####2. 数据库,表编码统一使用utf8mb4
```
/*修改数据库编码*/
ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
/*修改表编码*/
ALTER TABLE cover CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```
##五,集成JWT 实现token验证登录
####1.引入依赖
```
com.auth0
java-jwt
3.4.0
```
####2.加入自定义注解
```
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
boolean required() default true;
}
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
boolean required() default true;
}
```
####3.加入生成token的Service
```
@Service
public class TokenService {
public String getToken(User user) {
String token="";
token= JWT.create().withAudience(user.getId()+"")
.sign(Algorithm.HMAC256(user.getPassWord()));
return token;
}
}
```
####4.加入拦截器
```
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
String token = httpServletRequest.getHeader("token");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if (!(object instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) object;
Method method = handlerMethod.getMethod();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null) {
throw new RuntimeException("无token,请重新登录");
}
// 获取 token 中的 user id
String userId;
try {
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
throw new RuntimeException("401");
}
User user = userService.get(Integer.parseInt(userId));
if (user == null) {
throw new RuntimeException("用户不存在,请重新登录");
}
// 验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassWord())).build();
try {
jwtVerifier.verify(token);
} catch (JWTVerificationException e) {
throw new RuntimeException("401");
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {
}
}
```
####5.配置拦截器
```
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns("/**"); // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
}
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}
```
####6.验证
1. 登录时返回token ,之后每次请求头都带上token 参数
2. 在想要验证的方法加入 @UserLoginToken 注解