這篇文章的主要內(nèi)容如下:
- SpringBoot整合Mybatis(使用Mybatis-Puls)
- 使用Mybatis-Plus自動生成代碼
- 引入Bootstrapmuban實現(xiàn)簡單登錄功能
下列文件供參考:
1.初始化項目->引入依賴
- Thymeleaf
- Mysql
- JDBC
- Spring Web
- MybatisPlus(注意:不要引入Mybatis相關(guān)依賴豹悬,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 阿里數(shù)據(jù)庫連接池 -->
<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:
# 默認服務(wù)端口
port: 80
tomcat:
uri-encoding: utf-8
# Spring配置
spring:
thymeleaf:
mode: LEGACYHTML5
cache: false
# 配置數(shù)據(jù)源
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(
// 數(shù)據(jù)源配置
new DataSourceConfig()
.setDbType(DbType.MYSQL)// 數(shù)據(jù)庫類型
.setTypeConvert(new MySqlTypeConvert() {
// 自定義數(shù)據(jù)庫表字段類型轉(zhuǎn)換【可選】
@Override
public DbColumnType processTypeConvert(String fieldType) {
System.out.println("轉(zhuǎn)換類型:" + 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 實現(xiàn)類父類
// .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
// 自定義 controller 父類
//.setSuperControllerClass("com.captainxero"+packageName+".controller.AbstractController")
// 【實體】是否生成字段常量(默認 false)
// public static final String ID = "test_id";
// .setEntityColumnConstant(true)
// 【實體】是否為構(gòu)建者模型(默認 false)
// public User setName(String name) {this.name = name; return this;}
// .setEntityBuilderModel(true)
// 【實體】是否為lombok模型(默認 false)<a >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 設(shè)置的值
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(
// 關(guān)閉默認 xml 生成酪惭,調(diào)整生成 至 根目錄
new TemplateConfig().setXml(null)
// 自定義模板配置希痴,模板可以參考源碼 /mybatis-plus/src/main/resources/template 使用 copy
// 至您項目 src/main/resources/template 目錄下,模板名稱也可自定義如下配置:
// .setController("...");
// .setEntity("...");
// .setMapper("...");
// .setXml("...");
// .setService("...");
// .setServiceImpl("...");
);
// 執(zhí)行生成
mpg.execute();
// 打印注入設(shè)置春感,這里演示模板里面怎么獲取注入內(nèi)容【可無】
System.err.println(mpg.getCfg().getMap().get("abc"));
}
}
-
項目結(jié)構(gòu)如下圖所示润梯,為了后續(xù)開發(fā)方便些,我將目錄進行了較為細的劃分甥厦。其中生成的代碼將會寫入project路徑下的user目錄以及resource目錄下的mapper目錄纺铭。
執(zhí)行代碼生成控制類,生成代碼后的項目結(jié)構(gòu)如圖;
- UserController:主要負責(zé)User相關(guān)邏輯控制和前臺交互
- Usermapper:用戶信息表 Mapper 接口
- User:用戶信息表刀疙,對應(yīng)數(shù)據(jù)庫中的用戶表
- UserService:用戶信息表的服務(wù)類接口
- UserServiceImpl:用戶服務(wù)類
根據(jù)MybatisPlus的官方文檔舶赔,此時生成的看似空白的代碼其實已經(jīng)具備了基礎(chǔ)的功能,MybatisPlus在其中封裝了常用的CRUD方法谦秧。為了后續(xù)登錄驗證竟纳,我們在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”,拿到用戶輸入的用戶名和密碼后去數(shù)據(jù)庫查詢并進行簡單驗證集歇,如果登錄成功則跳轉(zhuǎn)主界面桶略,登錄失敗進行提示并返回登錄界面。
5. 引入Bootstrap模板
- 我們將現(xiàn)成的Bootstrap模板導(dǎo)入項目中诲宇,這里注意css等資源應(yīng)放在static目錄下际歼,html文件放在templates目錄下。否則無法享受Thymeleaf強大的功能姑蓝。
-
將樣式文件和頁面復(fù)制進項目后鹅心,我們需要修改html中對資源文件的引用路徑
如上圖,添加“../static/”纺荧,并引入thymeleaf標簽旭愧。
6.運行項目
- 運行MybatisplusApplication啟動項目颅筋,訪問http://localhost/login,看到登錄界面如下:
-
輸入錯誤的賬號密碼:
-
輸入正確賬號密碼输枯,跳轉(zhuǎn)主頁:
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 '帳號狀態(tài):0正常,1禁用',
`refuse_des` varchar(500) DEFAULT '' COMMENT '拒絕登錄描述',
`create_by` varchar(64) DEFAULT '' COMMENT '創(chuàng)建者',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`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;
結(jié)束語
登錄驗證后續(xù)會學(xué)習(xí)并整合安全框架Shiro并進行相關(guān)鑒權(quán)與攔截议泵,主界面目前僅僅是靜態(tài)頁面,后續(xù)逐步完善相關(guān)功能用押。
項目下載(百度網(wǎng)盤):https://pan.baidu.com/s/1-GxZInjAsd_XrDPgvt8r2g 密碼:6nb5