JdbcTemplate简介
它是Spring框架自带的对JDBC操作的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中,目的是提供统一的模板方法使对数据库的操作更加方便、友好。SpringBoot2.x中在原来spring-jdbc基础上进行了又一次封装,位于spring-boot-starter-jdbc,该模板的权限定命名是:org.springframework.jdbc.core。
使用的环境说明:
- JDK1.8+
- MySQL 8.0.12
- springboot2.1.1
- 默认HikariCP连接池
整合步骤
1. pom.xml添加依赖:
<!--使用JdbcTemplate访问数据库,springboot2.0以后默认是使用Hikari连接池-->
<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. application.yml文件中配置MySQL数据源
# 修改默认端口号和应用程序访问的上下文
server:
port: 8092
servlet:
context-path: /test
# 配置MySQL数据源
spring:
datasource:
# 注意:MySQL连接驱动和版本都是8.0以上需要添加时区:serverTimezone=GMT%2B8
url: jdbc:mysql://localhost:3306/weather_forecast?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123123
# 可省略
driver-class-name: com.mysql.jdbc.Driver
3.测试
- Controller层简单测试下
@RestController
@RequestMapping("/jdbcTemplate")
public class JdbcTestController {
private Logger logger = LoggerFactory.getLogger(JdbcTestController.class);
@Autowired
private JdbcTemplate jdbcTemplate;
@RequestMapping("/simpleQuary")
@ResponseBody
public List<TWeatherCondition> simpleQuary() {
logger.info("使用JdbcTemplate查询数据库");
String sql = "SELECT * FROM t_weather_condition ";
List<TWeatherCondition> queryAllList = jdbcTemplate.query(sql, new Object[]{},
new BeanPropertyRowMapper<>(TWeatherCondition.class));
logger.info("查询天气状况" + queryAllList);
return queryAllList;
}
}
- 启动mysql服务、启动SpringBoot的main函数
- 通过浏览器测试下
控制台输出的日志:
总结一下
- 可以通过JdbcTemplate使用统一的模板方法对数据库进行CRUD操作,比单纯的使用jdbc看起来更简洁和方便。
- 需要注意连接池的使用:Spring-Boot-2.0.0-M1版本以后将默认的数据库连接池从tomcat-jdbc改为了hikaricp,如果要使用SpringBoot默认支持的其他连接池(如tomcat-jdbc、commons-dbcp、commons-dbcp2)或第三方连接池(如c3p0、druid等)或自定义的连接池需要在依赖中排除掉默认的连接池。
- 在yml中配置mysql连接时,一开始老是报错说时区问题,后来发现是mysql用了最新的版本,即8.0以上版本需要在url后面添加serverTimezone=GMT%2B8参数,不然会报这个错误:java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized…