由于Demo13是访问数据库因此要做些前期技术介绍
Demo13访问数据库是通过SpringJDBCTemplate方式(下个Demo将其改造成Hibernate方式)
这儿简单介绍下SpringJDBCTemplate:
JDBCTemplate是对JDBC种封装为了减少JDBC繁琐代码而设计出来抽象出些常用思路方法目标是Simple and Stupid
Make JDBC easier to use and less error phone
Framework handles the creation and release resources
Framework takes care of all exception handling
JDBCTemplate使用需要有DataSource支持所以在配置文件中需要个DataSource配置然后在DataSource配置到JdbcTemplate里接着将JDBCTemplate配置进DAO层最后DAO配置到Model层
JDBCTemplate使用思路方法:
Execute SQL Queries,update statements or stored procedure calls
Iteration over Results and extraction of ed parameter values
1、表操作
使用JdbcTemplateexecute思路方法执行SQL语句
execute思路方法总是使用 java.sql.Statement,不接受参数而且他不返回受影响记录计数更适合于创建和丢弃表语句
代码
jdbcTemplate.execute("CREATE TABLE USER (user_id eger, name varchar(100))");
2、增、删和改
update思路方法update思路方法返回是受影响记录数目个计数并且如果传入参数话使用是java.sql.PreparedStatement更适合于插入更新和删除操作
1)不带参数更新
代码
jdbcTemplate.update("INSERT INTO USER VALUES('"
+ user.getId + "', '"
+ user.getName + "', '"
+ user.getSex + "', '"
+ user.getAge + "')");
2)带参数更新
代码:jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", Object {name, id});
代码:jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", Object {user.g etId, user.getName, user.getSex, user.getAge});
3)JDBCPreparedStatement
代码:------单个更新
final String id = user.getId;
final String name = user.getName;
final String sex = user.getSex + "";
final age = user.getAge;
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
PreparedStatementSetter {
public void Values(PreparedStatement ps) throws SQLException {
ps.String(1, id); //需要注意: 匿名内部类 只能访问外部最终局部变量
ps.String(2, name);
ps.String(3, sex);
ps.Int(4, age);
}
});
代码:------批量更新
需要批处理可以实现org.springframework.jdbc.core.BatchPrepared- StatementSetter接口:
package org.springframework.jdbc.core;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public erface BatchPreparedStatementSetter {
void Values(PreparedStatement ps,
i) throws SQLException;
getBatchSize;
}
...
public insertUsers(final List users) {
String sql = "INSERT INTO user (name,age) VALUES(?,?)";
BatchPreparedStatementSetter ter =
BatchPreparedStatementSetter {
public void Values(
PreparedStatement ps, i) throws SQLException {
User user = (User) users.get(i);
ps.String(1, user.getName);
ps.Int(2, user.getAge.Value);
}
public getBatchSize {
users.size;
}
};
jdbcTemplate.batchUpdate(sql, ter);
}
...
如果JDBC驱动支持批处理则直接使用它功能如果不支持 Spring则会个个自动处理更新以模拟批处理
3、查询1)使用JdbcTemplate进行查询时使用queryForXXX等思路方法
• Queries, using convenience methods
代码: count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");
代码:String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", Object {id}, java.lang.String.);
代码: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)
代码:
List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
Iterator it = rows.iterator;
while(it.hasNext) {
Map userMap = (Map) it.next;
.out.pr(userMap.get("user_id") + "t");
.out.pr(userMap.get("name") + "t");
.out.pr(userMap.get("sex") + "t");
.out.prln(userMap.get("age") + "t");
}
2)JDBCcallback方式
• Queries, using callback method
A)processRow
在查询到数据的后先作些处理再传回可以实现org.springframework.jdbc.core.RowCallbackHandler接口
代码:------单行查询
final User user = User;
jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
Object {id},
RowCallbackHandler {
public void processRow(ResultSet rs) throws SQLException { //需要注意: 匿名内部类 只能访问外部最终局部变量
user.Id(rs.getString("user_id"));
user.Name(rs.getString("name"));
user.Sex(rs.getString("sex").charAt(0));
user.Age(rs.getInt("age"));
}
});
代码:------多行查询
final List employees = LinkedList;
jdbc.query("select EMPNO, FIRSTNME, LASTNAME from EMPLOYEE",
RowCallbackHandler {
public void processRow(ResultSet rs) throws SQLException {
Employee e = Employee;
e.EmpNo(rs.getString(1));
e.FirstName(rs.getString(2));
e.LastName(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中每行
UserRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, index) throws SQLException {
User user = User;
user.Id(rs.getString("user_id"));
user.Name(rs.getString("name"));
user.Sex(rs.getString("sex").charAt(0));
user.Age(rs.getInt("age"));
user;
}
}
传回结果已使用UserRowMapper定义将的封装为User对象
//返回多行查询结果
public List findAllByRowMapperResultReader {
String sql = "SELECT * FROM USER";
jdbcTemplate.query(sql, RowMapperResultReader( UserRowMapper));
}
the 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 = Object { id };
List list = jdbcTemplate.query(sql, params, RowMapperResultReader( UserRowMapper));
(User) list.get(0);
}
文章来源:http://wangyisong.javaeye.com/blog/419443
最新评论