SSM框架学习(四)——SpringJDBC


一.Spring对jdbc异常的处理

Spring采用某种特定的异常,如:SQLException,统一转换成自己的异常类型,这些异常以DataAccessException作为父类,他们封装了原始的异常对象,不会出现丢失原始错误信息的情况。并且DataAccessException是继承自RuntimeException的,是非检查异常,故不需要在代码中进行处理,我们可以使用拦截器在最外层控制层进行统一的处理。


二.获取数据源DataSource

获取数据源有三种方式:

  1. 从JNDI获得DataSource(需要在服务器配置文件中配置不常用)
  2. 第三方连接池获得DataSource ,Spring在第三方依赖包中实现类两个包含数据源的实现类包,第一种是DBCP,第二种是C3P0,在xml种对这两个文件进行配置就可以获得DataSource
  3. 连接DriverManagerDataSource获得DataSource(一般不适用)

三.两种方式配置DataSource

3.1 DBCP实现配置datasource

  1. 所需jar包
  • commons-dbcp-1.4.jar
  • commons-pool-1.6.jar
  • spring-jdbc-5.1.3.RELEASE.jar
  • spring-tx-5.1.3.RELEASE.jar
    百度网盘下载地址:点击下载
    git下载地址:点击下载

2.配置jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb
username=root
password=123456
maxActive=10
  1. 引用本地配置文件,并配置数据源
<!-- 引入本地配置文件 -->
<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常见配置

  1. BasicDataSource提供了close()方法关闭数据源加粗样式,以便Spring容器关闭时,数据源能够正常关闭,只需配置destroy-method=”close”属性加粗样式。除以上必须的数据源属性外,还有一些常用的属性:
  2. defaultAutoCommit加粗样式: 设置从数据源中返回的连接是否采用自动提交机制默认为 true
  3. defaultReadOnly设置数据源是否仅能执行只读操作, 默认值为 false;
  4. maxActive最大连接数据库连接数,设置为0时,表示没有限制;
  5. maxIdle最大等待连接中的数量,设置为0时,表示没有限制;
  6. maxWait最大等待秒数,单位为毫秒, 超过时间会报出错误信息;
  7. validationQuery: 用于验证连接是否成功的查询SQL语句,至少要返回一行数据;

3.2 C3P0实现配置DataSource

  1. 所需jar包
  • c3p0-0.9.5.2.jar
  • mchange-commons-java-0.2.11.jar
    百度网盘下载地址:点击下载
    git下载地址:点击下载
  1. C3P0与DBCP配置大致相同,知识那么属性不同
  2. 常见属性配置:
  1. driverClass
  2. jdbcrl
  3. user
  4. password
  5. initialPoolSize: 连接池初始化时创建的连接数,default : 3
  6. minPoolSize: 连接池保持的最小连接数,default : 3
  7. maxPoolSize: 连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
  8. acquireIncrement: 连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3
  9. maxIdleTime: 连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,默认为0;
  10. maxConnectionAge: 配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。

四.Spring对DAO编写的支持及编写方式

  1. JdbcTemplate抽象类封装了常用的JDBC方法,封装了连接获取何释放等工作,大大简化了对JDBC的使用,可以有效避免忘记关闭资源连接等错误。
  2. JdbcDaoSupport抽象类是jdbc数据访问对象的基类,利用jdbc编程技术的DAO父类,类中获取Connection和JdbcTemplate对象信息,使用的时候需要注入datasource对象。

编写方式:

  1. 模式一:DAO继承JdbcDaoSupport,再其通过getIdbcTemplate()方法获取JdbcTemplate对象(此方法对代码有一定的入侵性,不推荐使用)
  2. 模式二:(推荐使用)不继承JdbcDaoSupport,在spring容器中配置一个JdbcTemplate的实例化对象的bean,注入给DAO实现类。

五.使用JdbcTemplate实现数据库的CURD操作

  1. 在spring.xml中配置JdbcTemplate的bean实例,需要使用jar包spring-jdbc
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
	<property name="dataSource" ref="dataSource"></property>
</bean>
  1. 创建实体类
public class User {
	private int userId;
	private String userName;
	private String password;
	private String phoneNumber;
//省略get和set方法
}
  1. 创建实体类的映射类,用于指定数据库到实体类的字段映射关系,通过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;
	}
}
  1. 使用@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;
	}
}
  1. 常用方法介绍:
方法名 作用
queryForObject() 查询单个数据
query() 查询多个数据,返回一个list
update() 用于执行新增、修改、删除等语句
batchUpdate() 执行批处理相关语句;
execute() 可以用于执行任何SQL语句,一般用于执行DDL语句
发布了26 篇原创文章 · 获赞 27 · 访问量 6869

猜你喜欢

转载自blog.csdn.net/qq_40705355/article/details/98638521