SpringBoot整合MybatisPlus+BootStrap实战

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

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

下列文件供参考:

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

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

完整Pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.captainxero</groupId>
    <artifactId>mybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mybatisplus</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- 注意: -->
    <dependencies>
        <!-- SpringBoot 核心依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- Thymeleaf 模板引擎依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- SpringBoot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Mysql 依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- SpringBoot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Mybatis_Plus 依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>1.0.5</version>
        </dependency>

        <!-- velocity 代码生成使用模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

        <!-- Driud 阿里数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.28</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1-1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

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<TableFill> 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)<a href="https://projectlombok.org/">document</a>
                // .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<String, Object> map = new HashMap<>();
                        map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                        this.setMap(map);
                    }
                }.setFileOutConfigList(Collections.<FileOutConfig>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目录。


    项目结构

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


    代码生成后的项目结构
  • 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<String,Object> 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,看到登录界面如下:
    登录界面
  • 输入错误的账号密码:


    登录失败
  • 输入正确账号密码,跳转主页:


    登录进主页

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', '管理员', 'test@163.com', '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', '李四', 'test@163.com', '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', '刘一', 'test@163.com', '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', '张三', 'test@163.com', '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', '李四', 'test@163.com', '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', '王五', 'test@163.com', '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', '赵六', 'test@163.com', '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', '孙七', 'test@163.com', '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', '周八', 'test@163.com', '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', '吴九', 'test@163.com', '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', '阳十', 'test@163.com', '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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,263评论 25 707
  • 今天使用一个单独的控制器做欢迎页面,将scrollView直接加在self.view上。scrollView的fr...
    呦释原点阅读 149评论 0 0