SpringBoot整合MybatisPlus+BootStrap实战

这篇文章的主要内容如下:

  • SpringBoot整合Mybatis(使用Mybatis-Puls)
  • 使用Mybatis-Plus自动生成代码
  • 引入Bootstrapmuban实现简单登录功能

下列文件供参考:

  • Mybatis-Plus官方文档
  • Thymeleaf官方文档
  • Bootstrap4官方文档
  • 项目GitHub(持续更新)

1.初始化项目->引入依赖

  • Thymeleaf
  • Mysql
  • JDBC
  • Spring Web
  • MybatisPlus(注意:不要引入Mybatis相关依赖,MybatisPlus会帮我们管理
  • BootStrap
  • Jquery

完整Pom文件如下:



    4.0.0

    com.captainxero
    mybatisplus
    0.0.1-SNAPSHOT
    jar

    mybatisplus
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.2.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
    
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        

        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            mysql
            mysql-connector-java
            runtime
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
        
            com.baomidou
            mybatis-plus
            2.3
        

        
            com.baomidou
            mybatisplus-spring-boot-starter
            1.0.5
        

        
        
            org.apache.velocity
            velocity
            1.7
        

        
        
            com.alibaba
            druid
            1.0.28
        

        
            org.webjars
            bootstrap
            4.1.0
        

        
            org.webjars
            jquery
            3.3.1-1
        

    

    
        
            
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    



2.配置文件


server:
  # 默认服务端口
  port: 80
  tomcat:
    uri-encoding: utf-8

# Spring配置
spring:
  thymeleaf:
    mode: LEGACYHTML5
    cache: false

  # 配置数据源
  datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.jdbc.Driver
      # Mysql
      url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
      username: root
      password: 1qaz2wsx
      initialSize: 1
      minIdle: 3
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,slf4j
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

3.自动生成代码

  • 编写MysqlGenerator类,用来控制MybatisPlus的自动生成代码功能。
public class MysqlGenerator {
    private static String packageName="src/main";                //初始文件路径
    private static String customPath="project.system.user";      //自定义路径
    private static String authorName="Captainxero";              //作者
    private static String table="sys_user";                      //table名字
    private static String prefix="sys_";                         //table前缀
    private static File file = new File(packageName);
    private static String path = file.getAbsolutePath();

    public static void main(String[] args) {
        System.out.println("绝对路径" + path);
        // 自定义需要填充的字段
        List tableFillList = new ArrayList<>();
        tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        .setOutputDir(path+"/java")//输出目录
                        .setFileOverride(true)// 是否覆盖文件
                        .setActiveRecord(true)// 开启 activeRecord 模式
                        .setEnableCache(false)// XML 二级缓存
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList
                        .setOpen(false)//生成后打开文件夹
                        .setAuthor(authorName)
                        // 自定义文件命名,注意 %s 会自动填充表实体属性!
                        .setMapperName("%sMapper")
                        .setXmlName("%sMapper")
                        .setServiceName("%sService")
                        .setServiceImplName("%sServiceImpl")
                        .setControllerName("%sController")
        ).setDataSource(
                // 数据源配置
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL)// 数据库类型
                        .setTypeConvert(new MySqlTypeConvert() {
                            // 自定义数据库表字段类型转换【可选】
                            @Override
                            public DbColumnType processTypeConvert(String fieldType) {
                                System.out.println("转换类型:" + fieldType);
                                // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                //    return DbColumnType.BOOLEAN;
                                // }
                                return super.processTypeConvert(fieldType);
                            }
                        })
                        .setDriverName("com.mysql.jdbc.Driver")
                        .setUsername("root")
                        .setPassword("1qaz2wsx")
                        .setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull")
        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                        // .setCapitalMode(true)// 全局大写命名
                        //.setDbColumnUnderline(true)//全局下划线命名
                        .setTablePrefix(new String[]{prefix})// 此处可以修改为您的表前缀
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                        .setInclude(new String[] { table }) // 需要生成的表
                        .setRestControllerStyle(true)
                        //.setExclude(new String[]{"test"}) // 排除生成的表
                        // 自定义实体父类
                        // .setSuperEntityClass("com.baomidou.demo.TestEntity")
                        // 自定义实体,公共字段
                        //.setSuperEntityColumns(new String[]{"test_id"})
                        .setTableFillList(tableFillList)
                        // 自定义 mapper 父类
                        // .setSuperMapperClass("com.baomidou.demo.TestMapper")
                        // 自定义 service 父类
                        // .setSuperServiceClass("com.baomidou.demo.TestService")
                        // 自定义 service 实现类父类
                        // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
                        // 自定义 controller 父类
                        //.setSuperControllerClass("com.captainxero"+packageName+".controller.AbstractController")
                // 【实体】是否生成字段常量(默认 false)
                // public static final String ID = "test_id";
                // .setEntityColumnConstant(true)
                // 【实体】是否为构建者模型(默认 false)
                // public User setName(String name) {this.name = name; return this;}
                // .setEntityBuilderModel(true)
                // 【实体】是否为lombok模型(默认 false)document
                // .setEntityLombokModel(true)
                // Boolean类型字段是否移除is前缀处理
                // .setEntityBooleanColumnRemoveIsPrefix(true)
                // .setRestControllerStyle(true)
                // .setControllerMappingHyphenStyle(true)
        ).setPackageInfo(
                // 包配置
                new PackageConfig()
                        //.setModuleName("User")
                        .setParent("com.captainxero." + customPath)// 自定义包路径
                        .setController("controller")// 这里是控制器包名,默认 web
                        .setEntity("entity")
                        .setMapper("dao")
                        .setService("service")
                        .setServiceImpl("service.impl")
                //.setXml("mapper")
        ).setCfg(
                // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map map = new HashMap<>();
                        map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                        this.setMap(map);
                    }
                }.setFileOutConfigList(Collections.singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
                    // 自定义输出文件目录
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return path+"/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
                    }
                }))
        ).setTemplate(
                // 关闭默认 xml 生成,调整生成 至 根目录
                new TemplateConfig().setXml(null)
                // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
                // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
                // .setController("...");
                // .setEntity("...");
                // .setMapper("...");
                // .setXml("...");
                // .setService("...");
                // .setServiceImpl("...");
        );

        // 执行生成
        mpg.execute();

        // 打印注入设置,这里演示模板里面怎么获取注入内容【可无】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }

}
  • 项目结构如下图所示,为了后续开发方便些,我将目录进行了较为细的划分。其中生成的代码将会写入project路径下的user目录以及resource目录下的mapper目录。


    SpringBoot整合MybatisPlus+BootStrap实战_第1张图片
    项目结构

    执行代码生成控制类,生成代码后的项目结构如图;


    SpringBoot整合MybatisPlus+BootStrap实战_第2张图片
    代码生成后的项目结构
  • UserController:主要负责User相关逻辑控制和前台交互
  • Usermapper:用户信息表 Mapper 接口
  • User:用户信息表,对应数据库中的用户表
  • UserService:用户信息表的服务类接口
  • UserServiceImpl:用户服务类
    根据MybatisPlus的官方文档,此时生成的看似空白的代码其实已经具备了基础的功能,MybatisPlus在其中封装了常用的CRUD方法。为了后续登录验证,我们在UserMapper中以注解的形式添加如下方法(完整代码文末给出)
