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配置文件