(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));
}
}