一、Spring-Boot
概念:Spring Boot并不是一个框架,从根本上将,它就是一些库的集合,继承starter,约定大于配置,它早已集成了需要配置的众多信息;
作用:简化spring配置,让spring配置、监控、部署变简单,spring-boot无需在意jar版本问题
下面是Spring Boot在 org.springframework.boot 组下提供的一些Starters:
二、spring-boot 特点
1)内置tomcat(无需部署)
官方文档:https://spring.io/projects/spring-boot#learn
选择一个版本进行使用,我使用的是1.5.17
快速开始一个Maven项目
Maven项目使用spring-boot相关依赖
<?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.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- Spring Boot 父文件包含大量默认配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.17.RELEASE</version>
</parent>
<!-- Spring Boot 应用 大量依赖jar包 --> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- springframework测试 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建一个Maven父项目,一个子Maven项目
上面核心依赖包配置到父pom.xml,以后子项目都有了父类的依赖
子类springboot-hello的pom.xml依赖
springboot的启动测试
package com.yyg;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.web.bind.annotation.RestController;
//扫描有@RestController注解的类
@SpringBootApplication//(scanBasePackages="com.yyg") // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class RunApp{
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
使用spring-boot访问页面
Controller
package com.yyg.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //支持移动端的页面访问数据
public class HelloController {
//获取属性值:默认properties 默认没有取yml
@Value("${Integer.age}")
Integer age;
@RequestMapping("/")
String home() {
return "Hello Wodasdaddwarld662dawd!"+age;
}
}
2)热部署(无需重启tomcat)
父类pom.xml加入热部署依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
修改代码时,控制台自动重启
3)自定义启动界面
在resource下配置banner.txt即可,内容自定义
4)spring-boot属性文件(替代了xml文件)
Application.yml 层级关系
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
Application.properties
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setupenvironments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
两个文件同时存在以application.properties为准,它没有,yml有的话就以yml为准
获取配置文件属性
Controller
@RestController //支持移动端的页面访问数据
public class HelloController {
//获取属性值:默认properties 默认没有取yml
@Value("${Integer.age}")
Integer age;
@RequestMapping("/")
String home() {
return "Hello Wodasdqaddwarld6wd62dawd!"+age;
}
}
5)spring-boot返回json
创建一个Maven项目
需要jsp依赖包才能编译
<!--必须有才能编译jsp -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
Controller
@Controller
public class IndexContrller {
//跳转index.jsp页面
@RequestMapping("/")
String home(HttpServletRequest request) {
request.setAttribute("age", 116);
return "index";
}
//返回json
@RequestMapping("/json")
@ResponseBody
Object getJson() {
Map<String, Object> map=new HashMap<>();
map.put("name","阳");
return map;
}
}
启动spring-boot
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class RunApp{
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
三、Maven项目的打包
父类Maven项目的pom.xml植入打包依赖
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
点击需要打包的项目右键–>Run as
四Spring-boot持久化 (准备数据库和测试表)
1)持久化JDBC
创建jdbc的Maven项目
配置文件application.yml
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
datasource:
driverClassName: com.mysql.jdbc.Driver
url : jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&characterEncoding=utf-8
username : root
password : 000000
Jdbc的maven项目pom.xml
<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>
<parent>
<groupId>springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springboot-jdbc</artifactId>
<!-- jdbc的依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
</project>
在父类Maven spring-parent导入jdbc依赖
<!-- 连接数据库的jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
启动spring-boot
@SpringBootApplication
public class RunApp{
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
Dao层和实现层
public interface UserDao {
void insert(User user);
List selectAll();
}
@Service
public class UserDaoImpl implements UserDao{
@Autowired
JdbcTemplate jdbcTemplate;
//jdbc 新增实现
@Override
public void insert(User user) {
jdbcTemplate.update("insert into t_user(name,age) value(?,?)",user.getName(),user.getAge());
}
//jdbc 查询全部实现
@Override
public List<User> selectAll() {
String sql = "select *from t_user";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return jdbcTemplate.query(sql, rowMapper);
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=RunApp.class)
public class JdbcTest {
//Springboot 测试
@Autowired
UserDao userDao;
//查询全部
@Test
public void testQuery() throws Exception {
List<User> selectAll = userDao.selectAll();
System.out.println(selectAll.size());
}
//新增
@Test
public void testAdd() throws Exception {
try {
User user=new User();
user.setName("yyg");
user.setAge(18);
userDao.insert(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2)持久化SpringDATAJPA
创建jpa的Maven项目
在pom.xml植入连接依赖
<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>
<parent>
<groupId>springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springboot-dataJpa</artifactId>
<!-- springDataJPA的依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
创建仓库类继承JpaRepository(底层封装了crud和分页排序功能)
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Integer>{
}
服务层 调用
@Service
@Transactional
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
//根据id查询
public User get(Integer id){
return userRepository.getOne(id);
}
//查询全部
public List<User> getAll(){
return userRepository.findAll();
}
//新增
public User save(User user){
return userRepository.save(user);
}
//修改
public User update(User user) {
return userRepository.save(user);
}
//删除
public void delete(Integer id){
userRepository.delete(id);
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=RunApp.class)
public class JPATest {
@Autowired
UserServiceImpl userServiceImpl;
//查询全部
@Test
public void testQuery() throws Exception {
List<User> all = userServiceImpl.getAll();
System.out.println(all.size());
}
//删除
@Test
public void testDelete() throws Exception {
userServiceImpl.delete(1);
List<User> all = userServiceImpl.getAll();
System.out.println(all.size());
}
}
启动spring-boot
package com.yyg;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.web.bind.annotation.RestController;
//扫描有@RestController注解的类
@SpringBootApplication //等于(scanBasePackages="com.yyg") same as @Configuration @EnableAutoConfiguration @ComponentScan
public class RunApp{
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
3)持久化Mybatis
创建mybatis的Maven项目
在pom.xml植入mybatis的依赖包
<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>
<parent>
<groupId>springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springboot-mybatis</artifactId>
<dependencies>
<!-- spring-boot mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- spring boot mybatis 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 打印sql -->
<!-- https://mvnrepository.com/artifact/org.kd/mybatis-tool-box -->
<dependency>
<groupId>org.kd</groupId>
<artifactId>mybatis-tool-box</artifactId>
<version>1.0-M9</version>
</dependency>
</dependencies>
</project>
Domain层
public class User {
private Integer id;
private String name;
private Integer age;
//getter/setter略
}
接口映射层
UserMapper.java
//@Mapper
public interface UserMapper {
// 查询所有
//@Select("select * from t_user")
public List<User> getAll();
public void save(User user);
@Select("select *from t_user where name like '%${name}%' ")
public void selectLike(User user);
}
UserMapper.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">
<mapper namespace="com.yyg.mapper.UserMapper">
<select id="getAll" resultType="com.yyg.domain.User">
select *from t_user
</select>
<insert id="save">
insert into t_user(name,age) value(#{name},#{age});
</insert>
</mapper>
服务层IUserService
public interface IUserService {
public List<User> getAll();
public void save(User user);
//分页
public PageInfo<User> pageList(Integer pageRow,Integer pageSize);
}
实现UserServiceImpl
@Service
public class UserServiceImpl implements IUserService{
@Autowired
UserMapper userMapper;
@Override
public List<User> getAll() {
// TODO Auto-generated method stub
return userMapper.getAll();
}
@Override
public void save(User user) {
userMapper.save(user);
}
@Override
public PageInfo<User> pageList(Integer pageRow, Integer pageSize) {
// TODO Auto-generated method stub
PageHelper.startPage(pageRow, pageSize);
List<User> all = userMapper.getAll();
return new PageInfo<>(all);
}
}
Application.yml配置扫描xml
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
datasource:
driverClassName: com.mysql.jdbc.Driver
url : jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&characterEncoding=utf-8
username : root
password : 000000
# Mybatis配置
mybatis:
typeAliasesPackage: com.yyg.domain
mapperLocations: classpath:com/yyg/mapper/mapper_xml/*.xml
#日志
logging:
level:
com:
yyg: DEBUG
测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=RunApp.class)
public class MybatisTest {
@Autowired
IUserService iUserService;
@Autowired
UserMapper userMapper;
//查询全部
@Test
public void testQueryAll() throws Exception {
List<User> all = iUserService.getAll();
System.out.println(all.size());
}
//新增测试
@Test
public void testAdd() throws Exception {
try {
User user=new User();
user.setAge(55);
user.setName("alibb");
iUserService.save(user);
List<User> all = iUserService.getAll();
System.out.println(all.size());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//模糊查询
@Test
public void testSelectLike() throws Exception {
try {
User user=new User();
user.setName("yyg");
userMapper.selectLike(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//分页查询
@Test
public void pageTest() throws Exception {
PageInfo<User> pageList = iUserService.pageList(1, 2);
for (User user : pageList.getList()) {
System.out.println(user.toString());
}
}
}
启动spring-boot
@SpringBootApplication //scanBasePackages=("com.yyg")
//这里和以往不一样的地方就是MapperScan的注解,这个是会扫描该包下的接口
@MapperScan("com.yyg.mapper")
public class RunApp{
public static void main(String[] args) {
SpringApplication.run(RunApp.class, args);
}
}
五、日志信息的配置
Application.yml
logging.level.*= # Log levels severity mapping. For instance `logging.level.org.springframework=DEBUG`
六、事务控制
在父Maven项目的pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
测试
//Spring测试环境
@RunWith(SpringJUnit4ClassRunner.class)
//SpringBoot测试,并指定启动类
@SpringBootTest(classes = App.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testGet() throws Exception {
User user = userService.get(1L);
System.out.println(user.getName());
}
}