【SpringBoot笔记16】使用JdbcTemplate和NamedParameterJdbcTemplate操作数据库

参考:官方教程

1 JdbcTemplate基本用法

1.1 查询

1.1.1 查询记录条数

String sql = "select count(*) from tb_user";
int count = jdbcTemplate.queryForObject(sql, Integer.class);

1.1.2 按条件查询记录条数,通过?参数绑定

String sql = "select count(*) from tb_user where username = ?";
int count = jdbcTemplate.queryForObject(sql, Integer.class, "Tom");
   
或者
   
String sql = "select count(*) from tb_user where username = ?";
Object[] params = new Object[]{"Tom"};
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);

1.1.3 同理,查询一个String字段的值

String sql = "select username from tb_user where user_id = ?";
Object[] params = new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"};
String username = jdbcTemplate.queryForObject(sql, params, String.class);

1.1.4 查询多个字段,返回一个Map

String sql = "select user_id, username, age from tb_user where user_id = ?";
Object[] params = new Object[]{"46a8247fbffc46c3a591961351fa3277"};
Map<String, Object> resultMap = jdbcTemplate.queryForMap(sql, params);

1.1.5 查询多条数据,每条数据都以Map形式返回,整个结果是List<Map<String, Object>>

String sql = "select user_id, username, age from tb_user where age = ?";
Object[] params = new Object[]{25};
List<Map<String, Object>> resultMapList = jdbcTemplate.queryForList(sql, params);

1.1.6 查询单条数据并通过RowMapper映射成实体对象

String sql = "select user_id, username, mobile, create_time from tb_user where user_id = ?";
Object[] params = new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"};
User user = jdbcTemplate.queryForObject(sql, params,
        new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                // 在这里做字段到实体的映射
                User u = new User();
                u.setUserId(rs.getString("user_id"));
                u.setUsername(rs.getString("username"));
                u.setMobile(rs.getString("mobile"));
                u.setCreateTime(rs.getTimestamp("create_time"));
                return u;
            }
        });

1.1.7 查询对象集合

String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
Object[] params = new Object[]{"相同的用户名"};
List<User> users = jdbcTemplate.query(sql, params,
        new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User u = new User();
                u.setUserId(rs.getString("user_id"));
                u.setUsername(rs.getString("username"));
                u.setMobile(rs.getString("mobile"));
                u.setCreateTime(rs.getTimestamp("create_time"));
                return u;
            }
        });

1.1.8 将字段到实体映射抽出来单独维护

通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的User映射可以单独抽出来成为一个UserRowMapper类:

public class UserRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User u = new User();
        u.setUserId(rs.getString("user_id"));
        u.setUsername(rs.getString("username"));
        u.setMobile(rs.getString("mobile"));
        u.setCreateTime(rs.getTimestamp("create_time"));
        return u;
    }
}

然后在使用的时候创建就行了:

String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
List<User> users = jdbcTemplate.query(sql, new Object[]{"相同的用户名"}, new UserRowMapper());

1.1.9 插入数据并返回生成的uuid主键

String sql = "insert into tb_user (username, mobile, create_time, age) values(?, ?, ?, ?)";
   
// KeyHolder保存返回的数据,可以指定返回的列
KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(new PreparedStatementCreator() {
    @Override
    public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
        // 指定返回的属性列名为user_id
        PreparedStatement ps = con.prepareStatement(sql, new String[]{"user_id"});
        // 插入的数据
        ps.setString(1, "新用户");
        ps.setString(2,"12345678");
        ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
        ps.setInt(4, 28);
        return ps;
    }
}, keyHolder);

// 输出生成的uuid
System.out.println(keyHolder.getKeys().get("user_id"));

1.2 插入、更新、删除

JdbcTemplate中,数据的插入、更新、删除操作都是通过update(...)来完成的。

1.2.1 插入单条数据

String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
Object[] params = new Object[]{uuid(), "新用户", "134578546", new Date()};
int successCount = jdbcTemplate.update(sql, params);

1.2.2 批量插入

String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{uuid(), "新用户1", "134578546", new Date()});
params.add(new Object[]{uuid(), "新用户2", "134578546", new Date()});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);

1.2.3 更新单条数据

String sql = "update tb_user set username = ? where user_id = ?";
Object[] params = new Object[]{"更新用户名", "a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);

1.2.4 批量更新

String sql = "update tb_user set username = ? where user_id = ?";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{"更新用户名1", "0ff5771760c1483abaefa7a3e530ea6d"});
params.add(new Object[]{"更新用户名2", "4e88b38660324334be61f0c9b2edd7f6"});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);

1.2.5 删除单条数据

String sql = "delete from tb_user where user_id = ?";
Object[] params = new Object[]{"a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);

1.2.6 批量删除

String sql = "delete from tb_user where user_id = ?";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"});
params.add(new Object[]{"4e88b38660324334be61f0c9b2edd7f6"});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);

1.3 通过execute(..)执行任意的SQL

可以通过execute(..)执行任何SQL,一般用来执行DDL语句。

例如,创建表:

String sql = "create table new_table (id varchar(32), name varchar(100))";
jdbcTemplate.execute(sql);

2 使用NamedParameterJdbcTemplate

在使用JdbcTemplate的时候,如果要使用参数,那么需要通过在SQL中使用?做占位符。

NamedParameterJdbcTemplate提供了一个更加直观的方式来定义SQL中的占位符,即通过:变量名的形式。

