这篇文章的主要内容如下:
- 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目录。
执行代码生成控制类,生成代码后的项目结构如图;
- 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,看到登录界面如下:
-
输入错误的账号密码:
-
输入正确账号密码,跳转主页:
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