因为工作需要,所以学习一下JdbcTemplate的用法。
JdbcTemplate的基本用法可以参考我之前的一篇博客
https://blog.csdn.net/cwr452829537/article/details/84562951
1、准备工作
这里我们先准备一张用户表
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`gender` int(3) NOT NULL,
`phone` varchar(50) NOT NULL,
`note` text,
`status` tinyint(4) NOT NULL,
`created_ts` datetime NOT NULL,
`last_modified_ts` datetime DEFAULT NULL,
`creator` bigint(20) NOT NULL,
`editor` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
INSERT INTO t_user VALUES(1, '张三', 2, '17565485695', '学生', 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
INSERT INTO t_user VALUES(2, '李四', 1, '13654865859', '上班族', 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
INSERT INTO t_user VALUES(3, '王五', 1, '13546652858', '班长', 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
INSERT INTO t_user VALUES(4, '赵六', 2, '15856548565', NULL, 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
INSERT INTO t_user VALUES(5, 'Tom', 1, '19846515616', 'student', 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
INSERT INTO t_user VALUES(6, 'R', 1, '13654585654', 'Super', 1, '2018-12-12 00:00:00.000', NULL, 1001, NULL);
2、数据查询
查询单个基本数据类型(如String,Integer,Long等)和单个对象可以使用jdbcTemplate.queryForObject()方法,查询基本数据类型列表可以使用jdbcTemplate.queryForList()方法,查询对象列表可以使用jdbcTemplate.query()或者jdbcTemplate.queryForList()
* 初始化JdbcTemplate
* @return
public JdbcTemplate init() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/java");
dataSource.setUsername("root");
dataSource.setPassword("root");
return new JdbcTemplate(dataSource);
(一)查询基本数据类型(String,Integer,Long等)
查询单个(如查询指定性别的用户数量)
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType)
参数分别是sql,sql参数数组,返回数据类型(这里我们就返回Integer)
* 查询指定性别用户数量
* @param gender 性别,1:男,2:女
* @return
@Override
public Integer countUsers(Integer gender) {
// 初始化JdbcTemplate
JdbcTemplate jdbcTemplate = init();
StringBuilder sql = new StringBuilder();
sql.append(" SELECT ")
.append(" COUNT(*) ")
.append(" FROM ")
.append(" t_user ")
.append(" WHERE gender = ?");
try {
return jdbcTemplate.queryForObject(sql.toString(), new Object[]{gender}, Integer.class);
} catch (Exception e) {
e.printStackTrace();
return null;
查询列表(如查询指定性别的用户id集合)
public <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType)
参数分别是sql,sql参数数组,返回数据类型(这里我们就返回Integer)
* 查询指定性别的用户id集合
* @param gender 性别
* @return
@Override
public List<Integer> listIds(Integer gender) {
JdbcTemplate jdbcTemplate = init();
StringBuilder sql = new StringBuilder();
sql.append(" SELECT ")
.append(" id ")
.append(" FROM ")
.append(" t_user ")
.append(" WHERE gender = ?");
try {
return jdbcTemplate.queryForList(sql.toString(), new Object[]{gender}, Integer.class);
} catch (Exception e) {
return null;
(二)查询对象
查询单个(如查询指定id的用户信息)
public <T> T queryForObject(String sql, @Nullable Object[] args, RowMapper<T> rowMapper)
参数分别是sql,sql参数数组(可为空),对象映射关系
* 查询单个用户(通过jdbctemplate查询)
* @param id 用户id
* @return
@Override
public UserEntity getOneByJdbc(Long id) {
UserEntity userEntity;
JdbcTemplate jdbcTemplate = init();
StringBuilder sql = new StringBuilder();
sql.append(" SELECT ")
.append(" id,name,gender,phone,note ")
.append(" FROM ")
.append(" t_user ")
.append(" WHERE ")
.append(" id = ? ");
try {
userEntity = jdbcTemplate.queryForObject(sql.toString(), new Object[]{id}, (rs, rowNum) -> {
UserEntity temp = new UserEntity();
temp.setId(rs.getLong("id"));
temp.setName(rs.getString("name"));
temp.setGender(rs.getInt("gender"));
temp.setPhone(rs.getString("phone"));
temp.setNote(rs.getString("note"));
return temp;
} catch (Exception e) {
return null;
return userEntity;
查询列表(查询所有用户列表,含分页)
public <T> List<T> query(String sql, @Nullable Object[] args, RowMapper<T> rowMapper)
参数分别是sql,sql参数数组(可为空),对象映射关系
* 查询用户列表
* @param pageable
* @return
@Override
public Page<UserEntity> listUsersByJdbc(Pageable pageable) {
JdbcTemplate jdbcTemplate = init();
StringBuilder sql = new StringBuilder();
sql.append(" SELECT ")
.append(" id,name,gender,phone,note ")
.append(" FROM ")
.append(" t_user ")
.append(" LIMIT ?,? ");
try {
List<UserEntity> list = jdbcTemplate.query(sql.toString(),
new Object[]{pageable.getPageNumber(), pageable.getPageSize()},
new BeanPropertyRowMapper<>(UserEntity.class)
return new PageImpl<>(list, pageable, list.size());
} catch (Exception e) {
return null;
- jdbcTemplate.queryForObject()方法如果查询结果为空或者不唯一的时候会抛出异常,可以和我一样try...catch起来返回null或者抛出空异常。
1 package helloworld.jdbcTemplate;
3 import org.springframework.jdbc.core.JdbcTemplate;
5 import java.sql.*;
6 import java.util.List;
8 /**
9 * 功能:通过JdbcTemplate实现查询操作
10 *
JDBCTeamplate使用步骤:
1.引入相关的jar包
druid mysql-connector srping-jdbc sprint-tx spring-orm
2.创建数据库连接池properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.user
使用read函数去读取socket生成的file handle是个什么原理呢?今天研究了一下。代码的逻辑就是server段发出当前时间的字符串,client端去接收该字符串。
Server端的部分代码如下
for ( ; ; )
connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [select id,name names,money moneys from account]; SQL state [S0022]; error code [0]; Column ...
List query(String sql,RowMapper rowMapper)
执行String类型参数提供的SQL语句,并通过RowMapper返回一个List类型的结果
List query(String sql,PreparedStatementSetter pss,RowMapper rowMapper)