【SpringBoot初级篇】JdbcTemplate常用方法

【SpringBoot初级篇】JdbcTemplate常用方法

  • JdbcTemplate 查询
  • JdbcTemplate 插入、更新、删除
    • 插入单条数据
    • 批量插入
    • 更新单条数据
    • 批量更新
    • 删除单条数据
    • 批量操作
  • execute执行任意的SQL
  • NamedParameterJdbcTemplate

函数 场景说明
update(String sql, @Nullable Object… args) 增,删,改
queryForObject(sql, Integer.class) 查询返回某个值
queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1) 查询返回的是某个对象、BeanPropertyRowMapper返回自定义对象
query(sql, new BeanPropertyRowMapper<>(User.class)) 查询返回的是某个集合
queryForMap(sql) 查询返回的是map

业务开发中输出sql日志

logging:
  level:
    org.springframework.jdbc.core.JdbcTemplate: debug

JdbcTemplate 查询

1、查询记录条数

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

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);

3、查询多个字段,返回一个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);

4、查询多条数据,每条数据都以Map形式返回,整个结果是List>

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);

5、查询多条数据,返回实体类集合List,通过BeanPropertyRowMapper自动映射实体属性

String querySQL = "select * from customer where  id = ?";
List<Customer> customers = jdbcTemplate.query(querySQL, new BeanPropertyRowMapper<>(Customer.class), 10001);

new BeanPropertyRowMapper<>(Customer.class) 可以自动映射实体属性,但是实体属性必须驼峰命名。可以使用BeanPropertyRowMapper.newInstance静态方法创建

String querySQL = "select * from customer where  id = ?";
List<Customer> customers = jdbcTemplate.query(querySQL, BeanPropertyRowMapper.newInstance(Customer.class), 10001);

6、查询单条数据,返回实体类对象,通过BeanPropertyRowMapper自动映射实体属性

String querySQL = "select * from customer where  id = ?";
List<Customer> customers = jdbcTemplate.queryForObject(querySQL, new BeanPropertyRowMapper<>(Customer.class), 10001);

7、查询单条数据并通过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;
            }
        });

8、查询对象集合

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;
            }
        });

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

通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的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());

10、插入数据并返回生成的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"));

JdbcTemplate 插入、更新、删除

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

插入单条数据

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);

或者使用预编译对象插入

String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";

 jdbcTemplate.update(sql, new PreparedStatementSetter() {
     @Override
     public void setValues(PreparedStatement ps) throws SQLException {
         ps.setInt(1,1001);
         ps.setString(2,"百里宣策");
         ps.setLong(3,123123123);
         ps.setDate(4, new java.sql.Date(2023));
     }
 });

批量插入

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);

更新单条数据

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

批量更新

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);

删除单条数据

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

批量操作

public void removeByIds(String[] rids, Integer year) {
	String deleteSQL = "delete from nt_budget_income_plan where  ADMDIV_CODE = ? and year = ? and ID = ?";
	// 设置预编译参数
	jdbcTemplate.batchUpdate(deleteSQL, new BatchPreparedStatementSetter() {
		@Override
		public void setValues(PreparedStatement ps, int i) throws SQLException {
			String rid = rids[i];
			ps.setString(1, SessionUtil.getSession().getAdmdivCode());
			ps.setInt(2, year);
			ps.setLong(3, Long.parseLong(rid));
		}
		@Override
		public int getBatchSize() {
			return rids.length;
		}
	});
}

execute执行任意的SQL

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

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

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);

其他方法同JdbcTemplate类似

public void deleteByIds(List<Long> ids) {
    String sql = "delete from nt_current_fund_apply where ID in (:ids)";
    Map<String, Object> params = new HashMap<>(4);
    params.put("ids", ids);
    namedJdbcTemplate.update(sql, params);
};

你可能感兴趣的:(spring,boot,数据库,sql)