SSM框架学习(四)——SpringJDBC
一.Spring对jdbc异常的处理
Spring采用某种特定的异常,如:SQLException,统一转换成自己的异常类型,这些异常以DataAccessException作为父类,他们封装了原始的异常对象,不会出现丢失原始错误信息的情况。并且DataAccessException是继承自RuntimeException的,是非检查异常,故不需要在代码中进行处理,我们可以使用拦截器在最外层控制层进行统一的处理。
二.获取数据源DataSource
获取数据源有三种方式:
- 从JNDI获得DataSource(需要在服务器配置文件中配置不常用)
- 第三方连接池获得DataSource ,Spring在第三方依赖包中实现类两个包含数据源的实现类包,第一种是DBCP,第二种是C3P0,在xml种对这两个文件进行配置就可以获得DataSource
- 连接DriverManagerDataSource获得DataSource(一般不适用)
三.两种方式配置DataSource
3.1 DBCP实现配置datasource
- 所需jar包
2.配置jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb
username=root
password=123456
maxActive=10
- 引用本地配置文件,并配置数据源
<!-- 引入本地配置文件 -->
<util:properties id="jdbc" location="classpath:config/jdbc.properties"></util:properties>
<!-- 配置dbpc数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{jdbc.driver}"></property>
<property name="url" value="#{jdbc.url}"></property>
<property name="username" value="#{jdbc.username}"></property>
<property name="password" value="#{jdbc.password}"></property>
<property name="maxActive" value="#{jdbc.maxActive}"></property>
</bean>
4.DBCP常见配置
- BasicDataSource提供了close()方法关闭数据源加粗样式,以便Spring容器关闭时,数据源能够正常关闭,只需配置destroy-method=”close”属性加粗样式。除以上必须的数据源属性外,还有一些常用的属性:
- defaultAutoCommit加粗样式: 设置从数据源中返回的连接是否采用自动提交机制,默认为 true
- defaultReadOnly: 设置数据源是否仅能执行只读操作, 默认值为 false;
- maxActive: 最大连接数据库连接数,设置为0时,表示没有限制;
- maxIdle: 最大等待连接中的数量,设置为0时,表示没有限制;
- maxWait: 最大等待秒数,单位为毫秒, 超过时间会报出错误信息;
- validationQuery: 用于验证连接是否成功的查询SQL语句,至少要返回一行数据;
3.2 C3P0实现配置DataSource
- 所需jar包
- C3P0与DBCP配置大致相同,知识那么属性不同
- 常见属性配置:
- driverClass
- jdbcrl
- user
- password
- initialPoolSize: 连接池初始化时创建的连接数,default : 3
- minPoolSize: 连接池保持的最小连接数,default : 3
- maxPoolSize: 连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
- acquireIncrement: 连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3
- maxIdleTime: 连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,默认为0;
- maxConnectionAge: 配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。
四.Spring对DAO编写的支持及编写方式
- JdbcTemplate抽象类封装了常用的JDBC方法,封装了连接获取何释放等工作,大大简化了对JDBC的使用,可以有效避免忘记关闭资源连接等错误。
- JdbcDaoSupport抽象类是jdbc数据访问对象的基类,利用jdbc编程技术的DAO父类,类中获取Connection和JdbcTemplate对象信息,使用的时候需要注入datasource对象。
编写方式:
- 模式一:DAO继承JdbcDaoSupport,再其通过getIdbcTemplate()方法获取JdbcTemplate对象(此方法对代码有一定的入侵性,不推荐使用)
- 模式二:(推荐使用)不继承JdbcDaoSupport,在spring容器中配置一个JdbcTemplate的实例化对象的bean,注入给DAO实现类。
五.使用JdbcTemplate实现数据库的CURD操作
- 在spring.xml中配置JdbcTemplate的bean实例,需要使用jar包spring-jdbc
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" ref="dataSource"></property>
</bean>
- 创建实体类
public class User {
private int userId;
private String userName;
private String password;
private String phoneNumber;
//省略get和set方法
}
- 创建实体类的映射类,用于指定数据库到实体类的字段映射关系,通过RowMapper接口实现,将每行数据映射到实例对象
public class UserMapper implements RowMapper<User>{
@Override
public User mapRow(ResultSet rs, int i) throws SQLException {
User user = new User();
user.setUserId(rs.getInt("userId"));
user.setUserName(rs.getString("userName"));
user.setPassword(rs.getString("password"));
user.setPhoneNumber(rs.getString("phoneNumber"));
System.out.println(i);
return user;
}
}
- 使用@Repository对DAO类进行注解
@Repository //DAO注解类
public class UserDAO {
@Autowired
private JdbcTemplate jt;
UserMapper userMapper = new UserMapper();
public List<User> getAll(){
String sql = "select * from user";
Object[] obj = {};
// 参数(sql语句,?参数,映射类)
List<User> uList = jt.query(sql, obj, userMapper);
return uList;
}
public User getOne() {
String sql = "select * from user where userId = ?";
Object[] obj = {1001};
User user = jt.queryForObject(sql, obj,userMapper);
return user;
}
public int delete(int userId) {
String sql = "delete from user where userId=?";
Object[] obj = {1003};
int count = jt.update(sql,obj);
return count;
}
}
- 常用方法介绍:
方法名 | 作用 |
---|---|
queryForObject() | 查询单个数据 |
query() | 查询多个数据,返回一个list |
update() | 用于执行新增、修改、删除等语句 |
batchUpdate() | 执行批处理相关语句; |
execute() | 可以用于执行任何SQL语句,一般用于执行DDL语句 |