Spring作为一个优秀的框架,连接数据库时也是通过封装jdbc来进行连接的,那么spring的jdbc是如何封装和优化的呢?它比起原来的jdbc有什么优势?本篇将学习spring对jdbc的优化,以及简单的给数据库添加数据的一个例子。
一:传统的jdbc
先来看看传统的jdbc是如何实现对数据库的连接以及存放数据的,
先来一段传统的用jdbc实现的数据库连接工具类代码
public class DButil {
private String jdbcName = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/expressage";
private String user = "root";
private String password = "mysql";
Connection con;
PreparedStatement prep;
/**
* 获取数据库连接
*
* @return
* @throws Exception
*/
public Connection getCon() {
try {
Class.forName("com.mysql.jdbc.Driver");// 加载驱动
con = DriverManager.getConnection(url, user, password);// 建立连接
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/**
* 关闭数据库连接
*
* @param con
* @throws Exception
*/
public void closeCon(Connection con) throws Exception {
if (prep != null) {
prep.close();
}
if (con != null) {
con.close();
}
}
/**
* 增 、 删 、改
*
* @param sql
* @param objects
* @return
*/
public int executeUpdate(String sql, Object... objects) {
try {
con = getCon();// 得到连接对象 con
prep = con.prepareStatement(sql);
for (int i = 0; i < objects.length; i++) {
prep.setObject(i + 1, objects[i]);
}
return prep.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* 查询
*
* @param sql
* @param objects
* @return
*/
public ResultSet executeQuery(String sql, Object... objects) {
try {
con = getCon();// 得到连接对象 con
prep = con.prepareStatement(sql);
for (int i = 0; i < objects.length; i++) {
prep.setObject(i + 1, objects[i]);
}
return prep.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
我们可以看到传统的jdbc需要加载驱动,然后选择数据库,输入账号,密码然后建立了链接,由于需要频繁的开关数据库所以我建立了上面的工具类,方便我们访问数据库,通过上面工具类就可以访问数据库并作出修改,
二:spring中的jdbc
Spring框架中给我们提供了可以操作数据库的对象,这个对象封装了jdbc技术,也就是
JDBCTemplate,又被称为Jdbc的模板对象,我们通过这个框架就可以实现对数据库的操作,先来一个简单的例子
我们可以看到jdbcTemplate可以通过把数据库连接池对象注入进属性从而实现对对应数据库的操作,
下面我们来实现用模板链接数据库的过程:
1,导包
除了spring必备的几个包我们还需要加入
jdbc包,(链接数据库包)
以及tx包,(事务)
当然因为我们是通过连接池来进行操作的所以我们要把c3p0包(数据连接池)也加上,因此最后完成就成这样的了,

先写简单的增,删,改,查,浏览,
package cn.oracle.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import cn.oracle.pojo.User;
//继承jdbcDaoSupport 实现自动给jdbcTemplate属性赋值
//jdbcDaoSupport中的的JDbcTemplate属性我们通过xml配置来给它赋值,当然也可以声明一个变量在xml中配置,
//引入
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
@Override
public void addUser(User user) {
//第一个值主键自增所以为Null。
String insert="insert into t_user values(null,?)";
//super也可以用this代替或者super是指父类,因为继承了所以当前类也可以省略
super.getJdbcTemplate().update(insert,user.getName());
}
@Override
public void updateUser(User user) {
String update="update t_user set name=? where id=?";
super.getJdbcTemplate().update(update,user.getName(),user.getId());
}
@Override
public void deleteUser(Integer id) {
String delete="delete from t_user where id=?";
super.getJdbcTemplate().update(delete,id);
}
@Override
public List<User> getAllUser() {
String query = "select * from t_user";
//因为object也是list的父类,所以用List集合来接是没有问题的,
List<User>list = super.getJdbcTemplate().query(query,new RowMapper<User>() {
//抛出异常,这个方法
//mapRow是系统提供给我们的方法
public User mapRow(ResultSet rs, int rowNum) throws SQLException{
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
});
return list;
}
@Override
public User queryUserbyid(Integer id) {
String query = "select * from t_user where id=?";
//返回
return super.getJdbcTemplate().queryForObject(query, new RowMapper<User>(){
public User mapRow(ResultSet rs,int rowNum) throws SQLException{
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
},id);
}
}
在看xml配置之前先看配置文件,以properties结尾的配置
mysql.driverClass=com.mysql.jdbc.Driver
#这里加mysql是为了不混用
mysql.url=jdbc:mysql:///school
mysql.username=root
mysql.password=mysql
然后是xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<!-- 0.spring读取配置文件,配置文件写的是sqL配置,这样就可以直接改动文件,更方便 -->
<context:property-placeholder location="classpath:db.properties"/>
<!--1.配置数据连接池 -->
<bean name = "ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--下面注释掉的这几行是因为我用另外的配置文件写入了,所以我就不需要额外写了-->
<!-- <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///school"></property>
<property name="user" value="root"></property>
<property name="password" value="mysql"></property>-->
<!-- 引入配置文件.properties的内容 -->
<property name="driverClass" value="${mysql.driverClass}"></property>
<property name="jdbcUrl" value="${mysql.url}"></property>
<property name="user" value="${mysql.username}"></property>
<property name="password" value="${mysql.password}"></property>
</bean>
<!--2.配置Jdbc模板类因为这个模板类封装了jdbc所以我们需要配置并对其赋值,注意datasource这个名字不要写错 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds"></property>
</bean>
<!-- 3.配置使用jdbdsupport,含有模板类可以通过get方法直接获取 -->
<bean name="UserDao" class="cn.oracle.dao.UserDaoImpl">
<!-- 在support类中属性赋值参数是datasource -->
<property name="dataSource" ref="ds"></property>
</bean>
</beans>
简单测试一下
结果:
需要注意的点:1.mysql数据库的情况下需要把表类型改为myisAm,(然而事务回滚又得更改为inndb类型)不然类型不对的话会一直报错无法获取链接
2.配置文件引入配置中的属性要加前缀并且双引号加起来,不然也会提示你无法获得链接属性,
下一篇:Spring对jdbc数据库的事务管理