1、 Spring JDBC Made by Michael.Shi 281481047@ 数据源 2 1.配置数据源 2 2.配置JbcdTemplate 2 3.配置Data Access Object类 3 写数据 3 1.添加一条记录 3 2.添加多条记录 4 方法1: 4 方法2: 4 读数据 5 1.获得一条记录 5 2.获得多条记录 5 返回单个值 6 执行存储过程 6 全文以《学生管理》为例子进行解释在Spring应用JDBC 包含StudentDao,StudentDapImpl,StudentService,St
2、udent
主要利用JdbcTemplate来进行数据库的增、删、查、改操作
数据源
1.配置数据源
数据源需要在beans.xml文件中进行配置
3、//localhost:3306/spring
5、e jdbcTemplate: execute方法执行DDL statement update 方法执行insert, delete, update query 方法执行select * from table queryForXXX 方法执行 select count(*) from table 写数据 1.添加一条记录 public int add(Student student) { // PreparedStatement String sql = "insert into student (id,name) values(?, ?)"; /
6、/Parameters Object[] params = new Object[]{ student.getId(), student.getName() }; // Parameter's type int type[] = new int[] {Types.VARCHAR, Types.VARCHAR}; // Update return jdbcTemplate.update(sql, params, type); } 也可以不用types[](只是为了更加准确),而直接jdbcTemplate.update(sql, params); 2
7、添加多条记录
方法1:
// List has to be final, according to getBatchSize() 's return value
public int[] batchAdd(final List
8、 setter = new BatchPreparedStatementSetter() { @Override public int getBatchSize() { return students.size(); } @Override public void setValues(PreparedStatement ps, int index) throws SQLException { Student stu = students.get(index); ps.setStri
9、ng(1, stu.getId());
ps.setString(2, stu.getName());
}
};
return jdbcTemplate.batchUpdate(sql, setter);
需要实现BatchPreparedStatementSetter接口,这里通过匿名内部类来实现。内部类中实现了两个方法 getBatchSize( ), setValues( )
注意参数final List
10、e final, according to getBatchSize() 's return value
public int[] batchAdd(final List
11、ADD // List
12、nt findById(String id) { String sql = "select id,name from student where id=?"; Object[] params = new Object[]{id}; // Student has to be final, according to processRow(ResultSet rs) method final Student student = new Student(); jdbcTemplate.query(sql, params, new RowCallbackHandler
13、Org.springframework.jdbc.core () { @Override public void processRow(ResultSet rs) throws SQLException { student.setId(rs.getString("id")); student.setName(rs.getString("name")); } }); return student; } JdbcTemplate.query( )方法需要一个RowCallBackHandler接口作为参数,这里以内部
14、类来实现,实现processRow ( ) 方法,在这个方法中对ResultSet中每一条结果进行处理。
注意局部变量final Student students,必须设置为final,是由于processRow(ResultSet rs)方法。
2.获得多条记录
public List
15、StudentRowMapper()));
}
这里jdbcTemplate.query( )方法需要ResultReader接口,所以这里使用
RowMapperResultSetExtractor,其又需要RowMapper接口,这里我们自定义了StudentRowMapper(需要继承RowMapper接口)。
class StudentRowMapper implements RowMapper
16、ion { Student stu = new Student(); stu.setId(rs.getString("id")); stu.setName(rs.getString("name")); return stu; } } RowMapper接口负责将ResultSet中的每一行映射成一个Object. 这样,我们就有了一个可复用的类,用来取得ResultSet中的每行数据来创建一个Student对象。这个可以被用于所有的Student查询中。例如查询一个Student对象: 可以再DAO中,使用studentDao.getAll().ge
17、t(0)来获得单个查询 返回单个值 如果涉及到select cout(*) from table,需要如下实现: public int count() { String sql = "select count(id) from student"; return jdbcTemplate.queryForInt(sql); } 执行存储过程 public void SP_Test() { CallableStatementCallback cb = new CallableStatementCallback() { @Override
18、 public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); return null; } }; jdbcTemplate.execute("{call sp_update()}", cb); } 需要实现CallableStatementCallback接口,在内部类中实现doInCallableStatement( )方法来进行存储过程的调用。(具体的上网查)






