1. 配置环境
-
导入相关依赖
<!--数据库连接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency> <!--日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--Mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
-
编写配置文件
application.yml
中配置数据源spring: thymeleaf: cache: false datasource: username: root password: 123456 #?serverTimezone=UTC解决时区的报错 url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定 #druid 数据源专有配置 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 #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
-
新建三个包
com.demo.pojo
com.demo.mapper
resources.mapper -
在
application.yml
中配置 mybatis
实体类包的别名
Mapper 文件地址mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.demo.pojo
-
编写实体类
@Data @NoArgsConstructor @AllArgsConstructor public class User { private int id; private String name; private String pwd; }
-
编写 Mapper 接口
@Mapper @Repository public interface UserMapper { @Select("select * from user") List<User> getAllUser(); @Select("select * from user where name=#{name}") User getUserByName( @Param("name") String name); @Insert("insert into user (id, name, pwd) values (#{id},#{name},#{pwd})") int addUser(User user); @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}") int updateUser(User user); @Delete("delete from user where id=#{id}") int deleteUser( @Param("id")int id); }
-
编写 Mapper.xml
基本操作都用注解做了,这里就放空<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mapper.UserMapper"> </mapper>
-
编写 Service
public interface UserService { List<User> getAllUser(); User getUserByName(String name); void addUser(User user); void updateUser(User user); void deleteUser(int id); }
-
编写实现类
@Service public class UserServiceImpl implements UserService{ @Autowired UserMapper userMapper; @Override public List<User> getAllUser() { return userMapper.getAllUser(); } @Override public User getUserByName(String name) { return userMapper.getUserByName(name); } @Override public void addUser(User user) { int rows = userMapper.addUser(user); if (rows > 0){ System.out.println("插入成功"); }else { System.out.println("插入失败"); } } @Override public void updateUser(User user) { int rows = userMapper.updateUser(user); if (rows > 0){ System.out.println("修改成功"); }else { System.out.println("修改失败"); } } @Override public void deleteUser(int id) { int rows = userMapper.deleteUser(id); if (rows > 0){ System.out.println("删除成功"); }else { System.out.println("删除失败"); } } }
-
测试
2. Shiro + Mybatis 结合使用
-
修改
UserRealm
修改后//通过参数获取登录的控制器中生成的 令牌 UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; // 用户名密码(暂时先自定义一个做测试) User user = userService.getUserByName(token.getUsername()); if (user != null){ //密码认证, Shiro 自己做,为了避免和密码的接触 //最后返回一个 AuthenticationInfo 接口的实现类,这里选择 SimpleAuthenticationInfo // 三个参数:获取当前用户的认证 ; 密码 ; 认证名 return new SimpleAuthenticationInfo("", user.getPwd(), ""); }else { // return null 就抛出没有该用户的异常 return null; }
-
使用数据库中的数据,测试