项目前期准备--MyBaitsPlus、MyBatisPlusGenerator和Spring Security(2)

举报
海拥 发表于 2021/10/16 13:56:33 2021/10/16
【摘要】 🌊 作者主页:海拥🌊 简介:🏆CSDN全栈领域优质创作者、🥇HDZ核心组成员、🥈蝉联C站周榜前十 1. 项目前期准备–MyBaitsPlusMyBatisPlus是基于MyBatis的基础之上的,它可以自动生成常规的数据访问,使得开发人员在使用时不需要自行编写那些每张表都会有常规数据访问功能,例如插入数据、根据id删除数据等。先创建数据库straw:CREATE DATABASE ...

🌊 作者主页:海拥
🌊 简介:🏆CSDN全栈领域优质创作者、🥇HDZ核心组成员、🥈蝉联C站周榜前十

1. 项目前期准备–MyBaitsPlus

MyBatisPlus是基于MyBatis的基础之上的,它可以自动生成常规的数据访问,使得开发人员在使用时不需要自行编写那些每张表都会有常规数据访问功能,例如插入数据、根据id删除数据等。

先创建数据库straw

CREATE DATABASE straw;

并使用该数据库:

USE straw;

然后创建用户数据表,便于接下来访问数据:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) UNIQUE NOT NULL COMMENT '用户名',
  `nickname` varchar(20) NULL COMMENT '昵称',
  `password` char(68) NOT NULL COMMENT '密码',
  `gender` int(1) COMMENT '性别',
  `day_of_birth` date COMMENT '生日',
  `phone` varchar(20) COMMENT '电话号码',
  `class_id` int(11) COMMENT '所属班级id',
  `created_time` datetime COMMENT '注册时间',
  `enabled` int(1) COMMENT '账号是否可用,0-否,1-是',
  `locked` int(1) COMMENT '账号是否锁定,0-否,1-是',
  `type` int(1) COMMENT '0-学生,1-老师',
  `self_introduction` varchar(255) COMMENT '自我介绍',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

接下来,还要创建与数据表对应的实体类,在blog-user模块项目中,在根包cn.tedu.blog.user下创建model子包,并在这个子包中创建实体类User

package cn.tedu.blog.user.model;

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
public class User {

    private Integer id;
    private String username;
    private String nickname;
    private String password;
    private Integer gender;
    private LocalDate dayOfBirth;
    private String phone;
    private Integer classId;
    private LocalDateTime createdTime;
    private Integer enabled;
    private Integer locked;
    private Integer type;
    private String selfIntroduction;

}

在使用MyBatisPlus之前,需要MyBatisPlus的依赖,由于当前案例只是演示这个效果,所以相关依赖添加在父项目或blog-user子模块项目中都是可以的:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

同时,还需要添加MySQL的依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

然后,还需要在application.properties中配置连接数据库的配置信息:

spring.datasource.url=jdbc:mysql://localhost:3306/straw?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

当配置完成后,应该及时测试,以保证数据库连接的配置是正确的:

@Autowired
DataSource dataSource;

@Test
void getConnection() throws SQLException {
    Connection conn = dataSource.getConnection();
    log.debug("conn > {}", conn);
}

如果需要使用Druid或其它数据库连接池,需要先添加相关依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>

然后在application.properties中配置使用Druid连接池:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=2
spring.datasource.druid.max-active=5

当需要使用MyBatisPlus时,应该在项目的根包中创建mapper子包(非必须),并在这个子包下创建UserMapper接口,该接口需要继承自MyBatisPlus提供的BaseMapper接口,在继承时,泛型为实体类的类型:

package cn.tedu.blog.user.mapper;

import cn.tedu.blog.user.model.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

@Repository
public interface UserMapper extends BaseMapper<User> {
    
}

与使用MyBatis相同,需要在配置类中添加@MapperScan注解来配置接口文件所在的包:

package cn.tedu.blog.user;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("cn.tedu.blog.user.mapper")
public class BlogUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(BlogUserApplication.class, args);
    }

}

