Spring与DAO:
Spring与JDBC模板:为了避免直接使用JDBC而带来的复杂且冗长的代码,Spring提供了一个强有力的模板类:JdbcTemplate 来简化JDBC操作。并且,数据源DataSource对象与模板JdbcTemplate对象均可通过Bean的形式定义在配置文件中,充分发挥了依赖注入的特性。
依赖jar:使用c3p0数据库连接池,Spring的JDBC.jar,Spring的事务jar,数据库驱动
一般的Service层访问Dao层:
StudentServiceImpl实现-------->IStudentService接口
StudentServiceImpl 持有 Dao的引用 ,由容器注入,Impl的实现依赖于Dao(调用Dao接口的方法)
Dao接口定义了访问DB的方法
定义Dao的实现类,将来注入StudentServiceImpl的类
使用JdbTemplate,Dao实现类
继承 JdbcDaoSupport,JdbcTemplate为该类的成员变量
增删改统一使用update方法:
@Override
public
void
insertStudent(Student
student
) {
String
sql
=
"insert into student(name,age) values(?,?)"
;
//
TODO
Auto-generated method stub
this
.getJdbcTemplate().update(
sql
,
student
.getName(),
student
.getAge()); //可变参重载方法
}
三种数据源的注册:
<!-- c3p0数据源 -->
<
bean
id
=
"c3p0Source"
class
=
"com.mchange.v2.c3p0.ComboPooledDataSource"
>
<
property
name
=
"driverClass"
value
=
"com.mysql.jdbc.Driver"
/>
<
property
name
=
"jdbcUrl"
value
=
"jdbc:mysql://localhost:3306/test"
/>
<
property
name
=
"user"
value
=
"root"
/>
<
property
name
=
"password"
value
=
"1234"
/>
</
bean
>
<!-- dbcp数据源 -->
<!-- <bean id="dbcpSource" class="org.apache.commons.dbcp.BasicDataSource.class">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean> -->
<!-- Spring内置数据源 -->
<!-- <bean id="springSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean> -->
使用properties文件:
<!-- c3p0数据源 -->
<
bean
id
=
"c3p0Source"
class
=
"com.mchange.v2.c3p0.ComboPooledDataSource"
>
<
property
name
=
"driverClass"
value
=
"${jdbc.driver}"
/>
<
property
name
=
"jdbcUrl"
value
=
"${jdbc.url}"
/>
<
property
name
=
"user"
value
=
"${jdbc.username}"
/>
<
property
name
=
"password"
value
=
"${jdbc.password}"
/>
</
bean
>
需要注册properties文件:
方式1)bean:
<!-- 注册jdbcproperties -->
<
bean
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<
property
name
=
"location"
value
=
"classpath:jdbc.properties"
/>
</
bean
>
使用locations注册多个
方式2):需要添加context约束
<
context:property-placeholder
location
=
"classpath:jdbc.properties"
/>
给DaoImpl对象注册模板,再给模板注册DataSource的步骤可以简化为:直接给DaoImpl对象(
JdbcDaoSupport)注册DataSource,因为JdbcDaoSupport的setDataSource方法会以DataSource对象为参数创建模板
<!-- Dao和DataSource -->
<
bean
id
=
"StudentDao"
class
=
"StudentDaoImpl"
>
<
property
name
=
"dataSource"
ref
=
"c3p0Source"
/>
</
bean
>
关系:
service调用Dao,向serviceImpl注入DaoImpl
DaoImpl继承自JdbcDaoSupport
向DaoImpl注入模板对象
向模板对象注入DataSource对象
模板实现增删改都使用update方法:
@Override
public
void
insertStudent(Student
student
) {
String
sql
=
"insert into student(name,age) values(?,?)"
;
//
TODO
Auto-generated method stub
this
.getJdbcTemplate().update(
sql
,
student
.getName(),
student
.getAge());
}
@Override
public
void
deleteStudent(Student
student
) {
//
TODO
Auto-generated method stub
String
sql
=
"delete from student where id=?"
;
this
.getJdbcTemplate().update(
sql
,
student
.getId());
}
@Override
public
void
updateStudent(Student
student
) {
//
TODO
Auto-generated method stub
String
sql
=
"update student set name=?,age=? where id=?"
;
this
.getJdbcTemplate().update(
sql
,
student
.getName(),
student
.getAge(),
student
.getId());
}
查询使用query方法
@Override
public
List<String> selectAllStudentsNames() {
//
TODO
Auto-generated method stub
String
sql
=
"select name from student"
;
return
this
.getJdbcTemplate().queryForList(
sql
, String.
class
);
}
@Override
public
String selectStudentNameById(
int
id
) {
String
sql
=
"select name from student where id=?"
;
//
TODO
Auto-generated method stub
return
this
.getJdbcTemplate().queryForObject(
sql
,String.
class
,
id
); //可变参重载方法
}
对于对象集合的查询queryForList不会将查询结果封装为对象,需要自己封装:
this.getTemplate().query(sql,rowMapper);
return
this
.getJdbcTemplate().query(
sql
,
new
RowMapper<Student>() {
@Override
public
Student mapRow(ResultSet
rs
,
int
rowNum
)
throws
SQLException {
//
TODO
Auto-generated method stub
return
null
;
}
});
在RowMapper
接口实现类中将结果集封装。
注意:
//这个rs不是select查询的所有结果集,而是这个结果集遍历出来的一行
@Override
public
Student mapRow(ResultSet
rs
,
int
rowNum
)
throws
SQLException {
//
TODO
Auto-generated method stub
return
null
;
}
JdbcTemPlate对象是多例的,的生命周期很短,就在一个方法内有效:
系统会为每一个使用模板对象的线程,创建一个JdbcTemplate实例,并且在该线程结束时,自动释放实例。