1.Spring对JDBC的支持
(1)传统JDBC代码的弊端
代码泛滥,有很多try … catch语句,导致可读性和可维护性下降。
Spring 的Jdbc Template可以解决这些问题。
(2)Spring对jdbc异常的处理
-
Spring采用某种特定的异常如SQLException,统一转换成自己的异常类型,这些异常以DataAccessException作为父类,他们封装了原始的异常对象,不会出现丢失原始错误信息的情况。
-
并且DataAccessException是继承自RuntimeException的,是非检查异常,故不需要在代码中进行处理,我们可以使用拦截器在最外层控制层进行统一的处理。
2.Spring配置数据源
(1)方式选择(dbcp/c3p0)
这里选用dbcp
dbcp配置时一些常见的属性
BasicDataSource提供了close()方法关闭数据源,以便Spring容器关闭时,数据源能够正常关闭,只需配置**destroy-method=”close”**属性。除以上必须的数据源属性外,还有一些常用的属性:
maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;
(2)配置步骤
导入包
引用配置文件
配置数据源
<!--引用jdbc.properties配置文件 -->
<util:properties id="jdbc" location="classpath:jdbc.properties" />
<!--配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="url" value="#{jdbc.url}"/>
<property name="driverClassName" value="#{jdbc.driver}" />
<property name="username" value="#{jdbc.username}" />
<property name="password" value="#{jdbc.password}" />
<property name="maxIdle" value="#{jdbc.maxIdle}" />
</bean>
3.JdbcTemplate操作数据库
(1)查询信息集合
UserDao.java
public List<User> getAll(){
String sql = "select * from user";
return jt.query(sql, userMapper);
}
IndexController.java
@RequestMapping("/getAll")
public String getAll(){
System.out.println("---------------------");
List<User> uList = userDao.getAll();
for (User u:uList){
System.out.println(u);
}
return "index";
}
(2)查询一条信息
UserDao.java
public User getOne(int id,String name){
String sql = "select * from user where id=? and name=?";
Object[] params = {id,name};
return jt.queryForObject(sql,params,userMapper);
}
IndexController.java
@RequestMapping("/getOne")
public String getOne(int id,String name){
System.out.println("-------------------------");
System.out.println(userDao.getOne(id, name));
return "index";
}
(3)增删改操作
UserDao.java
/**
* 通过id 修改用户信息
*/
public int updateUser(User u){
String sql = "update user set name=? , info=? where id=?";
Object[] params = {u.getName(),u.getInfo(),u.getId()};
return jt.update(sql,params);
}
IndexController.java
@RequestMapping("/update")
public String updateUser(String name,String info,int id){
System.out.println("---------------------");
if (userDao.updateUser(new User(id,name,0,null,info))>0){
System.out.println("操作成功!");
}else{
System.out.println("操作失败!");
}
return "index";
}
index.jsp
<h1>欢迎来到首页</h1>
<h3>
<a href="/index/getAll.do">查询所有人</a>
</h3>
<h3>
<a href="/index/getOne.do?id=1002&name=Bob">查询一位用户</a>
</h3>
<h3>
<a href="/index/update.do?id=1003&name=David&info=此人有点嚣张">修改一位用户</a>
</h3>
UserMapper.java
@Component
public class UserMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int i) throws SQLException {
//i为记录索引值
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
user.setPhone(rs.getString("phone"));
user.setInfo(rs.getString("info"));
System.out.println("i="+i);
return user;
}
}
applicationContext.xml
<!--引用jdbc.properties配置文件 -->
<util:properties id="jdbc" location="classpath:jdbc.properties" />
<!--配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="url" value="#{jdbc.url}"/>
<property name="driverClassName" value="#{jdbc.driver}" />
<property name="username" value="#{jdbc.username}" />
<property name="password" value="#{jdbc.password}" />
<property name="maxIdle" value="#{jdbc.maxIdle}" />
</bean>
<!--配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
jdbc.properties
url=jdbc:mysql://localhost:3306/jw_chapter6
username=root
password=123456
driver=com.mysql.jdbc.Driver
maxIdle=100
数据库创建表,添加记录的SQL语句:
USE jw_chapter6;
DROP TABLE IF EXISTS USER;
CREATE TABLE IF NOT EXISTS USER(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT(3),
phone CHAR(11),
info VARCHAR(100)
);
INSERT INTO USER VALUES
(1001,'Alice',18,'19919061639','此人很懒,什么都没留下'),
(1002,'Bob',20,'13581459925','哈哈哈'),
(1003,'Clover',21,'13616391906','呵呵');
SELECT * FROM USER;
没有执行update操作前,后台数据库查询结果:
执行update操作后,后台数据库查询结果
控制台输出结果:
查询所有
查询一条
修改信息
jdbcTemplate的常见方法介绍:
1、queryForObject() 查询单个数据
2、query() 查询多个数据,返回一个list
3、update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
4、execute方法: 可以用于执行任何SQL语句,一般用于执行DDL语句