Spring整合JDBC
JdbcTemplate
在Spring中提供了一个可以操作数据库的对象,对象封装了JDBC技术,这个对象就是JdbcTemplate,这个对象与DBUtils中的QueryRunner非常相似,那么接下来就对这个对象进行介绍
小试
首先使用JdbcTemplate+线程池进行简单的数据库操作,首先准备线程池,包括准备驱动,设置URL,填写用户名跟密码。然后生成JdbcTemplate对象,将准备好的线程池设置进JdbcTemplate中,最后就可以通过写sql语句来操作数据库了
// 准备连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///1806");
dataSource.setUser("timo");
dataSource.setPassword("123");
// 创建JDBC模板对象
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
// 书写sql并执行
String sql = "INSERT INTO user(name, password) VALUES('Scarlett', '1111')";
jt.update(sql);
上面一段代码简单的对JdbcTemplate进行了使用,下面就结合Spring来使用JdbcTemplate
JdbcTemplate + Spring
大致过程是准备一个UserDao类,在这个类中通过JdbcTemplate对表user(实体类User)做增删改查,而JdbcTemplate需要的CombopooledDataSource则由Spring注入,而UserDao需要的JdbcTemplate对象也由Spring注入
准备实体类User
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
准备UserDao接口跟UserDaoImpl类
UserDao Interface
import java.util.List;
import com.jinxin.bean.User;
public interface UserDAO {
// 增
void save(User u);
// 删
void delete(Integer id);
// 改
void update(User u);
// 查
User getById(Integer id);
// 查
int getTotalCount();
// 查
List<User> getAll();
}
UserDaoImpl
在这个类中继承UserDao接口,并使用JdbcTemplate对象做增删改查
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import com.jinxin.bean.User;
public class UserDaoImpl implements UserDAO {
private JdbcTemplate jt;
public void setJt(JdbcTemplate jt) {
this.jt = jt;
}
@Override
public void save(User u) {
String sql = "INSERT INTO user(name, password) VALUES(?, null)";
jt.update(sql, u.getName());
}
@Override
public void delete(Integer id) {
String sql = "DELETE FROM user WHERE user_id = ?";
jt.update(sql, id);
}
@Override
public void update(User u) {
String sql = "UPDATE user SET name = ? WHERE user_id = ?";
jt.update(sql, u.getName(), u.getId());
}
@Override
public User getById(Integer id) {
String sql = "SELECT * FROM user WHERE user_id = ?";
return jt.queryForObject(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User user = new User();
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("name"));
return user;
}
}, id);
}
@Override
public int getTotalCount() {
String sql = "SELECT count(*) FROM user";
Integer count = jt.queryForObject(sql, Integer.class);
return count;
}
@Override
public List<User> getAll() {
String sql = "SELECT * FROM user";
List<User> list = jt.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User user = new User();
user.setId(rs.getInt("user_id"));
user.setName(rs.getString("name"));
return user;
}
});
return list;
}
}
在配置文件中将CombopooledDataSource跟JdbcTemplate注入
再注入前首先要明确CombopooledDataSource,JdbcTemplate跟UserDaoImpl这三者的关系,在JdbcTemplate中需要一个CombopooledDataSource对象,然后在UserDaoImpl中需要一个JdbcTemplate对象,关系就是这样,如下所示

因次,在配置文件中做如上注入即可
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <!-- 1.将连接池放入Spring容器 --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="jdbc:mysql:///1806"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="user" value="timo"></property> <property name="password" value="123"></property> </bean> <!-- 2.将JdbcTemplate放入Spring容器 --> <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 3.将UserDAO放入Spring容器 --> <bean name="userDao" class="com.jinxin.jdbc.UserDaoImpl"> <property name="jt" ref="jdbcTemplate"></property> </bean> </beans>
测试
既然做好了所有的工作,那么就要开始测试了准备一个Demo类,将上面UserDaoImpl中的方法都测试一遍
import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.jinxin.bean.User; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class TestJDBC { @Resource(name="userDao") private UserDAO ud; // 准备一个UserDaoImpl对象 // @Test public void test1() { User u = new User(); u.setName("qiuzi"); ud.save(u); } // @Test public void test2() { User u = new User(); u.setId(5); u.setName("qiuzi"); ud.update(u); } // @Test public void test3() { ud.delete(16); } // @Test public void test4() { System.out.println(ud.getTotalCount()); } // @Test public void test5() { System.out.println(ud.getById(1)); } @Test public void test6() { System.out.println(ud.getAll()); } }
JdbcDaoSupport + Spring
上面在UserDaoImpl里面声明了一个JdbcTemplate对象,然后做增删改查工作,除了这种方式以外还有另外一种方式,就是让UserDaoImpl继承一个JdbcDaoSupport类,将dataSource直接注入到UserDaoImpl中,在UserDaoImpl中可以通过super.getJdbcTemplate()来获取JdbcTemplate对象,如下
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.jinxin.bean.User;
public class UserDaoImpl extends JdbcDaoSupport implements UserDAO {
@Override
public void save(User u) {
String sql = "INSERT INTO user(name, password) VALUES(?, null)";
super.getJdbcTemplate().update(sql, u.getName());
}
}
在applicationContext.xml中直接将CombopooledDataSource注入到UserDaoImpl里面即可
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <!-- 1.将连接池放入Spring容器 --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="jdbc:mysql:///1806"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="user" value="timo"></property> <property name="password" value="123"></property> </bean> <!--2.将UserDAO放入Spring容器 --> <bean name="userDao" class="com.jinxin.jdbc.UserDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
通过以上方法也可以使用JdbcTemplate对象
Spring读取properties
在操作数据库的时候一般都是将数据库用户名,密码这些写在db.properties文件中,这样方便操作,那么在Spring中怎样去读取db.properties里面的内容呢?如下是一个db.properties文件,尝试去读取它
db.properties:
注意:一般为了防止重名,会在键的前面加上一个前缀,前缀内容凭个人喜好
jdbc.jdbcUrl=jdbc:mysql:///1806
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123
在applicationContext.xml中读取
<!-- 指定Spring读取db.properties配置 --> <context:property-placeholder location="classpath:db.properties" /> <bean name="dataSource" class=""> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> </bean>
以上就是在Spring中读取properties配置文件

浙公网安备 33010602011771号