Spring框架自学之路(八)

(08Day)

    前面我们说了spring的AOP,那么spring对JDBC的操作是怎么样的呢?今天我们就来大致的看一看spring中JDBC的操作。

    首先先加入我们这次工程需要加入的jar包,分别为spring的jar包,C3P0jar包,和mysql的驱动。具体如下:

    

    随后我们先来配置下连接的基本信息

    采用外部属性文件的方法来配置数据源,这样做的好处是以后要更新数据源就只需要修改外部属性文件,而不用修改spring的配置文件,外部属性文件如下配置,具体使用外部属性文件的方法在前边spring框架自学之路(三)中有详细的介绍。


    

    配置完外部属性文件后,在spring配置文件中添加导入外部资源文件和配置C3P0数据源

	<!-- 导入资源文件-->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 配置c3p0数据源 -->
	<bean id="dataSource" 
	class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
	</bean>

    基本工作的做好了,那么我们来看看spring是如何使用jdbc对数据进行操作的呢?接下来就用实际的代码来说明

    首先我们先创建需要用到的数据库和实体类

    表名为User里边有以下这些数据

    

    实体User:
package com.SpringJDBC;

public class User {
	private int userId;
	private String userName;
	private String loginName;
	private String loginPwd;
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getLoginName() {
		return loginName;
	}
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
	public String getLoginPwd() {
		return loginPwd;
	}
	public void setLoginPwd(String loginPwd) {
		this.loginPwd = loginPwd;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName
				+ ", loginName=" + loginName + ", loginPwd=" + loginPwd + "]";
	}
	public User(int userId, String userName, String loginName, String loginPwd) {
		super();
		this.userId = userId;
		this.userName = userName;
		this.loginName = loginName;
		this.loginPwd = loginPwd;
	}
	public User() {
		super();
	}
	
}

    UserDao:

package com.SpringJDBC;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	public User get(int id){
		String sql = "SELECT UserId,User_Name userName,LoginName,LoginPwd FROM USER WHERE UserId = ?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		User user = jdbcTemplate.queryForObject(sql,rowMapper,id);
		return user;
	}
}

    接下来具体对数据库的操作我使用junit4来进行测试,具体代码和说明如下:

package com.SpringJDBC;

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

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

public class JDBCTest {
	private ApplicationContext ctx = null;
	private JdbcTemplate jdbcTemplate = null;
	private UserDao userdao = new UserDao();
	{
		ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
	}
	/**
	 * 测试c3p0连接是否成功
	 * @throws SQLException
	 */
	@Test
	public void testDataSource() throws SQLException {
		DataSource dataSource = ctx.getBean(DataSource.class);
		System.out.println(dataSource.getConnection());
	}
	/*
	 * Template的update可以执行insert,update,Delete方法
	 * */
	@Test
	public void testUpdate(){
		String sql = "UPDATE USER SET LoginName = ? WHERE USERID = ?";
		jdbcTemplate.update(sql,"qwer",1);
	}
	
	/**
	 * 批量更新:批量的INSERT,UPDATE,DELETE
	 * batchUpdate中第二个参数是为一个装有Object数组的集合,因为修改一个数据需要一个Object数组,那么多个
	 * 数据不就需要一个装有Object数组的集合了吗。
	 */
	@Test
	public void testBatchUpdate(){
		String sql = "INSERT INTO USER (User_Name,LoginName,LoginPwd) VALUES(?,?,?)";
		List<Object[]> batchArgs = new ArrayList<Object[]>();
		batchArgs.add(new Object[]{"aaa","laaa","paa"});
		batchArgs.add(new Object[]{"bbb","lbbb","pbb"});
		batchArgs.add(new Object[]{"ccc","lccc","pcc"});
		jdbcTemplate.batchUpdate(sql, batchArgs);
	}
	/**
	 * 从数据库中获取一条记录,实际得到一个对象
	 * 注意不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法!
	 * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
	 * 1.其中的RowMapper指定如何去映射结果集的行(怎么映射到对象中),常用的实现类为BeanPropertyRowMapper
	 * 2.可以通过使用SQL中列的别名去通过,完成列名和属性名的映射
	 * 3.既然这样也许我们会想到,那内部类怎么办,也就是一张表需要用到另一张表的数据,两个是不同的实体类,那这样要怎么
	 * 弄呢,其实在jdbcTemplate中是不可以获得的,因为jdbcTemplate到底是一个JDBC的小工具,而不是ORM框架。
	 */
	@Test
	public void testQueryForObject(){
		String sql = "SELECT UserId,User_Name userName,LoginName,LoginPwd FROM USER WHERE UserId = ?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		User user =jdbcTemplate.queryForObject(sql, rowMapper,5);
		System.out.println(user);
	}
	
	/**
	 * 查询实体集
	 * 注意调用的不是queryForList 方法
	 */
	@Test
	public void testQueryForList(){
		String sql = "SELECT * FROM USER ";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		List<User> users =  jdbcTemplate.query(sql, rowMapper);
		System.out.println(users);
	}
	/**
	 * 获取单个列的值或做统计查询
	 * 使用queryForObject(String sql, Class<Long> requiredType) 
	 */
	@Test
	public void testQueryForObject2(){
		String sql = "SELECT count(UserId) FROM User";
		long count = jdbcTemplate.queryForObject(sql,Long.class);
		System.out.println(count);
	}
	@Test
	public void testUserDao(){
		System.out.println(userdao.get(2));
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38166944/article/details/79941589