Spring JDBC
Spring JDBC
Spring JDBC是什么 ?
Spring JDBC是Spring 框架对JDBC的简单封装。
它为什么而存在,或者说它可以干什么
Spring JDBC避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,而且JDBC将事务交给Spring框架来管理。
一、基础知识
Dao
Data Access Object 数据访问接口
接口可用JDBC、Mybatis、Hibernate 实现。
业务使用接口获取对象。
ORM
Object Relation Mapping 对象关系映射。
数据访问
- 连接参数
- 打开连接
- 声明SQL语句以及参数
- 执行SQL,并循环访问结果
- 执行业务
- 处理异常
- 关闭连接,语句以及结果集
二、DataSource
驱动类名、链接地址、用户名、密码
配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy—method="close">
<property name="driverCIassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property—placeholder location="db.properties"/> 数据库配置
三、JdbcTemplate
功能
- 声明SQL及参数
- 执行SQL及处理结果
- 异常处理
示例
查询
int rowCount = this.jdbcTemplate.queryForObject(
"select count(*) from user",Integer.class);
int countOfNamedJoe = this.jdbcTempIate.queryForObject(
"select count(*) from user where first_name = ?",
Integer.class,"Joe");
String lastName = this.jdbcTemplate.queryForObject(
"select last_name from user where id = ?"
new Object[]{1212L},String.class);
更新
this.jdbcTemplate.update(
"insert into user(first_name, lastname) value (?, ?)", "Meimei","Han");
this.jdbcTemplate.update(
"update user set last_name = ? where id = ?", "Li", 5276L);
this.jdbcTemplate.update(
"delete from user where id = ?", Long.valueOf(userId));
执行sql语句
this.jdbcTemplate.execute("create table user(Id integer, first_name varchar(100), last_name varchar(100));
RowMapper
查询一个
User user this.jdbcTemplate.queryForObject(
"select first_name, last_name from user where id =?",
new Object[]{1212L},
new RowMapper<User>(){
public User mapRow(ResultSet rs, int rowNum) throws SQLException{
User user = new User();
user.setFirstName(rs.getString("first_name"));
user.setLastName(rs.getString("Iastname"));
return user;
}
}):
查询多个
List<User> users = this.jdbcTemplate.query(
"select first_name,last_name from user", new RowMapper<User>(){
public User mapRow(ResultSet rs,int rowNum)throws SQLException{
User user = new User();
user.setFirstName(rs·getString("first_name"));
user.setLastName(rs.getString("last_name"));
return user;
}
});
声明
public class JdbcExampleDao implements ExampleDao{
private JdbcTempLate jdbcTemplate;
public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//..DAO接囗实现
配置
xml配置
<bean id="exampIeDaollcourse.JdbcExampIeDao">
<property name="dataSource" ref="dataSource"/>
</bean>
注解配置
public class JdbcExampleDao implements ExampleDao{
private JdbcTempLate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//..DAO接囗实现
四、 NamedParameterJdbcTempIate
namedParameterJdbcTempIate 是对JdbcTempIate的一个封装
用 “:名称” 来代替 ”?“
示例
private NamedParameterJdbcTempLate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource){
this.namedParameterJdbcTempIate = new NamedParameterJdbcTemp(dataSource);
}
public int countOfUsersByFirstName(String firstName){
String sql = "select count(*) from user where first_name = :first_name";
Map<String, String> namedParameters = Collections.singletonMap("first_name",firstName);
return this.namedParameterJdbcTemplate,queryForObject(sql,namedParameters,
Integer.class);
接口
SqlParameterSource :功能:数据库列表名和字段名对应
queryForObject(String sql, Map<String, ?> RowMapper, <T> rowMapper)
queryForObject(String sql,SqlParameterSource paramSource, Class<T> requiredType)
子类实现接口
MapSqlParameterSource :手动对应
BeanPropertySqlParameterSource :spring自动对应
BeanPropertySqlParameterSource 的使用示例:
private NamedParameterJdbcTempLate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource){
this.namedParameterJdbcTempIate = new NamedParameterJdbcTemp(dataSource);
}
public int countOfUsersByFirstName(User exampleUser){
String sql = "select count(*) from user where first_name = :first_name";
SqLParameterSource namedParameters = new BeanPropertySqLParameterSource(exampleUser);
return this.namedParameterJdbcTemplate,queryForObject(sql,namedParameters, Integer.class);
异常处理
数据库:SQLException是checked异常,到处都是try/catch(代码非常难堪)
Spring:DataAccessException是unchecked异常,不用写catch
疑惑见Spring JDBC Exception