SpringBoot与Docker
何为Docker
Docker是一个开源的应用容器引擎:
Docker支持将软件编译成一个镜像;然后在镜像中个中软件做好配置,将镜像发布出去,体大使用者可以直接使用这个镜像
运行中的或者镜像成为容器,容器启动时是非常快速的
核心概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(client):链接docker主机进行操作;
docker仓库(Regisrry):用来保存各种打包好的软件镜像
docker镜像(images):软件打包好的镜像,放在docker仓库中
docker容器(Container):镜像启动后的实例称位一个容器
使用docker的步骤
- 安装docker
- 去docker仓库找到这个软件对应的镜像
- 直接使用docker运行这个镜像,这个镜像就会生成一个docker容器
- 对容器的启动停止就是对软件的启动停止
安装docker
linux安装
步骤:
- 检查内核版本必须是3.10以上:uname -r
- 安装docker:yum install docker
- 启动docker:systemctl start docker
- 开机启动docker:systemctl enable docker
- 停止docker:systemctl stop docker
镜像操作
检索
dock search 关键字
拉取
docker pull 镜像名:tag
列表
docker images
删除
docker rmi image-id
容器操作
软件镜像(qq.exe)---运行镜像---产生一个容器(正在运行的软件,运行的QQ);
步骤:
- 搜索镜像:docker search tomcat
- 拉取镜像:docker pull tomcat
- 根据镜像启动容器:docker run --name mytomcat -d tomcat
-d 是后台运行
(docker --name container-name -d image-name) - docker ps 查看运行中的容器
- 停止运行中的容器:docker stop mytomcat
- 查看所有的容器:docker ps -a
- 启动容器:docker start 容器id
- 删除容器:docker rm 容器id
- 端口映射:-p 服务器端口:虚拟容器端口 docker run --name mytomcat -d -p 8080:8080 tomcat
- 查看容器的日志:docker logs 容器id
安装MySQL示例
docker pull mysql
错误的启动
docker run --name mysql01 -d mysql
mySql异常退出了,大概是没有指定root密码
正确的启动
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
这样其实还是不可以,因为没有做端口映射
docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
SpringBoot与数据访问
JDBC
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.1.1:3306/jdbcuse
driver-class-name: com.mysql.jdbc.Driver
效果:
SpringBoot2.x默认是用com.zaxxer.hikari.HikariDataSource作为数据源;
数据源的相关配置DataSourceProperties里面
自动配置原理:org.springframework.boot.autoconfigure.jdbc:
参考DataSourceConfiguration
根据配置创建数据源,默认是用HikariDataSource数据源可以使用spring.datasource.type指定指定自定义的数据源类型;
SpringBoot默认可以支持;
org.apache.tomcat.jdbc.pool.DataSource,HikariDataSource,org.apache.commons.dbcp2.BasicDataSource
自定义数据源
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
DataSourceInitializer
作用:运行建表语句和插入语句
默认使用只需要将sql文件命名为
在SpringBoot2.x版本中需要在配置文件中配置,才会启用DataSourceInitializer
spring.datasource.initialization-mode: always
schema-*.sql data-*.sql
可以使用
scheam:
- classpath:department.sql
指定自定义位置
操作数据库
自动配置了jdbctemplat
使用示例:
@Contorller
public class HelloController {
@Autowired
JdbcTemplate jdbcTemplate;
@RequestMapping("/hello")
@ResponseBody
public Map<String, Object> map() {
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from user");
return maps.get(0);
}
}
使用druid数据源
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
配置使用数据源
type: com.alibaba.druid.pool.DruidDataSource
# 高级配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j2
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
在SpringBoot默认给的自动配置中不支持高级的配置我们需要手动去绑定
高级配置和后台管理配置
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid() {
return new DruidDataSource();
}
// 1. 配置一个管理后台的Servlet 2.配置监听
@Bean
public ServletRegistrationBean<Servlet> statViewServlet() {
ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
Map<String,String> map = new HashMap<>();
map.put("loginUsername", "root");
map.put("loginPassword", "123456");
servletServletRegistrationBean.setInitParameters(map);
return servletServletRegistrationBean;
}
@Bean
public FilterRegistrationBean<Filter> webStatFilter() {
FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
filter.setFilter(new WebStatFilter());
Map<String,String> map = new HashMap<>();
map.put("exclusions", "*.js, *.css, /druid/*");
filter.setInitParameters(map);
filter.setUrlPatterns(Arrays.asList("/*"));
return filter;
}
}
整合Mybatis
依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
这里可以看出来这个jar包写了版本号,而且没有用SprinBoot统一的启动器命名方式,所以这个mybates不是SpringBoot官方做的而是由mybatis做的适配
一并导入mysql的驱动和sprinboot-jdbc用来做数据源
步骤
- 配置数据源相关属性(见上一节Druid)
- 给数据库建表
- 创建JavaBean
注解版
基础使用
因为SpringBoot自动配置了Mybatis的工厂所以我们直接创建mapper层使用就可以了
@Mapper
public interface DepartmentMapper {
@Select("select * from department where id=#{id}")
public Department getDeptById(Integer id);
@Delete("delete from department where id=#{id}")
public int deleteDeptById(Integer id);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into department(department_ame) values(#{department_name})")
public int insertDept(Department department);
@Update("update department set department_name=#{department_name} where id=#{id}")
public int updateDept(Department department);
}
扩展配置
配置驼峰命名的映射
@org.springframework.context.annotation.Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
配置自动扫描所有mapper层
在SpringBoot的启动类上使用@MapperScan指定包名即可
@MapperScan(value = "top.byfree.springboot.mapper")
基于配置
mybatis:
config-location: classpath:mybatis/mybatis-config.xml 全局配置文件
mapper-locations: classpath:mybatis/mapper/*.xml 映射文件扫描
SprinData JPA
JPA:ORM(Object Relational Mapping);
编写一个实体类(bean,pojo..)和和数据表进行映射,并且配置好映射关系
@Entity
@Table(name = "tbl_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增
private Integer id;
@Column(name = "last_name",length = 50)
private String lastName;
@Column // 默认列名就是属性名
private String email;
}
编写DAO接口来操作实体类对应的数据表
// 继承JpaRepository接口菜完成对数据库的操作
public interface UserRepository extends JpaRepository<User, Integer> {
}
基本的配置
spring:
jpa:
hibernate:
# 更新或者创建表结构
ddl-auto: update
# 显示sql
show-sql: true
直接使用
@Controller
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable("id") Integer id){
Optional<User> byId = userRepository.findById(id);
return byId.get();
}
@GetMapping("/user")
@ResponseBody
public User insertUser(User user) {
return userRepository.save(user);
}
}
Q.E.D.