资源描述
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,Student
主要利用JdbcTemplate来进行数据库的增、删、查、改操作
数据源
1.配置数据源
数据源需要在beans.xml文件中进行配置
<bean id="dataSource" class="mons.dbcp.BasicDataSource需要引入common.dbcp.jar
">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/spring</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>890127</value>
</property>
</bean>
2.配置JbcdTemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
3.配置Data Access Object类
<bean id="studentDao" class="com.primeton.spl.dao.impl.StudentDaoImp">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
DAO
引用
JdbcTemplate
引用
DataSource
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(?, ?)";
//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.添加多条记录
方法1:
// List has to be final, according to getBatchSize() 's return value
public int[] batchAdd(final List<Student> students)
{
String sql = "insert into student(id, name) values(?,?)";
// Inner class
BatchPreparedStatementSetterOrg.springframework.jdbc.core
setter = null;
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.setString(1, stu.getId());
ps.setString(2, stu.getName());
}
};
return jdbcTemplate.batchUpdate(sql, setter);
需要实现BatchPreparedStatementSetter接口,这里通过匿名内部类来实现。内部类中实现了两个方法 getBatchSize( ), setValues( )
注意参数final List<Student> students,必须设置为final,是由于getSize()方法的返回值
方法2:
// List has to be final, according to getBatchSize() 's return value
public int[] batchAdd(final List<Student> students)
{
String sql = "insert into student(id, name) values(?,?)";
//
// Use public int[] batchUpdate(java.lang.String sql,
java.util.List<java.lang.Object[]> batchArgs) to realize BATCH ADD
//
List<Object[]> batchArgs = new ArrayList<Object[]>();
batchArgs.add(new Object[]{"966", "spl"});
batchArgs.add(new Object[]{"977", "michael"});
batchArgs.add(new Object[]{"988", "mad"});
return jdbcTemplate.batchUpdate(sql, batchArgs);
}
读数据
1.获得一条记录
public Student 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 RowCallbackHandlerOrg.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接口作为参数,这里以内部类来实现,实现processRow ( ) 方法,在这个方法中对ResultSet中每一条结果进行处理。
注意局部变量final Student students,必须设置为final,是由于processRow(ResultSet rs)方法。
2.获得多条记录
public List<Student> getAll()
{
String sql = "select id,name from student ";
return jdbcTemplate.query(sql,
new RowMapperResultSetExtractor<Student>(new StudentRowMapper()));
}
这里jdbcTemplate.query( )方法需要ResultReader接口,所以这里使用
RowMapperResultSetExtractor,其又需要RowMapper接口,这里我们自定义了StudentRowMapper(需要继承RowMapper接口)。
class StudentRowMapper implements RowMapper<Student>
{
@Override
public Student mapRow(ResultSet rs, int index) throws SQLException
{
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().get(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
public Object doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException
{
cs.execute();
return null;
}
};
jdbcTemplate.execute("{call sp_update()}", cb);
}
需要实现CallableStatementCallback接口,在内部类中实现doInCallableStatement( )方法来进行存储过程的调用。(具体的上网查)
展开阅读全文