@Select("select * from sys_user where login_name = #{loginName}")
    User selectUserByName(String loginName);

4.编写控制类

  • 在userConller中编写如下代码:
@Controller
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/login")
    public String login()
    {
        return "login";
    }

//    简单登录验证
    @PostMapping("/check")
    public String checkLogin(@RequestParam("username") String username, @RequestParam("password") String password, Map map){
//        User exampleUser = userMapper.selectById(username);
        User loginUser = userMapper.selectUserByName(username);
        String userPassword = loginUser.getPassword();
        System.out.println(userPassword);
//        String userPassword = exampleUser.getPassword();
        if(userPassword.equals(password)){
            return "index";
        }else {
            map.put("msg","用户名密码错误");
            return "login";
        }
    }

    @GetMapping("/select")
    @ResponseBody
    public User selectUser(){
        // 查询 User
        User exampleUser = userMapper.selectById(1);
        return exampleUser;
    }
}

UserConller控制器中,我们拦截login请求,返回登录界面。接着拦截Post方式的登录请求“check”,拿到用户输入的用户名和密码后去数据库查询并进行简单验证,如果登录成功则跳转主界面,登录失败进行提示并返回登录界面。

5. 引入Bootstrap模板

  • 我们将现成的Bootstrap模板导入项目中,这里注意css等资源应放在static目录下,html文件放在templates目录下。否则无法享受Thymeleaf强大的功能。
  • 将样式文件和页面复制进项目后,我们需要修改html中对资源文件的引用路径


    修改资源路径

    如上图,添加“../static/”,并引入thymeleaf标签。

