使用JdbcTemplate查询数据库(单个对象,列表等)

因为工作需要,所以学习一下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 queryForObject(String sql, Object[] args, Class 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 List queryForList(String sql, Object[] args, Class elementType)

  参数分别是sql,sql参数数组,返回数据类型(这里我们就返回Integer)    

   /**
     * 查询指定性别的用户id集合
     * @param gender 性别
     * @return
     */
    @Override
    public List 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 queryForObject(String sql, @Nullable Object[] args, RowMapper 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 List query(String sql, @Nullable Object[] args, RowMapper rowMapper)

  参数分别是sql,sql参数数组(可为空),对象映射关系

 /**
     * 查询用户列表
     *
     * @param pageable
     * @return
     */
    @Override
    public Page 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 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或者抛出空异常。

 

 

 

 

你可能感兴趣的:(数据库)