1. 程式人生 > >spring---整合JDBC

spring---整合JDBC

spring提供了操作資料庫的JDBCTemplate物件,與QueryRunner物件類似。

JDBCTemplate操作資料庫演示

導包

spring核心包(4)
在這裡插入圖片描述
日誌包(2)
在這裡插入圖片描述
c3p0連線池(1)
在這裡插入圖片描述
JDBC驅動(1)
在這裡插入圖片描述
spring-jdbc(1)
在這裡插入圖片描述
spring-tx(1)
在這裡插入圖片描述

所有包備齊如下:
在這裡插入圖片描述

準備資料庫

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Demo

package cn.ccnuacmhdu.JDBCTemplate;

import java.beans.PropertyVetoException;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class Demo {

	@Test
	public void fun() throws PropertyVetoException {
		//1.準備連線池
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		dataSource.setJdbcUrl("jdbc:mysql:///test");
		dataSource.setUser("root");
		dataSource.setPassword("123456");
		//2.建立JDBCTemplate物件
		JdbcTemplate jTemplate = new JdbcTemplate();
		jTemplate.setDataSource(dataSource);
		//3.書寫sql語句
		String sql = "insert into user values(null,'Tom')";
		//4.執行
		jTemplate.update(sql);
	}
}

JDBCTemplate的API+注入spring進行增刪改查

User.java

package cn.ccnuacmhdu.bean;

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.java

package cn.ccnuacmhdu.JDBCTemplate;

import java.util.List;

import cn.ccnuacmhdu.bean.User;

public interface UserDao {
	//增
	public abstract void add(User user);
	//刪
	public abstract void delete(Integer id);
	//改
	public abstract void update(User user);
	//查
	public abstract User findById(Integer id);
	public abstract Integer findTotalNumber();
	public abstract List<User> findAll();
}

UserDaoImpl.java

package cn.ccnuacmhdu.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 cn.ccnuacmhdu.bean.User;

public class UserDaoImpl implements UserDao {

	private JdbcTemplate jTemplate;
	
	public void add(User user) {

		String sql = "insert into user values(null,?)";
		jTemplate.update(sql, user.getName());
	}

	public void delete(Integer id) {

		String sql = "delete from user where id = ?";
		jTemplate.update(sql, id);
	}

	public void update(User user) {

		String sql = "update user set name = ? where id = ?";
		jTemplate.update(sql, user.getName(), user.getId());
	}

	public User findById(Integer id) {
		
		String sql = "select * from user where id = ?";
		return jTemplate.queryForObject(sql, new RowMapper<User>() {
			//根據id呼叫mapRow遍歷ResultSet,把遍歷結果需要手動封裝到User裡面
			public User mapRow(ResultSet resultSet, int arg1) throws SQLException {
				User user = new User();
				user.setId(resultSet.getInt("id"));
				user.setName(resultSet.getString("name"));
				return user;
			}}, id);
	}

	public Integer findTotalNumber() {
		String sql = "select count(*) from user";
		Integer totalNumber = jTemplate.queryForObject(sql, Integer.class);
		return totalNumber;
	}

	public List<User> findAll() {
		String sql = "select * from user";
		List<User> list = jTemplate.query(sql, new RowMapper<User>() {
			//根據id呼叫mapRow遍歷ResultSet,把遍歷結果需要手動封裝到User裡面
			public User mapRow(ResultSet resultSet, int arg1) throws SQLException {
				User user = new User();
				user.setId(resultSet.getInt("id"));
				user.setName(resultSet.getString("name"));
				return user;
			}});
		return list;
	}

	public JdbcTemplate getjTemplate() {
		return jTemplate;
	}

	public void setjTemplate(JdbcTemplate jTemplate) {
		this.jTemplate = jTemplate;
	}
}


分析:需要c3p0連線池,然後才能用JDBCTemplate,然後才能用UserDaoImpl的增刪改查方法,所以需要把這三個類交給spring管理。

<?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: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/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="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>
	<!-- 2.把JDBCTemplate注入到spring容器 -->
	<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 3.把UserDaoImpl注入到spring容器 -->
	<bean name="userDaoImpl" class="cn.ccnuacmhdu.JDBCTemplate.UserDaoImpl">
		<property name="jTemplate" ref="jdbcTemplate"></property>
	</bean>

</beans>
package cn.ccnuacmhdu.JDBCTemplate;

import java.beans.PropertyVetoException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import cn.ccnuacmhdu.bean.User;

public class Demo {

	@Test
	public void fun() throws PropertyVetoException {
		//1.準備連線池
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		dataSource.setJdbcUrl("jdbc:mysql:///test");
		dataSource.setUser("root");
		dataSource.setPassword("123456");
		//2.建立JDBCTemplate物件
		JdbcTemplate jTemplate = new JdbcTemplate();
		jTemplate.setDataSource(dataSource);
		//3.書寫sql語句
		String sql = "insert into user values(null,'Tom')";
		//4.執行
		jTemplate.update(sql);
	}
	
	@Test
	public void fun2() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		User user = new User();
		user.setName("aaaaaa");
		userDao.add(user);
	}
	@Test
	public void fun3() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		User user = new User();
		user.setId(2);
		user.setName("bbbb");
		userDao.update(user);
	}
	@Test
	public void fun4() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		userDao.delete(2);
	}
	@Test
	public void fun5() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		User user = userDao.findById(1);
		System.out.println(user);
	}
	@Test
	public void fun6() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		System.out.println(userDao.findTotalNumber());
	}
	@Test
	public void fun7() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
		System.out.println(userDao.findAll());
	}
}

在這裡插入圖片描述

讀取properties

由於應用連線的資料庫常常變化,所以單獨把連線資料庫的資訊摘取出來,做成一個properties檔案,方便修改資訊。

db.properties

jdbc.driverClass:com.mysql.jdbc.Driver
jdbc.jdbcUrl:jdbc:mysql:///test
jdbc.user:root
jdbc.password:123456

加上jdbc字首,防止鍵和工程中的其他物件重名。。。

需要先匯入context約束及名字空間!!!然後如下修改配置檔案:
在這裡插入圖片描述

點我原始碼下載