6.运行项目

  • 运行MybatisplusApplication启动项目,访问http://localhost/login,看到登录界面如下:
    SpringBoot整合MybatisPlus+BootStrap实战_第3张图片
    登录界面
  • 输入错误的账号密码:


    SpringBoot整合MybatisPlus+BootStrap实战_第4张图片
    登录失败
  • 输入正确账号密码,跳转主页:


    SpringBoot整合MybatisPlus+BootStrap实战_第5张图片
    登录进主页

7.附录

  • Sql文件
/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50720
Source Host           : localhost:3306
Source Database       : mybatis_plus

Target Server Type    : MYSQL
Target Server Version : 50720
File Encoding         : 65001

Date: 2018-06-05 20:52:19
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `dept_id` int(20) DEFAULT NULL COMMENT '部门ID',
  `login_name` varchar(30) DEFAULT '' COMMENT '登录账号',
  `user_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
  `email` varchar(100) DEFAULT '' COMMENT '用户邮箱',
  `phonenumber` varchar(20) DEFAULT '' COMMENT '手机号码',
  `sex` char(20) DEFAULT '0' COMMENT '用户性别:0男,1女',
  `avatar` varchar(100) DEFAULT '' COMMENT '头像路径',
  `password` varchar(100) DEFAULT '' COMMENT '密码',
  `salt` varchar(100) DEFAULT '' COMMENT '盐加密',
  `user_type` char(1) DEFAULT 'N' COMMENT '类型:Y默认用户,N非默认用户',
  `status` int(1) DEFAULT '0' COMMENT '帐号状态:0正常,1禁用',
  `refuse_des` varchar(500) DEFAULT '' COMMENT '拒绝登录描述',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='用户信息表';

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('1', '101', 'admin', '管理员', '[email protected]', '15888888888', '1', '', 'admin', '111111', 'Y', '0', '正常', 'admin', '2018-06-04 16:58:19', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('2', '102', 'ls', '李四', '[email protected]', '15888888888', '1', '', '123456', '222222', 'N', '0', '正常', 'admin', '2018-06-04 16:58:21', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('3', '103', 'ly', '刘一', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:23', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('5', '104', 'zs', '张三', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:26', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('6', '105', 'ls', '李四', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-05 09:07:58', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('7', '106', 'ww', '王五', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:47', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('8', '106', 'zl', '赵六', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:47', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('9', '106', 'sq', '孙七', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:48', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('10', '106', 'zb', '周八', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:49', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('11', '106', 'wj', '吴九', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:57:49', 'admin', '2018-06-04 11:33:00');
INSERT INTO `sys_user` VALUES ('12', '106', 'ys', '阳十', '[email protected]', '15888888888', '0', '', '123456', '123456', 'N', '0', '正常', 'admin', '2018-06-04 16:58:06', 'admin', '2018-06-04 11:33:00');
SET FOREIGN_KEY_CHECKS=1;

结束语

登录验证后续会学习并整合安全框架Shiro并进行相关鉴权与拦截,主界面目前仅仅是静态页面,后续逐步完善相关功能。
项目下载(百度网盘):https://pan.baidu.com/s/1-GxZInjAsd_XrDPgvt8r2g 密码:6nb5

你可能感兴趣的:(SpringBoot整合MybatisPlus+BootStrap实战)