Spring Boot 中使用 JdbcTemplate
1.什么是 JDBC Template
JDBC Template 的全限定名为 org.springframework.jdbc.core.JdbcTemplate 。它是Spring 框架中 对数据库访问技术JDBC 对封装的对象。
要使用它需要在pom.xml 中引入
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
JdbcTemplate 提供的数据库操作方法主要分五类:
execute 方法,它可以执行任何的SQL语句;
update 与bathUpdate 方法,update它是用于新删改单条信息的,bathUpdate则是对于多条信息使用;
query 与 queryFor** 方法,主要用于查询;
call 方法,用于执行存储过程或一些函数。
2.配置数据源
在这里使用HikariCP 这个数据库连接池 ,要使用它需要在pom.xml 中引入
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
本次使用的数据库为MySQL ,需要引入它的驱动类
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在src/main/resources 路径下创建一个名叫 appliction.properties 的文件,里面写上数据库的一些配置信息
datasource.url=jdbc:mysql://127.0.0.1:3306/hlm_test?useUnicode=true&characterEncoding=UTF-8
datasource.username=root
datasource.password=admin
datasource.driver-class=com.mysql.jdbc.Driver
至此一些准备工作就做好了,接下来先要创建一个数据源。我们利用 Java Config 来创建。
package com.hlm.core.datasource;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
public class DataSourceConfig {
@Bean(name="dataSource")
public DataSource datasource(Environment env){
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(env.getProperty("datasource.url"));
ds.setUsername(env.getProperty("datasource.username"));
ds.setPassword(env.getProperty("datasource.password"));
ds.setDriverClassName(env.getProperty("datasource.driver-class"));
return ds ;
}
}
在写Config类的时候一个不注意在启动时就会报:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-06-18 14:21:11.128 ERROR 15984 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto-configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
这是由于datasource 方法上漏写了Bean 注解。
3.查询例子
下面简单演示一个查询的例子:
本例的调用顺序是:Controller——>Service——>Dao。数据库的相关操作都在Dao ,因为例子并无其他复杂逻辑,所以Service 只是单纯调一个Dao 而已。
先看Dao 中的数据库相关操作的代码
Dao接口
package com.hlm.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import com.hlm.bo.User;
public interface UserDao {
/**
* 查询用户总数
* @return
*/
public int countUser();
/**
* 查询所有用户
* @return
*/
public List<User> findAllUser();
}
实现类
package com.hlm.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import com.hlm.bo.User;
import com.hlm.core.dao.BaseDao;
import com.hlm.dao.UserDao;
import com.hlm.mapper.UserMapper;
@Component
public class UserDaoImpl extends BaseDao implements UserDao{
@Override
public int countUser() {
int count = jdbcTemplate.queryForObject("select count(*) from hlm_users", Integer.class);
return count;
}
@Override
public List<User> findAllUser() {
String sql = "select * from hlm_users ";
List<User> users = jdbcTemplate.query(sql, new UserMapper());
return users;
}
}
Mapper(一个将数据库查询得到的对象转为自己的对象的方法类)
package com.hlm.mapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.hlm.bo.User;
public class UserMapper implements RowMapper<User>{
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User bo = new User();
bo.setId(rs.getInt("id"));
bo.setCreateTime(rs.getDate("create_time"));
bo.setPassword(rs.getString("password"));
bo.setSex(rs.getInt("sex"));
bo.setToken(rs.getString("token"));
bo.setTokenType(rs.getInt("token_type"));
bo.setUserCode(rs.getString("user_code"));
bo.setUserName(rs.getString("user_name"));
return bo;
}
}
数据表结构
CREATE TABLE `hlm_users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_code` varchar(40) NOT NULL COMMENT '用户唯一识别码',
`user_name` varchar(50) NOT NULL COMMENT '用户姓名',
`sex` int(3) DEFAULT NULL COMMENT '性别',
`token` varchar(40) NOT NULL COMMENT '注册令牌,手机或邮箱',
`create_time` date DEFAULT NULL COMMENT '注册时间',
`token_type` int(3) NOT NULL COMMENT '令牌类型。0为手机,1为邮箱',
`password` varchar(30) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`,`user_code`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
Controller 代码
package com.hlm.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.hlm.bo.User;
import com.hlm.service.UserService;
@Controller
@RequestMapping("/user")
public class HlmUserController {
@Autowired
private UserService userService;
@RequestMapping("/count")
public ModelAndView userCount(HttpServletRequest req ,HttpServletResponse resp){
ModelAndView mv = new ModelAndView();
int count = userService.countUser();
List< User> list = userService.findAllUser();
mv.addObject("count", count);
mv.addObject("list", list);
mv.setViewName("/usercount");
return mv;
}
}
页面代码,userCount.ftl
<html>
<body>
<p> 用户总人数为:</p>
<p> ${count }</p>
<p>用户分别是:</p>
<#if list?exists>
<#list list as user>
<p>用户名: ${user.userName }</p>
<p>密码: ${user.password }</p>
</#list>
</#if>
</body>
</html>
运行结果: