1 前期准备
Spring整合JDBC的案例, 在整合之前需要做一些前期准备, 需要下载一些Spring JDBC所依赖的一些类库
打开pom.xml, 在其中添加如下依赖
<dependencys>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-oracle</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
</dependencys>
在pom.xml目录下打开cmd, 执行命令:
mvn dependency:copy-dependencies -DoutputDirectory=lib
这样就可以下载到Spring Data Access所需要的类库
此外, 还需要第三方依赖类库 commons-dbcp-1.3.jar 和 commons-pool-1.6.jar
这个可以前往 www.apache.org官网下载
注意:
一开始没注意, 下载了最新的版本, 后来进过折腾发现Spring不支持最新的版本,
所以就下载之前的版本也就是现在的版本, 测试才通过
2 配置数据源(DataSource)
在beans.xml中配置如下代码:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
其中class为commons-dbcp中的BasicDataSource,
其中的属性配置是根据JDBC中的属性来进行配置, 比如diverClassName, url, username, password 这些都是与JDBC对应的,具体其他属性的配置可以查看docs文档
当然这里也可以将属性保存在properties文件中
这里在类路径新建一个jdbc.properties文件并且将添加各个属性值
如:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/test
jdbc.username=root
jdbc.password=123456
这里属性名按照Spring官方文档命名方式: jdbc.xxx
之前试过不加”jdbc.”, 直接命名为xxx,然后到引用username(也就引用这个值出现问题)的时候就出现问题了,
不能正确连接到用户名为指定为username的MySQL数据库, 具体问题现在还不知道是什么导致的, 知道的朋友可以留言给我, 在此先谢过了
然后在xml中可以这样配置
<!-- 这里是指定properties文件所在位置 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<!-- 引用properties中的值的方式类似el表达式 -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
其他的和之前配置一样
3 配置事务
(以注释的方式)
在xml中添加如下代码:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
这里由于用到了tx标签, 所以在这之前需要添加tx命名空间配置,
代码如下:
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
这样就配置好数据源和事务
4 编写测试例子
下面通过一个小示例来展示配置成果
1) Bean
package com.wenj.bean;
public class Person {
private Integer id;
private String name;
public Person(){ }
public Person(String name){
this.name = 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;
}
}
2) DAO层
DAO接口
package com.wenj.dao;
import java.util.List;
import com.wenj.bean.Person;
public interface PersonDAO {
/**
* 保存person
* @param person
*/
public void savePerson(Person person);
/**
* 更新person
* @param person
*/
public void updataPerson(Person person);
/**
* 删除指定id的person
* @param personId
*/
public void deletePersonByID(Integer personId);
/**
* 删除指定name的person
* @param personName
*/
public void deletePersonByName(String personName);
/**
* 获取指定id的person
* @param personId
* @return
*/
public Person getPersonByID(Integer personId);
/**
* 获取指定name的person
* @param personName
* @return
*/
public Person getPersonByName(String personName);
/**
* 获取所有person的信息
* @return
*/
public List<Person> getPerson();
}
DAO实现层
package com.wenj.dao.impl;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.wenj.bean.Person;
import com.wenj.dao.PersonDAO;
@Transactional
public class PersonDAOImpl implements PersonDAO {
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void savePerson(Person person) {
// TODO Auto-generated method stub
String sql = "insert into person(name) values(?)";
jdbcTemplate.update(sql, new Object[] { person.getName() },
new int[] { java.sql.Types.VARCHAR });
System.out.println("Save Person SUCCESS");
}
@Override
public void updataPerson(Person person) {
// TODO Auto-generated method stub
String sql = "update person set name = ? where id = ?";
jdbcTemplate.update(sql,
new Object[] { person.getName(), person.getId() }, new int[] {
java.sql.Types.VARCHAR, java.sql.Types.INTEGER });
}
@Override
public void deletePersonByID(Integer personId) {
// TODO Auto-generated method stub
String sql = "delete from person where id = ?";
jdbcTemplate.update(sql, new Object[] { personId },
new int[] { java.sql.Types.INTEGER });
}
@Override
public void deletePersonByName(String personName) {
// TODO Auto-generated method stub
String sql = "delete from person where name = ?";
jdbcTemplate.update(sql, new Object[] { personName },
new int[] { java.sql.Types.VARCHAR });
}
@Override
public Person getPersonByID(Integer personId) {
// TODO Auto-generated method stub
String sql = "select * from person where id = ?";
return (Person) jdbcTemplate.queryForObject(sql, new Object[] { personId },
new int[] { java.sql.Types.INTEGER }, new PersonRowMapper());
//这里用到了RowMapper, 需要写一个类实现RowMapper接口
}
@Override
public Person getPersonByName(String personName) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Person> getPerson() {
// TODO Auto-generated method stub
String sql = "select * from person";
return ((List<Person>)jdbcTemplate.query(sql, new PersonRowMapper()));
}
}
//PersonRowMapper类实现RowMapper接口
package com.wenj.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.wenj.bean.Person;
public class PersonRowMapper implements RowMapper<Person> {
@Override//回调获取rs结果集内容
public Person mapRow(ResultSet rs, int index) throws SQLException {
// TODO Auto-generated method stub
Person person = new Person(rs.getString("name"));
person.setId(rs.getInt("id"));
return person;
}
}
在xml中配置相关测试Bean
如下:
<bean id="personDAO" class="com.wenj.dao.impl.PersonDAOImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="person" class="com.wenj.bean.Person">
<property name="name" value="userName"/>
</bean>
3) 单元测试
最后新建一个jUnit4的Test case, 在测试例子中添加如下测试代码
@Test
public void testSpringJDBC(){
ApplicationContext cxt = new ClassPathXmlApplicationContext("com/wenj/resources/beans.xml");
Person person = (Person)cxt.getBean("person");
PersonDAO personDAO = (PersonDAO)cxt.getBean("personDAO");
personDAO.savePerson(person);
}
这时控制台会输出如下语句
Save Person SUCCESS
然后登陆MySQL数据库发现, person表中出现了我们保存的person信息
至此, Spring JDBC整合成功