先讲些废话###
- 距离发表上一篇SpringBoot的文章已经时隔一年多了,在那之后再也没在实际项目中用到过SpringBoot,基本上在公司里面用的都是普通的SSM,在这之间也换了几家公司,第二家真的是呆了两个月就呆不下去了(Spring+xwork+Hibernate以及 JSP+ExtJS 这么老的东西真的受不了)这些都是题外话,反正就是想说基本接触不到SpringBoot。现在回头看我一年前写的那篇文章真的是乱七八糟的23333,不知道那么多看了的人是什么想法,被误导了不少吧哈哈哈哈。
- 好了,现在开始重新写一篇简单的SpringBoot+MyBatis整合当然基于Maven来管理项目。重新开始写这篇文章的原因是我想自己做一套属于自己的账单管理系统,思来想去如果在业余时间用普通的SSM来开发比较费时,而且部署的时候也比较麻烦。何不用轻量化的SpringBoot呢,这样一来业余时间也能学到不少新知识,毕竟
大部分公司不太喜欢用这种新技术。废话那么多,下面开始正题。 - 本文尽量精简,保证能运行且功能都有。后续新增也有可能的哟
SpringBoot+MyBatis整合篇##
1. 首先是pom文件配置,引入必须的jar依赖-应该是最简化了:###
<?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">
<parent>
<artifactId>billing</artifactId>
<groupId>com.tony.billing</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<properties>
<!-- 这里配置启动类和版本号 -->
<start.class>com.tony.billing.Application</start.class>
<service.version>1.0-SNAPSHOT</service.version>
<!-- 防止打包之后因为编码问题变乱码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 这里指定SpringBoot和MyBatis相关的版本,这两个会自动引入相关的Spring,SpringMVC,MyBatis等依赖 -->
<spring-boot.version>1.5.3.RELEASE</spring-boot.version>
<mybatis-spring-boot.version>1.3.0</mybatis-spring-boot.version>
<!-- 引入mysql-jdbc -->
<mysql-connector.version>6.0.6</mysql-connector.version>
<!-- 后面可以再引入一些工具类什么的,这里省略 需要说明的是springboot好像是自带logback和slf4j依赖的,版本没要求的话可以不用再显示引入-->
</properties>
<artifactId>web</artifactId>
<dependencies>
<!-- springboot可以只导入这两个依赖便能启动,很方便 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 这个插件是springboot针对maven打包的,和上面${start.class}配套 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 这个是maven编译的配置不多废话,可以自己查阅相关内容 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 然后是application.yml配置[这个YAML配置还不是特别熟悉,只是做做基本的介绍]详细的可以再查阅其他资料
# Server settings
server:
port: 8080
address: localhost
tomcat:
uri-encoding: utf-8
# SPRING PROFILES
spring:
# HTTP ENCODING
http:
encoding.charset: UTF-8
encoding.force: true
encoding.enabled: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 需要说明的是mysql-jdbc 6.0+需要添加serverTimezone=UTC不然会因为时区问题报错,这里用了CTT中国台湾时区避免产生8小时时差
url: jdbc:mysql://localhost:3306/my_2017_cost?serverTimezone=CTT&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: password
# MyBatis
mybatis:
#指定实体类地址
typeAliasesPackage: com.tony.billing.entity
#指定SqlMap映射文件位置
mapperLocations: classpath:/sqlMapper/*SqlMap.xml
#指定mysql-config配置文件
configLocation: classpath:/mybatis-config.xml
3. mybatis-config.xml 没啥特别的 依旧照搬老的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="dialect" value="mysql" />
</properties>
<settings>
<!-- 这个配置使全局的映射器启用或禁用缓存。系统默认值是true,设置只是为了展示出来 -->
<setting name="cacheEnabled" value="true" />
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 系统默认值是true,设置只是为了展示出来 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。 系统默认值是true,设置只是为了展示出来 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!--使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。 系统默认值是true,设置只是为了展示出来 -->
<setting name="useColumnLabel" value="true" />
<!--允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如
Derby)。 系统默认值是false,设置只是为了展示出来 -->
<setting name="useGeneratedKeys" value="false" />
<!--配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 系统默认值是SIMPLE,设置只是为了展示出来 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!--设置超时时间,它决定驱动等待一个数据库响应的时间。 系统默认值是null,设置只是为了展示出来 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
</configuration>
- 这里不再用自动代码生成了,为了方便维护还是老老实实的自己写比较好哦,当然也可以偷懒自己写一个代码生成工具这里不再详述。
4. Logback.xml配置 目前来看logback是替代log4j的存在,很多方面比后者好。
- 具体配置也是基本照搬网上的,为了尽量精简也没有对不同类别的内容进行区分。深入的内容依旧是不再详述,请自行查阅资料 【傲娇脸】
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<logger name="org.springframework.web" level="INFO" />
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_PATH" value="/home/billing/logs/" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<totalSizeCap>30MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 异步记录文件 -->
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>500</queueSize>
<appender-ref ref="FILE" />
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="asyncFileAppender" />
</root>
<!-- 这个配置比较关键,对dao配置成DEBUG打印sql语句,方便调试查错 -->
<logger name="com.tony.billing.dao" level="DEBUG">
</logger>
</configuration>
后面自上而下说明Java代码
5. Application.java 主方法
@SpringBootApplication // 注释为SpringBoot启动类
@ComponentScan // 自动扫描
@MapperScan("com.tony.billing.dao.mapper") // 自动隐射sqlMap到com.tony.billing.dao.mapper下面,不用再写更多的代码配置mybatis很方便
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
// 这个方法还是比较实用的,就是在@ResponseBody转换json的时候不打印null的内容
@Bean
public ObjectMapper jsonMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// null 不输出
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}
}
6. HelloWorldController.java 实现最基本的登陆功能
- 调用AdminService
@RestController // 这个是@ResponseBody和@Controller的合并,不用再在每个方法上面重复写@ResponseBody
public class HelloWorldController extends BaseController {
@Resource
private AdminService adminService;
@RequestMapping(value = "/user/login", method = RequestMethod.POST)
public BaseResponse login(@ModelAttribute("request") AdminLoginRequest request, HttpServletResponse httpServletResponse) {
BaseResponse response = new BaseResponse();
try {
Admin loginAdmin = new Admin();
loginAdmin.setUserName(request.getUserName());
loginAdmin.setPassword(Md5Util.md5(request.getPassword()));
Admin admin = adminService.login(loginAdmin);
if (admin != null) {
ResponseUtil.success(response);
} else {
ResponseUtil.error(response);
}
} catch (Exception e) {
logger.error("/user/login error", e);
ResponseUtil.sysError(response);
}
return response;
}
@RequestMapping(value = "/hello/world", method = RequestMethod.GET)
public BaseResponse helloWorld() {
BaseResponse response = new BaseResponse();
response.setMsg("HelloWorld");
response.setCode("1024");
return response;
}
}
7. AdminServiceImpl.java 实现最基本的登陆功能,AdminService接口内容就不贴了一眼就能看出来是啥
- 调用AdminDao
@Service
public class AdminServiceImpl implements AdminService {
@Resource
private AdminDao adminDao;
@Override
public Admin login(Admin admin) {
// 正常来说,这里应该是控制在一个事务里面的需要注意
Admin checkUser = adminDao.preLogin(admin);
if (checkUser != null) {
if (adminDao.doLogin(checkUser) > 0) {
return checkUser;
}
}
return null;
}
}
8. AdminDaoImpl内容 实现登陆校验和执行登陆操作
@Service("adminDao")
public class AdminDaoImpl implements AdminDao {
@Resource
private AdminMapper adminMapper;
@Override
public Long doLogin(Admin admin) {
return adminMapper.doLogin(admin);
}
@Override
public Admin preLogin(Admin admin) {
admin.setLastLogin(new Date());
return adminMapper.preLogin(admin);
}
}
9. AdminMapper的话就是个接口 对应到SqlMap.xml文件
@Repository // 需要加上注释,其实就是组件
public interface AdminMapper {
Long doLogin(Admin admin);
Admin preLogin(Admin admin);
}
10. AdminSqlMap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- 这里namespace需要对应到Mapper不然无法正常运行,下面的id也是要和Mapper定义的方法名一一对应,详细内容都是可以去网上查到的 -->
<mapper namespace="com.tony.billing.dao.mapper.AdminMapper">
<sql id="all">
id id,
tokenId tokenId,
tokenVerify tokenVerify,
code code,
userName userName,
password password,
lastLogin lastLogin,
createTime createTime,
modifyTime modifyTime,
version version,
isDeleted isDeleted
</sql>
<update id="doLogin" parameterType="com.tony.billing.entity.Admin">
UPDATE t_admin
SET lastLogin = #{lastLogin,jdbcType=TIMESTAMP},
WHERE
userName = #{userName,jdbcType=VARCHAR}
AND password = #{password,jdbcType=VARCHAR}
AND isDeleted = 0
</update>
<select id="preLogin" parameterType="com.tony.billing.entity.Admin" resultType="com.tony.billing.entity.Admin">
SELECT
<include refid="all"/>
FROM t_admin
WHERE userName = #{userName,jdbcType=VARCHAR}
AND password = #{password,jdbcType=VARCHAR}
AND isDeleted = 0
</select>
</mapper>
至此,基本的配置和代码都已经完成。
-
在ide中运行或者maven打包后 java -jar运行
-
然后可以访问http://localhost:8080/hello/world,得到喜闻乐见的内容:
{"msg":"HelloWorld","code":"1024"}
-
也可以用post方法试试登陆,当然需要自己在数据库建表并里面插入相应一条能登陆的数据【太过简单内容丢失了~】
致辞
- 感谢各位读者不嫌弃我一年前写的那篇乱七八糟的文章,鞠躬~
- 虽然过了一年多,我依旧还是个初学者,本文如有错误欢迎指正。
- 更多源码详见GitHub:https://github.com/TonyJiangWJ/BillingServer 尚处于开发状态!
- ...
网友评论