本文记录在 SpringBoot 中使用 JdbcTemplate 访问数据库.
一 JDBC 回顾
最早是在上学时接触的使用 JDBC 访问数据库, 主要有以下几个步骤:
1 加载驱动 Class.forName(Driver)
2 获取数据库连接 conn = DriverManager.getConnection(url, user,password)
3 创建一个 statement 对象来访问操作数据库 statement = conn.createStatement();
4 执行 SQL, 访问操作数据库 rs = statement.execute(sql)
5 得到结果集, 业务处理
6 关闭连接, 释放资源 statement.close(); conn.close();
使用 jdbc 访问并操作数据库时比较麻烦, 后来也做了一定的封装, 主要是对 statement 的创建前和 sql 执行后进行的封装.
二 JdbcTemplate 使用示例
目前我们使用的主流的开源的数据库访问框架主要有 Hibernate,Mybatis,SpringJdbc.SpringJdbc 时 spring 对 JDBC 封装后的一个 ORM 框架, JdbcTemplate 就是 SpringJdbc 对外提供的一个访问数据库的接口类, 我们通过它可以很容易的实现数据库的访问操作. 但是需要我们自己根据业务手写相关的 SQl, 然后执行.
在 spring boot 项目中引入依赖, 本文练习中使用的时 MySQL 数据库
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- </dependency>
在 application.properties 中配置数据库连接相关信息
- # 数据库配置
- # 连接
- spring.datasource.url=jdbc:MySQL://localhost:3306/test
- # 账号
- spring.datasource.username=root
- # 密码
- spring.datasource.password=123456
- # 驱动
- spring.datasource.driver-class-name=com.MySQL.jdbc.Driver
完成以上配后, 在启动 springboot 项目时, 会自动把数据源信息注入到 JdbcTemplate 中, 我们只需要在使用的地方注入 JdbcTemplate 就可以了
定义要操作数据库的相关方法接口
- public interface UserDao {
- /**
- * 添加用户
- */
- int insert(UserInfo user);
- /**
- * 根据 ID 删除用户
- */
- int delete(Long id);
- /**
- * 修改用户
- */
- int update(UserInfo user);
- /**
- * 根据 ID 查询用户
- */
- UserInfo queryById(Long id);
- /**
- * 查询所有用户
- * @return
- */
- List<UserInfo> queryAll();
- /**
- * 分页查询用户
- * @param start 开始位置
- * @param size 要查询的数据条数
- * @return
- */
- List<UserInfo> pagedQuery(int start, int size);
- }
接口的实现
- @Service
- public class UserDaoImpl implements UserDao {
- @Autowired
- private JdbcTemplate jdbcTemplate;
- @Override
- public int insert(UserInfo user) {
- String insertSql = "insert into t_user(name, age) values(?, ?)";
- return jdbcTemplate.update(insertSql, user.getName(), user.getAge());
- }
- @Override
- public int delete(Long id) {
- String deleteSql = "delete from t_user where id = ?";
- return jdbcTemplate.update(deleteSql, id);
- }
- @Override
- public int update(UserInfo user) {
- String updateSql = "update t_user set name = ?, age = ? where id = ?";
- return jdbcTemplate.update(updateSql, user.getName(), user.getAge(), user.getId());
- }
- @Override
- public UserInfo queryById(Long id) {
- String sql = "select * from t_user where id = ?";
- return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
- }
- @Override
- public List<UserInfo> queryAll() {
- String sql = "select * from t_user";
- return jdbcTemplate.query(sql, new BeanPropertyRowMapper(UserInfo.class));
- }
- @Override
- public List<UserInfo> pagedQuery(int start, int size) {
- String sql = "select * from t_user limit ?, ?";
- return jdbcTemplate.query(sql, new Object[]{start, size}, new BeanPropertyRowMapper(UserInfo.class));
- }
- }
可以看到, 使用 JdbcTemplate 时我们完全省去了使用 JDBC 时的创建连接, 释放资源等操作. 不同数据库的分页查询不一样, MySQL 中用的 limit 关键字, 第一个参数代表获取数据的起点, 第二个是要查询的数量, 如: limit 5,5 我们查询出来的是第 6 行到 10 行 共 5 条数据
三 测试, 使用 Junit Test
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class SpringbootJdbctemplateApplicationTests {
- @Autowired
- private UserDaoImpl userDaoImpl;
- @Test
- public void testInsert(){
- UserInfo user = new UserInfo("kg", 21);
- userDaoImpl.insert(user);
- }
- @Test
- public void testDelete(){
- long id = 2;
- userDaoImpl.delete(id);
- }
- @Test
- public void testUpdate(){
- long id = 1;
- UserInfo user = new UserInfo();
- user.setId(id);
- user.setName("kobe");
- user.setAge(3);
- userDaoImpl.update(user);
- }
- @Test
- public void testQueryById(){
- long id = 1;
- UserInfo user = userDaoImpl.queryById(id);
- }
- @Test
- public void testQueryAll(){
- List<UserInfo> list = userDaoImpl.queryAll();
- }
- @Test
- public void testPagedQuery(){
- List<UserInfo> list = userDaoImpl.pagedQuery(1, 2);
- }
- }
在启动项目时, 可以看到在控制台上输出的日志信息中有以下内容
四 连接池配置
在我们没有配置数据库连接池时, springboot 默认给我们提供的 Hikari 连接池. 如果我们像使用其他的, 我们可以自己配置, 比如我们想使用阿里的 Druid 连接池, 我们需要引入依赖
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.1.10</version>
- </dependency>
为了测试方便, 我这里直接用 @Value 注解来获取配置信息
- @SpringBootConfiguration
- public class DataSourceConfig {
- @Value("${spring.datasource.driver-class-name}")
- private String DRIVER;
- @Value("${spring.datasource.url}")
- private String URL;
- @Value("${spring.datasource.username}")
- private String USER;
- @Value("${spring.datasource.password}")
- private String PASSWORD;
- @Bean
- public JdbcTemplate jdbcTemplate(){
- JdbcTemplate jdbcTemplate = new JdbcTemplate();
- jdbcTemplate.setDataSource(dataSource());
- return jdbcTemplate;
- }
- @Bean
- public DataSource dataSource(){
- System.out.println("初始化数据源 start...");
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setDriverClassName(DRIVER);
- dataSource.setUrl(URL);
- dataSource.setUsername(USER);
- dataSource.setPassword(PASSWORD);
- // 连接池的其他的属性...
- dataSource.setMaxActive(5);
- //...
- System.out.println("初始化数据源 end...");
- return dataSource;
- }
- }
@SpringBootConfiguration 这个注解说明当前类是一个配置类, 需要被特殊处理, 在扫描时发现有 @Bean 注解, 会把当前方法返回的类 Bean 注入的容器中, 方法名会别标记为注入的 Bean 的别名, 如上 JdbcTemplate 使用的 DataSource 就从默认的 Hikari 修改为 Druid 了, 启动项目可以看到控制台日志信息
来源: https://www.cnblogs.com/love-wzy/p/10320484.html