至此,MyBaitsPlus就已经可以正常使用了,在BaseMapper接口中已经定义了许多数据访问功能,并且,MyBatisPlus会自动完成这些数据访问功能对应的SQL语句,如果不需要自定义其它的方法时,是可以直接使用的!

假设需要向用户表中插入新的用户数据,就可以直接使用BaseMapper中已经定义好的insert()方法。

blog-user模块项目的src/test/java下创建cn.tedu.blog.user.mapper.UserMapperTests测试类,编写并执行单元测试:

package cn.tedu.blog.user.mapper;

import cn.tedu.blog.user.model.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
public class UserMapperTests {

    @Autowired
    UserMapper mapper;

    @Test
    void insert() {
        User user = new User();
        user.setUsername("root");
        user.setPassword("1234");
        int rows = mapper.insert(user);
        log.debug("rows={}", rows);
    }

}

关于在IDEA中装配持久层接口对象时,使用@Autowired默认报错的解决方案:

  • 改为使用@Resource注解;
  • 配置@Autowired的注解参数为required=false,即:@Autowired(required=false)
  • 在接口之前添加@Repository注解。

如果直接执行以上单元测试,会出现以下错误:

Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class cn.tedu.blog.user.model.User' with value '1282871589072584705' Cause: java.lang.IllegalArgumentException: argument type mismatch

因在插入数据时,MyBatisPlus会自动生成Id值(例如以上错误信息中的1282871589072584705),需要显式的在实体类中与主键对应的属性之前添加@TableId注解,并且将注解属性type设置为IdType.AUTO

@Data
public class User {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    
    // 忽略后续代码
    
}

然后,再次运行,即可正常插入数据。

另外,此次运行可以看到日志中输出了此次执行的SQL语句及相关信息,之所以会显示这些日志,是因为:

  • MyBatis框架默认就会输出这些信息;
  • 必须在项目中添加SLF4j的依赖,以保证MyBatis输出日志;
  • MyBatis输出SQL日志的级别是Debug,必须将日志的显示级别设置的更低,例如设置为trace

2. 项目前期准备–MyBatisPlusGenerator

2.1. 使用MyBatisPlusGenerator生成代码

在IDEA中创建straw项目,作为父级项目,在创建教程中,将LombokSpring WebMySQLMyBatis Framework并在其中创建straw-portal子模块项目:

在这里插入图片描述

MyBatisPlus Generator是一个代码生成器,通过使用它,运行后,就可以直接生成大量代码文件(例如Java类、接口、配置SQL的XML文件),然后,将这些文件复制到正式使用的项目中,就可以省去一些基础的创建过程!

首先,代码生成器的相关使用应该在一个独立的子模块项目中,避免与其它项目产生交集(不要在正式使用的项目中使用代码生成器)!所以,继续在straw父项目中创建代码生成器专用的子模块项目straw-generator,创建过程与一般子模块项目完全相同:

在这里插入图片描述

然后,通过http://doc.canglaoshi.org/config/mybatis-plus-generator.zip下载使用代码生成器必要的2个文件(在同一个压缩包中):

在这里插入图片描述

以上的2个文件,CodeGenerator是代码生成器的执行文件,通过调整其中的配置并执行即可生成所需要的文件,mapper.java.ftl是需要生成的Java类/接口文件的模版文件。

首先,在straw-generator子模块项目中,将原有的src文件夹下的test文件删除(也可以不删,主要是留着也没用),同样的,还可以将src下的启动类(StrawGeneratorApplication)和配置文件application.properties删除(也用不上)。

straw-generator子模块项目的pom.xml中,添加必要的依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

然后,将下载解压得到的CodeGenerator.java文件直接复制到项目的cn.tedu.straw.generator包中,并打开该文件夹,检查各全局属性的值,特别是连接哪个数据库、连接数据库的用户名和密码,必须与自己当前使用的MySQL保持一致!还必须检查modelName属性的值,它表示当前聚合项目的某个子模块项目的名称,这个值将作用于最终生成的类、接口文件的包名:

在这里插入图片描述

确定无误后,在straw-generator子模块项目的src/main/resources下创建ftl文件夹,并将下载得到的mapper.java.ftl复制到这个文件夹中:

在这里插入图片描述

然后,回到CodeGenerator类中,将最后一个全局属性(用于配置模版文件的位置的属性)设置为"/ftl/mapper.java"(与以上放置文件的位置对应)。

2.2. 测试MyBatisPlusGenerator生成的代码

先在straw父项目的pom.xml中添加Druid相关依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>

straw-portal项目的application.properties配置:

server.port=8080

spring.datasource.url=jdbc:mysql://localhost:3306/straw?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=2
spring.datasource.druid.max-active=7

mybatis.mapper-locations=classpath:mapper/*.xml

logging.level.cn.tedu.straw.portal=trace

在项目的启动类上添加注解,配置接口文件的位置:

@MapperScan("cn.tedu.straw.portal.mapper")

全部完成后,在straw-portal子模块项目的src/test/java下创建cn.tedu.straw.portal.mapper.UserMapperTests测试类,进行简单的功能测试:

package cn.tedu.straw.portal.mapper;

import cn.tedu.straw.portal.model.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.jws.soap.SOAPBinding;
import javax.sql.DataSource;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

@SpringBootTest
@Slf4j
public class UserMapperTests {

    @Autowired
    DataSource dataSource;
    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {
        log.debug("UserMapperTests.context");
    }

    @Test
    void getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        log.debug("connection > {}", connection);
    }

    @Test
    void insert() {
        User user = new User();
        user.setUsername("plus");
        user.setPassword("1234");
        int rows = userMapper.insert(user);
        log.debug("rows={}", rows);
    }

    @Test
    void selectById() {
        Integer id = 1;
        User user = userMapper.selectById(id);
        log.debug("user > {}", user);
    }

    @Test
    void selectList() {
        List<User> users = userMapper.selectList(null);
        log.debug("count={}", users.size());
        for (User user : users) {
            log.debug("user > {}", user);
        }
    }

}

3. 项目前期准备–Spring Security

Spring Security是Spring提供的安全组件,主要用于在项目中对用户的身份进行识别和认证。

使用Spring Security之前,需要添加依赖,可以在创建SpringBoot项目时直接勾选,也可以在已经创建好的项目中添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

首先,Spring Security可以实现对密码的加密处理!在straw-portal子模块项目中创建cn.tedu.straw.portal.security.SecurityConfig配置类,需要添加@Configuration注解,在类中自定义方法,返回PasswordEncoder的对象交给Spring容器,其对象的类型可以使用BCryptPasswordEncoder类型的对象:

package cn.tedu.straw.portal.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

然后,在src/test/java下创建cn.tedu.straw.portal.SecurityTests测试类,测试加密:

package cn.tedu.straw.portal;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;

@SpringBootTest
@Slf4j
public class SecurityTests {

    @Autowired
    PasswordEncoder passwordEncoder;

    @Test
    void encode() {
        String rawPassword = "123456";
        String encodePassword = passwordEncoder.encode(rawPassword);
        log.debug("raw password={}, encode password={}", rawPassword, encodePassword);
    }

}

🌊 面试题库:Java、Python、前端核心知识点大全和面试真题资料
🌊 电子图书:图灵程序丛书 300本、机械工业出版社6000册免费正版图书
🌊 办公用品:精品PPT模板几千套,简历模板一千多套
🌊 学习资料:2300套PHP建站源码,微信小程序入门资料

公众号【海拥】内回复【资源】获取以上所有资料

我已经写了很长一段时间的技术博客,这是我的一篇关于整合基于注解的SSM框架小结。我乐于通过文章分享技术与快乐。您可以访问我的博客主页: 华为云-海拥、我的个人博客:haiyong.site 以了解更多信息。希望你们会喜欢!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。