可以通过Map或者BeanPropertySqlParameterSource传递参数值:

  • Map直接设置参数值;

例如:

String sql = "select count(*) from tb_user where username = :username and age = :age";
Map<String, Object> params = new HashMap<>(2);
params.put("username", "Michael");
params.put("age", 25);
Integer count = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);
  • BeanPropertySqlParameterSource可以将实体对象转换成参数值,注意参数变量名要和实体对象中的属性名对应。

例如:

String sql = "select count(*) from tb_user where username = :username and age = :age";
User query = new User();
query.setUsername("Michael");
query.setAge(25);
SqlParameterSource param = new BeanPropertySqlParameterSource(query);
Integer count = namedParameterJdbcTemplate.queryForObject(sql, param, Integer.class);

2.1 查询

2.1.1 查询记录条数

String sql = "select count(*) from tb_user";
int count = namedParameterJdbcTemplate.queryForObject(sql, new HashMap<>(0), Integer.class);

2.1.2 按条件查询记录条数,通过:参数名参数绑定

String sql = "select count(*) from tb_user where username = :username and age = :age";
Map<String, Object> params = new HashMap<>();
params.put("username", "Michael");
params.put("age", 25);
int count = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);

2.1.3 同理,查询一个String字段的值

String sql = "select username from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
String username = namedParameterJdbcTemplate.queryForObject(sql, params, String.class);

2.1.4 查询多个字段,返回一个Map

String sql = "select user_id, username, age from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
Map<String, Object> resultMap = namedParameterJdbcTemplate.queryForMap(sql, params);

2.1.5 查询多条数据,每条数据都以Map形式返回,整个结果是List<Map<String, Object>>

String sql = "select user_id, username, age from tb_user where age = :age";
Map<String, Object> params = Collections.singletonMap("age", 25);
List<Map<String, Object>> resultMapList = namedParameterJdbcTemplate.queryForList(sql, params);

2.1.6 查询单条数据并通过RowMapper映射成实体对象

String sql = "select user_id, username, age, mobile, create_time from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
User user = namedParameterJdbcTemplate.queryForObject(sql, params, new UserRowMapper());

2.1.7 查询对象集合

String sql = "select user_id, username, age, mobile, create_time from tb_user where username = :userName";
Map<String, Object> params = Collections.singletonMap("userName", "相同的用户名");
List<User> users = namedParameterJdbcTemplate.query(sql, params, new UserRowMapper());

2.1.8 插入数据并返回生成的uuid主键

String sql = "insert into tb_user (username, mobile, create_time, age) "
        + "values(:username, :mobile, :createTime, :age)";
// 添加的数据
User user = User.builder()
        .username("新用户")
        .mobile("12345678")
        .createTime(new Date())
        .age(25)
        .build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
// KeyHolder保存返回的信息
KeyHolder keyHolder = new GeneratedKeyHolder();
// 可以指定一个或多个返回的列名称
namedParameterJdbcTemplate.update(sql, params, keyHolder, new String[]{"user_id"});
// 输出生成的uuid主键
System.out.println(keyHolder.getKeys().get("user_id"));

2.2 插入、更新、删除

JdbcTemplate中,数据的插入、更新、删除操作都是通过update(...)来完成的。

2.2.1 插入单条数据

String sql = "insert into tb_user(user_id, username, mobile, age, create_time) values (:userId, :username, :mobile, :age, :createTime)";
User query = User.builder()
        .userId(uuid())
        .username("新用户A")
        .mobile("1234567")
        .age(28)
        .createTime(new Date())
        .build();
SqlParameterSource params = new BeanPropertySqlParameterSource(query);
int successCount = namedParameterJdbcTemplate.update(sql, params);

2.2.2 批量插入

String sql = "insert into tb_user(user_id, username, mobile, age, create_time) values (:userId, :username, :mobile, :age, :createTime)";
        
List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId(uuid())
        .username("新用户A")
        .mobile("1234567")
        .age(28)
        .createTime(new Date())
        .build();
User user2 = builder.userId(uuid())
        .username("新用户B")
        .build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));

int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));

2.2.3 更新单条数据

String sql = "update tb_user set username = :username where user_id = :userId";
User user = User.builder()
        .userId("46a8247fbffc46c3a591961351fa3277")
        .username("更新用户名")
        .build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
int successCount = namedParameterJdbcTemplate.update(sql, params);

2.2.4 批量更新

String sql = "update tb_user set username = :username where user_id = :userId";

List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId("9a4359932b4f48f391962b17ee9b9a75")
        .username("更新用户A")
        .build();
User user2 = builder.userId("0cd3d79c619c455e932e7723c0e8f355")
        .username("更新用户B")
        .build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));

int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));

2.2.5 删除单条数据

String sql = "delete from tb_user where user_id = :userId";
User user = User.builder()
        .userId("ad6aaa9e4f654ab683d455fa31437b88")
        .build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
int successCount = namedParameterJdbcTemplate.update(sql, params);

2.2.6 批量删除

String sql = "delete from tb_user where user_id = :userId";

List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId("3e2c95c1538b4456bf4038c37ded5001").build();
User user2 = builder.userId("46a8247fbffc46c3a591961351fa3277").build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));

int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));
发布了178 篇原创文章 · 获赞 152 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/hbtj_1216/article/details/100532763