一、SpringJdbc是什么?
Spring框架对jdbc的封装(模板方法)。
注:JdbcTemplate把一些重复性的代码(比如获取连接,关闭) 连接,异常处理等等都写好了),我们只需要调用该对象的 方法就可以很方便的访问数据库。
二、编程步骤
1、导入相关依赖
<dependencies>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<!--spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<!--ojdbc-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<!--DBCP-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
2、配置JdbcTemplate
step1.读取properties文件中的数据库连接参数
step2.配置DBCP连接池
step3.配置JDBCTemplate,注入数据源
step3.配置组件扫描
<!--读取db.properties文件-->
<util:properties id="config" location="classpath:db.properties"></util:properties>
<!--配置DBCP连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="#{config.driverClass}"></property>
<property name="url" value="#{config.url}"></property>
<property name="username" value="#{config.username}"></property>
<property name="password" value="#{config.password}"></property>
<property name="initialSize" value="#{config.initialSize}"></property>
<property name="maxActive" value="#{config.maxActive}"></property>
</bean>
<!--配置JDBCTemplate-->
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入连接池-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置组件扫描-->
<context:component-scan base-package="dao"></context:component-scan>
3、创建数据库和实体类,调用JdbcTemplate的方法来访问数据库。
注:通常将JdbcTemplate注入到DAO。
@Repository(value = "empDAO")
public class EmpDAOImpl implements EmpDAO{
@Resource(name = "jt")
private JdbcTemplate jdbcTemplate;
/**
* 新增一名员工
* @param e
* @return
*/
public int saveEmp(Emp e) {
String dml = "insert into emp_demo(id,name,age) values(seq_emp_id.nextval,?,?)";
//该Object数组为占位符‘?’赋值
Object[] args = new Object[]{e.getName(),e.getAge()};
//调用JdbcTemplate的方法执行SQL语句
int row = jdbcTemplate.update(dml, args);
return row;
}
/**
* 查询所有员工
* @return
*/
public List<Emp> findAll() {
List<Emp> emps = new ArrayList<Emp>();
String dql = "select * from emp_demo";
emps = jdbcTemplate.query(dql, new EmpRowMapper());
return emps;
}
/*
*spring中的RowMapper可以将数据中的每一行数据封装成用户定义的类.
*告诉JdbcTemplate,如何将一条记录转换成一个实体对象。
* resultSet:要处理的结果集
* rowNum:正在被处理的记录的下标(index,第一条记录的下标为0)
*/
class EmpRowMapper implements RowMapper<Emp>{
public Emp mapRow(ResultSet resultSet, int i) throws SQLException {
Emp emp = new Emp();
emp.setId(resultSet.getInt("id"));
emp.setName(resultSet.getString("name"));
emp.setAge(resultSet.getInt("age"));
return emp;
}
}
/**
* 根据id查询员工
* @param id
* @return
*/
public Emp findEmpById(Integer id){
Emp emp = null;
String dql = "select * from emp_demo where id=?";
Object[] param = new Object[]{id};
//查询不到数据会抛出异常
//emp = jdbcTemplate.queryForObject(dql, param, new EmpRowMapper());
//改为使用jdbcTemplate.query()方法
List<Emp> list = jdbcTemplate.query(dql, param, new EmpRowMapper());
if (list!=null && list.size()>0){
emp = list.get(0);//获取第一个元素
}
return emp;
}
/**
* 修改员工信息
* @param e
* @return
*/
public int modifyEmp(Emp e) {
String dml = "update emp_demo set name=?,age=? where id=?";
Object[] args = new Object[]{e.getName(),e.getAge(),e.getId()};
int update = jdbcTemplate.update(dml, args);
return update;
}
/**
* 根据Id删除员工
* @param id
* @return
*/
public int deleteEmpById(Integer id) {
String dml = "delete from emp_demo where id=?";
Object[] param = new Object[]{id};
int update = jdbcTemplate.update(dml, param);
return update;
}
}
4、测试代码
public class EmpDAOTest {
private ApplicationContext ac;
private EmpDAO dao;
@Before
public void init(){
System.out.println("init()");
ac = new ClassPathXmlApplicationContext("springmvc.xml");
dao = ac.getBean("empDAO", EmpDAO.class);
}
//测试saveEmp方法
@Test
public void test1(){
Emp emp = new Emp();
emp.setName("hjh");
emp.setAge(25);
int i = dao.saveEmp(emp);
System.out.println("受影响的记录数:"+i);
}
//测试findAll方法
@Test
public void test2(){
List<Emp> emps = dao.findAll();
if (emps==null || emps.size()==0) return;
for (Emp e:emps){
System.out.println(e);
}
}
//测试findEmpById方法
@Test
public void test3(){
Emp emp = dao.findEmpById(10004);
System.out.println(emp);
}
//测试modifyEmp方法
@Test
public void test4(){
Emp emp = new Emp();
emp.setName("张三");
emp.setAge(27);
emp.setId(10004);
int i = dao.modifyEmp(emp);
System.out.println("受影响的记录数:"+i);
}
//测试deleteEmpById方法
@Test
public void test5(){
int id = 10004;
int i = dao.deleteEmpById(id);
System.out.println("受影响的记录数:"+i);
}
}