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>
View Code

测试

既然做好了所有的工作,那么就要开始测试了准备一个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());
    }
}
View Code

 

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

 

posted @ 2018-08-02 12:48  Jin同学  阅读(150)  评论(0)    收藏  举报