因为工作需要,所以学习一下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;
  1. 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)