jdbctemplate_的使用
一、表的操做
使用JdbcTemplate的execute()方法執行SQL語句
execute方法老是使用 java.sql.Statement,不接受參數,並且他不返回受影響記錄的計數,更適合於建立和丟棄表的語句。
Java代碼
- jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");
二、增、刪和改
update方法update方法返回的是受影響的記錄數目的一個計數,而且若是傳入參數的話,使用的是java.sql.PreparedStatement,更適合於插入,更新和刪除操做
1)不帶參數的更新
Java代碼
- jdbcTemplate.update("INSERT INTO USER VALUES('"
- + user.getId() + "', '"
- + user.getName() + "', '"
- + user.getSex() + "', '"
- + user.getAge() + "')");
2)帶參數的更新
Java代碼
- jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});
- 代碼:jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.g etId(), user.getName(), user.getSex(), user.getAge()});
3)JDBC的PreparedStatement
------單個更新
Java代碼
- final String id = user.getId();
- final String name = user.getName();
- final String sex = user.getSex() + "";
- final int age = user.getAge();
-
- jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
- new PreparedStatementSetter() {
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setString(1, id); //須要注意: 匿名內部類 只能訪問外部最終局部變量
- ps.setString(2, name);
- ps.setString(3, sex);
- ps.setInt(4, age);
- }
- });
------批量更新
須要批處理,能夠實現org.springframework.jdbc.core.BatchPrepared- StatementSetter接口:
Java代碼
- package org.springframework.jdbc.core;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- public interface BatchPreparedStatementSetter {
- void setValues(PreparedStatement ps,
- int i) throws SQLException;
- int getBatchSize();
- }
-
- ...
- public int[] insertUsers(final List users) {
- String sql = "INSERT INTO user (name,age) VALUES(?,?)";
- BatchPreparedStatementSetter setter =
- new BatchPreparedStatementSetter() {
- public void setValues(
- PreparedStatement ps, int i) throws SQLException {
- User user = (User) users.get(i);
- ps.setString(1, user.getName());
- ps.setInt(2, user.getAge().intValue());
- }
- public int getBatchSize() {
- return users.size();
- }
- };
- return jdbcTemplate.batchUpdate(sql, setter);
- }
...
若是JDBC驅動程序支持批處理,則直接使用它的功能,若是不支持, Spring則會一個一個自動處理更新以模擬批處理。
三、查詢
1)使用JdbcTemplate進行查詢時,使用queryForXXX()等方法
• Queries, using convenience methods
代碼:
Java代碼
- int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM
USER");
代碼:
Java代碼
- String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);
代碼:
Java代碼
- List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
- Returns an ArrayList (one entry for each row) of HashMaps (one entry for each column using the column name as the key)
代碼:
Java代碼
- List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
- Iterator it = rows.iterator();
- while(it.hasNext()) {
- Map userMap = (Map) it.next();
- System.out.print(userMap.get("user_id") + "\t");
- System.out.print(userMap.get("name") + "\t");
- System.out.print(userMap.get("sex") + "\t");
- System.out.println(userMap.get("age") + "\t");
- }
2)JDBC的callback方式
• Queries, using callback method
A)processRow
在查詢到數據以後先做一些處理再傳回。能夠實現org.springframework.jdbc.core.RowCallbackHandler接口
代碼:------單行查詢
Java代碼
- final User user = new User();
- jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
- new Object[] {id},
- new RowCallbackHandler() {
- public void processRow(ResultSet rs) throws SQLException { //須要注意: 匿名內部類 只能訪問外部最終局部變量
- user.setId(rs.getString("user_id"));
- user.setName(rs.getString("name"));
- user.setSex(rs.getString("sex").charAt(0));
- user.setAge(rs.getInt("age"));
- }
- });
代碼:------多行查詢
Java代碼
- final List employees = new LinkedList();
- jdbc.query("select EMPNO, FIRSTNME, LASTNAME from EMPLOYEE",
- new RowCallbackHandler() {
- public void processRow(ResultSet rs) throws SQLException {
- Employee e = new Employee();
- e.setEmpNo(rs.getString(1));
- e.setFirstName(rs.getString(2));
- e.setLastName(rs.getString(3));
- employees.add(e);
- }
- }
- );
- employees list will be populated with Employee objects
B) RowMapper
一次要取回不少查詢結果的對象,則能夠先實現org.springframe- work.jdbc.core.RowMapper接口。
代碼:------將數據表中的數據影射成其對應的JAVA類的對象,mapRow回調方法會被ResultSet中的每一行調用。
Java代碼
- class UserRowMapper implements RowMapper {
- public Object mapRow(ResultSet rs, int index) throws SQLException {
- User user = new User();
-
- user.setId(rs.getString("user_id"));
- user.setName(rs.getString("name"));
- user.setSex(rs.getString("sex").charAt(0));
- user.setAge(rs.getInt("age"));
-
- return user;
- }
- }
傳回的結果已使用UserRowMapper的定義,將之封裝爲User對象。
Java代碼
- //返回多行查詢結果
- public List findAllByRowMapperResultReader() {
- String sql = "SELECT * FROM USER";
- return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
- }
- the return list will be populated with User objects
-
- //返回單行查詢結果
- 在getUser(id)裏面使用UserRowMapper
- 代碼
- public User getUser(final String id) throws DataAccessException {
- String sql = "SELECT * FROM USER WHERE user_id=?";
- final Object[] params = new Object[] { id };
- List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));
-
- return (User) list.get(0);
- }
歡迎關注本站公眾號,獲取更多信息