SpringJdbc访问数据库

来源:互联网 发布:黑镜第一季第二集 知乎 编辑:程序博客网 时间:2024/06/06 18:34

SpringJdbc

(1)SpringJdbc是什么?

是spring框架中的一个模块,对jdbc api做了封装,简化了 jdbc的代码(比如,不用考虑获取连接与关闭连接了)

(2)编程步骤

step1. 导包。

step2. 添加spring配置文件。
step3. 添加JdbcTemplate配置。

注:JdbcTemplate对jdbc的api做了封装。
step4. 调用JdbcTemplate提供的方法。
注:通常将JdbcTemplate注入到DAO。

利用springJdbc访问数据库--插入 删除 修改 查询 --代码如下:

spring配置文件

<!-- 组件扫描 --><context:component-scan base-package="dao"/><!-- db.properties --><util:properties id="config" location="classpath:db.properties" /><!-- 连接池 --><bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">  <property name="driverClassName" value="#{config.driver}"/>  <property name="url" value="#{config.url}"/>  <property name="username" value="#{config.username}"></property>  <property name="password" value="#{config.password}"></property></bean><!-- JdbcTemplate利用jdbc访问数据库 --><bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">  <property name="dataSource" ref="ds"></property></bean>

DAO:

package dao;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import javax.annotation.Resource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import entity.Emp;@Repository("empDAO")public class EmpDAO {@Resource(name="jt")private JdbcTemplate template;//插入一条记录//连接的获取、关闭、异常的处理、statement都不用写public void save(Emp emp){String sql = "INSERT INTO wq VALUES (wq_seq.nextval,?,?)";//对象数组用于给?赋值Object[] args = new Object[]{emp.getName(),emp.getAge()};template.update(sql, args);}//查找所有public List<Emp> findAll(){List<Emp> list = new ArrayList<Emp>();String sql = "SELECT id,name,age FROM wq ORDER BY id";list = template.query(sql, new EmpRowMapper());return list;}//内部类,此类需要实现接口RowMapper//告诉JdbcTemplate如何将ResultSet中的一条记录转换为实体对象class EmpRowMapper implements RowMapper<Emp>{//rs:要处理的结果集     //index:当前正在处理的记录的下标(从0开始)public Emp mapRow(ResultSet rs, int index) throws SQLException {Emp emp = new Emp();emp.setId(rs.getInt("id"));emp.setName(rs.getString("name"));emp.setAge(rs.getDouble("age"));return emp;}}//根据id查询记录(查询单条记录)public Emp findById(int id){Emp emp = null;String sql = "SELECT * FROM wq WHERE id=?";Object[] obj = new Object[]{id};//找不到时候会抛异常,可以try{}catch()返回nullemp = template.queryForObject(sql, obj, new EmpRowMapper());return emp;}//根据id查询记录(查询单条记录)-方法二public Emp findById2(int id){String sql = "SELECT * FROM wq WHERE id=?";Object[] obj = new Object[]{id};List<Emp> list = template.query(sql, obj,new EmpRowMapper());if(list != null && list.size()>0){return list.get(0);}return null;}//修改某条数据public void modify(Emp emp){String sql = "UPDATE wq SET name=?,age=? WHERE id=?";Object[] obj = new Object[]{emp.getName(),emp.getAge(),emp.getId()};template.update(sql, obj);}//删除某条记录public void delete(int id){String sql = "DELETE FROM wq WHERE id=?";Object[] obj = new Object[]{id};template.update(sql, obj);}}
测试代码:

package test;import java.util.List;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import dao.EmpDAO;import entity.Emp;public class TestCase {private EmpDAO dao;@Beforepublic void init(){ApplicationContext ac = new ClassPathXmlApplicationContext("springmvc.xml");dao = ac.getBean("empDAO",EmpDAO.class);}@Test//测试插入一条记录public void test1(){//构造一个员工对象Emp emp = new Emp();emp.setName("Han Mei");emp.setAge(new Double(19));dao.save(emp);}@Test//测试查询所有public void test2(){List<Emp> list = dao.findAll();for(Emp e : list){System.out.println(e);}}@Test//根据id查询--此方法若找不到数据则会抛出异常public void test3(){Emp emp = dao.findById(11);System.out.println(emp);}@Test//根据id查询--此方法若找不到数据则返回nullpublic void test4(){Emp emp = dao.findById2(11);System.out.println(emp);}@Test//修改某条数据public void test5(){Emp emp = dao.findById2(3);//找出一个Empemp.setAge(emp.getAge()*2);//年龄翻倍dao.modify(emp);}@Testpublic void test6(){dao.delete(3);}}

示例演示-登录-使用spring-jdbc实现:

spring配置文件略

package com.tarena.netctoss.dao;import com.tarena.netctoss.entity.Admin;/** * 持久层接口 */public interface AdminDAO {public Admin findByAdminCode(String adminCode);}
持久层的实现类:

package com.tarena.netctoss.dao;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import javax.annotation.Resource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import com.tarena.netctoss.entity.Admin;/** * 利用JdbcTemplate实现持久层  */@Repository("JdbcadminDAO")public class AdminDAOJbcpTemplate implements AdminDAO {    @Resource(name="jt")private JdbcTemplate template;    @Overridepublic Admin findByAdminCode(String adminCode) {String sql = "SELECT * FROM admin_info WHERE admin_code=?";Object[] obj = new Object[]{adminCode};List<Admin> list = template.query(sql, obj,new AdminRowMapper());if(list != null && list.size()>0){return list.get(0);}return null;}//内部类class AdminRowMapper implements RowMapper<Admin>{@Overridepublic Admin mapRow(ResultSet rs, int rowNum) throws SQLException {Admin admin = new Admin();admin.setAdminId(rs.getInt("admin_id"));admin.setAdminCode(rs.getString("admin_code"));admin.setPassword(rs.getString("password"));admin.setName(rs.getString("name"));admin.setTelephone(rs.getString("telephone"));admin.setEmail(rs.getString("email"));admin.setEnrolldate(rs.getTimestamp("enrolldate"));return admin;}}}
测试代码:

package test1;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.tarena.netctoss.dao.AdminDAO;import com.tarena.netctoss.entity.Admin;public class TestCase {private AdminDAO dao;@Beforepublic void init(){ApplicationContext ac = new ClassPathXmlApplicationContext("springmvc.xml");dao = ac.getBean("JdbcadminDAO",AdminDAO.class); }//测试获取Admin@Testpublic void test1(){Admin admin = dao.findByAdminCode("caocao");System.out.println(admin);}}

在service层中注入该DAO

@Resource(name="JdbcadminDAO")//利用spring-jdbc实现