最近新接觸一個(gè)小的項(xiàng)目中用到了Spring JdbcTemplate框架,用起來感覺和DBUTILS差不多谋旦,仿制可能以后需要用到,因此記錄一下甲捏。
概念
JdbcTemplate 類執(zhí)行 SQL 查詢芒粹、更新語句和存儲(chǔ)過程調(diào)用,執(zhí)行迭代結(jié)果集和提取返回參數(shù)值。它也捕獲 JDBC 異常并轉(zhuǎn)換它們到 org.springframework.dao 包中定義的通用類疙教、更多的信息葵诈、異常層次結(jié)構(gòu)理疙。
JdbcTemplate 類的實(shí)例是線程安全配置的贰锁。所以你可以配置 JdbcTemplate 的單個(gè)實(shí)例授嘀,然后將這個(gè)共享的引用安全地注入到多個(gè) DAOs 中芯肤。
使用 JdbcTemplate 類時(shí)常見的做法是在你的 Spring 配置文件中配置數(shù)據(jù)源盔几,然后共享數(shù)據(jù)源 bean 依賴注入到 DAO 類中,并在數(shù)據(jù)源的設(shè)值函數(shù)中創(chuàng)建了 JdbcTemplate芍阎。
執(zhí)行SQL 語句
在表中插入一行:
String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, name, age);
//jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );
從表中刪除一行:
String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );
更新表中的一行:
String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );
查詢一個(gè)整數(shù)類型:
String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );
查詢一個(gè) long 類型:
String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );
一個(gè)使用綁定變量的簡單查詢:
String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});
查詢字符串:
String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);
查詢并返回一個(gè)對(duì)象:
String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(SQL,
new Object[]{10}, new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setID(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
}
查詢并返回多個(gè)對(duì)象:
String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(SQL,
new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setID(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
}
插入數(shù)據(jù),獲取自增組件的ID:
public int addStudent(final Student student){
final String sql="insert into t_student(name,sex) values(?,?)";
//創(chuàng)建一個(gè)主鍵持有者
KeyHolder keyHolder=new GeneratedKeyHolder();
jdbcTemplateObject.update(new PreparedStatementCreator(){
public PreparedStatement createPreparedStatement(Conection con) throws SQLException{
PreparedStatement preState=con.prepareStatement(sql);
preState.setString(1,student.getName());
preState.setString(2,student.getSex());
return preState;
}
},keyHolder);
//從主鍵持有者中獲得主鍵值
return keyHolder.getKey().intValue();
}
批量插入數(shù)據(jù):
public void testBatchUpdate() {
String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1});
batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2});
batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3});
batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3});
batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2});
jdbcTemplate.batchUpdate(sql, batchArgs);
}