Spring Boot 入门详解教程之基础篇(三)
一、前言
上一篇《Spring Boot 入门之 Web 篇(二)》介绍了 Spring Boot 的 Web 开发相关的内容,项目的开发离不开数据,因此本篇开始介绍持久层相关的知识。
二、整合 JdbcTemplate
2.1 添加依赖
<!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql 驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
2.2 配置数据库连接
在 application.properties 中添加:
spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=tiger
其中,可以不指定 driver-class-name,因为 spring boot 会自动识别 url。
2.3 测试
2.3.1 建表
在 MySQL 中创建名为 springboot 的数据库,在该库中创建 user 表:
CREATE TABLE `user` (`id` INT(11) NOT NULL AUTO_INCREMENT,`username` VARCHAR(50) NOT NULL,`password` VARCHAR(64) NOT NULL,`birthday` DATE NOT NULL,PRIMARY KEY (`id`))COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=3;
2.3.2 建实体类
public class User implements Serializable{private static final long serialVersionUID = -6249397911566315813L;private Integer id;private String username;private String password;private Date birthday;}
setter 和 getter 方法此处省略。
2.3.3 dao 接口
接口和实现类如下:
public interface UserDao {public int insert(User user);public int deleteById(Integer id);public int update(User user);public User getById(Integer id);}@Repositorypublic class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic int insert(User user) {String sql = "insert into user(id,username,password,birthday) values(?,?,?,?)";return this.jdbcTemplate.update(sql,user.getId(),user.getUsername(),user.getPassword(),user.getBirthday());}@Overridepublic int deleteById(Integer id) {String sql = "delete from user where id = ?";return this.jdbcTemplate.update(sql,id);}@Overridepublic int update(User user) {String sql = "update user set password = ? where id = ?";return this.jdbcTemplate.update(sql,user.getPassword(),user.getId());}@Overridepublic User getById(Integer id) {String sql = "select * from user where id = ?";return this.jdbcTemplate.queryForObject(sql, new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setBirthday(rs.getDate("birthday"));return user;}},id);}}
2.3.4 测试类:
@RunWith(SpringRunner.class)@SpringBootTestpublic class UserDaoTest {@Autowiredprivate UserDao userDao;@Testpublic void testInsert() {User user = new User();user.setId(1);user.setUsername("张三");user.setPassword("zhangsan");user.setBirthday(new Date());int result = this.userDao.insert(user);System.out.println(result);}@Testpublic void testGetById() {User user = this.userDao.getById(1);System.out.println(user.getUsername());}@Testpublic void testUpdate() {User user = new User();user.setId(1);user.setPassword("zhangsan123");this.userDao.update(user);}@Testpublic void testDeleteById() {int result = this.userDao.deleteById(1);System.out.println(result);}}
测试结果省略...
如需打印日志,在日志配置文件中添加如下配置:
<logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug"/>
三、整合 Spring-data-jpa
3.1 添加依赖
<!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- springboot,jpa 整合包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- mysql 驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
3.2 配置数据库连接
在 application.properties 中添加:
# 数据库连接配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=tiger# JPA 配置spring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=true
3.3 编码
3.3.1 建表
在 MySQL 中创建名为 springboot 的数据库,在该库中创建 role 表:
CREATE TABLE `role` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(10) NOT NULL,`descr` VARCHAR(100) NULL DEFAULT NULL,PRIMARY KEY (`id`))COLLATE='utf8_general_ci'ENGINE=InnoDB;
注意,主键 ID 为 AUTO_INCREMENT 自增。
3.3.2 建实体类
添加相应的注解
@Entitypublic class Role implements Serializable{private static final long serialVersionUID = 3926276668667517847L;@Id@GeneratedValueprivate Integer id;@Columnprivate String name;@Columnprivate String descr;}
setter 和 getter 方法此处省略。
3.3.3 Repository 接口
public interface RoleRepository extends JpaRepository<Role, Integer>{}
3.3.4 测试类
@RunWith(SpringRunner.class)@SpringBootTestpublic class RoleRepositoryTest {@Autowiredprivate RoleRepository roleRepository;@Testpublic void testInsert() {Role role = new Role();role.setName("管理员");role.setDescr("测试");Role result = this.roleRepository.save(role);System.out.println(result);}@Testpublic void testFindOne() {Role role = this.roleRepository.findOne(1);System.out.println(role);}@Testpublic void testUpdate() {Role role = new Role();role.setId(1);role.setName("管理员");role.setDescr("控制权限");Role result = this.roleRepository.save(role);System.out.println(result);}@Testpublic void testDelete() {this.roleRepository.delete(1);}}
测试结果省略...
四、整合 Mybatis
整合 MyBatis 有两种方式:
1) 使用 mybatis 官方提供的 Spring Boot 整合包实现。
2) 使用 mybatis-spring 整合的方式,也就是传统的方式(推荐,此方式容易控制 MyBatis 的配置)。
4.1 配置依赖
方式一:使用官方整合包
1)添加依赖:
<!-- springboot,mybatis 整合包 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><!-- mysql 驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
2)配置数据库连接:
在 application.properties 中添加:
# 数据源配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=tiger# mybatis 配置mybatis.config-location=classpath:mybatis/mybatis-config.xmlmybatis.mapper-locations=classpath:mybatis/mapper/*.xml
方式二:原始 Jar 包 + 手动编程
1)添加依赖:
<!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.4</version></dependency><!-- spring,mybatis整合包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!-- mysql 驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
2)配置数据库连接:
在 application.properties 中添加:
# 数据源配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=tiger
3)创建配置类:
@Configurationpublic class MyBatisConfiguration {@Bean@ConditionalOnMissingBean // 当容器里没有指定的 Bean 的情况下创建该对象public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();// 设置数据源sqlSessionFactoryBean.setDataSource(dataSource);// 设置mybatis的主配置文件sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));// 设置mapper映射文件PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] mapperXml;try {mapperXml = resolver.getResources("classpath:mybatis/mapper/*.xml");sqlSessionFactoryBean.setMapperLocations(mapperXml);} catch (IOException e) {e.printStackTrace();}// 设置别名包sqlSessionFactoryBean.setTypeAliasesPackage("com.light.springboot.domain");return sqlSessionFactoryBean;}@Bean@ConditionalOnBean(SqlSessionFactoryBean.class) // 当 SqlSessionFactoryBean 实例存在时创建对象public MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.light.springboot.mapper");return mapperScannerConfigurer;}}
以上便是两种方式的配置的不同之处,不同之处就在于如何配置 mybatis 配置文件和 mapper 映射文件的路径。
在 src/main/resources 下创建 mybatis 文件夹,并在 mybatis 文件夹中创建 "mybatis-config.xml" 配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><!-- 获取数据库自增主键值 --><setting name="useGeneratedKeys" value="true"/><!-- 使用列别名替换列名,默认为 true --><setting name="useColumnLabel" value="true"/><!-- 开启驼峰命名转换:Table(create_time) => Entity(createTime) --><setting name="mapUnderscoreToCamelCase" value="true"/></settings></configuration>
mybatis 文件夹下再创建一个 "mapper" 文件夹,里边存放 Mpper 接口对应的 mapper 映射文件。
4.2 测试
4.2.1 建表
在 MySQL 中创建名为 springboot 的数据库,在该库中创建 role 表:
CREATE TABLE `department` (`id` INT(11) NOT NULL,`name` VARCHAR(10) NOT NULL,`descr` VARCHAR(50) NULL DEFAULT NULL,PRIMARY KEY (`id`))ENGINE=InnoDB;
4.2.2 实体类
public class Department implements Serializable{private static final long serialVersionUID = 6067283535977178571L;private Integer id;private String name;private String descr;}
setet 和 getter 方法省略。
4.2.3 Mapper 接口
@Mapperpublic interface DepartmentMapper {public void insert(Department department);public Department getById(Integer id);public void update(Department department);public void deleteById(Integer id);}
mybatis/mapper/departmentMapper.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.light.springboot.dao.DepartmentMapper"><insert id="insert" parameterType="com.light.springboot.domain.Department">insert into department(id,name,descr) values(#{id},#{name},#{descr})</insert><select id="getById" parameterType="java.lang.Integer" resultType="com.light.springboot.domain.Department">select id,name,descr from department where id = #{id}</select><update id="update" parameterType="com.light.springboot.domain.Department">update department set descr = #{descr} where id = #{id}</update><delete id="deleteById" parameterType="java.lang.Integer">delete from department where id = #{id}</delete></mapper>
4.2.4 测试类
@RunWith(SpringRunner.class)@SpringBootTestpublic class DepartmentTest {@Autowiredprivate DepartmentMapper departmentMapper;@Testpublic void testInsert() {Department department = new Department();department.setId(1);department.setName("研发部");department.setDescr("开发产品");this.departmentMapper.insert(department);}@Testpublic void testGetById() {Department department = this.departmentMapper.getById(1);System.out.println(department);}@Testpublic void testUpdate() {Department department = new Department();department.setId(1);department.setDescr("开发高级产品");this.departmentMapper.update(department);}@Testpublic void testDeleteById() {this.departmentMapper.deleteById(1);}}
测试结果省略...
五、配置 Druid 数据源
同样地,有两种方式配置:
1)Spring boot,Druid 整合包
2)原始 jar 包 + 手动编程
5.1 Spring boot,Druid 整合包方式
5.1.1 添加依赖
<!-- springboot,druid 整合包 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.8</version></dependency>
5.1.2 添加配置
在 application.properties 中添加:
spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=tiger# 修改数据源spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.druid.initial-size=5spring.datasource.druid.min-idle=5spring.datasource.druid.max-active=20spring.datasource.druid.max-wait=60000spring.datasource.druid.time-between-eviction-runs-millis=60000spring.datasource.druid.min-evictable-idle-time-millis=300000spring.datasource.druid.validation-query=SELECT 1 FROM DUALspring.datasource.druid.test-while-idle=truespring.datasource.druid.test-on-borrow=falsespring.datasource.druid.test-on-return=falsespring.datasource.druid.pool-prepared-statements=truespring.datasource.druid.max-pool-prepared-statement-per-connection-size=20spring.datasource.druid.filters=stat,wall,log4j
5.2 原始 jar 包 + 手动编程方式
5.2.1 添加依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.8</version></dependency>
5.2.2 添加配置
spring.datasource.druid.driverClassName=com.mysql.jdbc.Driverspring.datasource.druid.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.druid.username=rootspring.datasource.druid.password=tigerspring.datasource.druid.initialSize=5spring.datasource.druid.minIdle=5spring.datasource.druid.maxActive=20spring.datasource.druid.maxWait=60000spring.datasource.druid.timeBetweenEvictionRunsMillis=60000spring.datasource.druid.min-evictableIdleTimeMillis=300000spring.datasource.druid.validationQuery=SELECT 1 FROM DUALspring.datasource.druid.testWhileIdle=truespring.datasource.druid.testOnBorrow=falsespring.datasource.druid.testOnReturn=falsespring.datasource.druid.poolPreparedStatements=truespring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20spring.datasource.druid.filters=stat,wall
注意:配置中都是以 spring.datasource.druid 开头,使用驼峰命名
5.2.3 手动编程
@Configurationpublic class DruidConfiguration {@ConfigurationProperties(prefix = "spring.datasource.druid")@Bean(initMethod = "init",destroyMethod = "close")public DruidDataSource dataSource() {DruidDataSource ds = new DruidDataSource();ds.setProxyFilters(Arrays.asList(statFilter()));return ds;}@Beanpublic Filter statFilter() {StatFilter filter = new StatFilter();filter.setSlowSqlMillis(5000);filter.setLogSlowSql(true);filter.setMergeSql(true);return filter;}}
通过上文 MyBatis 的测试代码,运行结果如下:
项目已经使用了 Druid 数据源了。
六、配置 Druid 监控
默认情况下,Druid 的监控统计功能和页面是开启的。
我们启动项目,访问 http://localhost:8080/druid/index.html,如下图:
为了保证访问的安全性,我们可以如下配置:
在 application.properties 中添加:
## druid 监控spring.datasource.druid.web-stat-filter.enabled=truespring.datasource.druid.web-stat-filter.url-pattern=/*spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*## druid 监控页面spring.datasource.druid.stat-view-servlet.enabled=truespring.datasource.druid.stat-view-servlet.url-pattern=/druid/*spring.datasource.druid.stat-view-servlet.login-username=druidspring.datasource.druid.stat-view-servlet.login-password=druid123
重启项目,再次访问 http://localhost:8080/druid/index.html 地址时需要身份验证:









评论