JDBC 框架概述
在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
所以当从数据库中获取数据时,你所做的是定义连接参数,指定要执行的 SQL 语句,每次迭代完成所需的工作。
Spring JDBC 提供几种方法和数据库中相应的不同的类与接口。我将给出使用 JdbcTemplate 类框架的经典和最受欢迎的方法。这是管理所有数据库通信和异常处理的*框架类。
JdbcTemplate 类
JdbcTemplate 类执行 SQL 查询、更新语句和存储过程调用,执行迭代结果集和提取返回参数值。它也捕获 JDBC 异常并转换它们到 org.springframework.dao 包中定义的通用类、更多的信息、异常层次结构。
JdbcTemplate 类的实例是线程安全配置的。所以你可以配置 JdbcTemplate 的单个实例,然后将这个共享的引用安全地注入到多个 DAOs 中。
使用 JdbcTemplate 类时常见的做法是在你的 Spring 配置文件中配置数据源,然后共享数据源 bean 依赖注入到 DAO 类中,并在数据源的设值函数中创建了 JdbcTemplate。
环境:导入: mysql-connector-java.jar,org.springframework.jdbc.jar这两个包
1.创建数据访问对象接口文件 StudentDAO.java 的内容:
1 package com.spring.jdbcTemplate; 2 3 import java.util.List; 4 5 import javax.sql.DataSource; 6 /** 7 * 接口StudentDao,是用来封装查询方法 8 * @author Administrator 9 * 10 */ 11 12 public interface StudentDao { 13 14 public void setDataSource(DataSource ds); 15 //添加记录 16 public void addStudent(String name,Integer age); 17 //通过Student ID查询学生记录,返回值为Student类型 18 public Student getStudentId(Integer id); 19 //删除数据通过Student ID 20 public void delectStudent(Integer id); 21 //更新数据 22 public void updata(Integer id,Integer age); 23 //查询所有数据 24 public List<Student> SelectAllStudent(); 25 }
2.创建一个实体类Student:
1 package com.spring.jdbcTemplate; 2 3 public class Student { 4 /** 5 * 定义学生类 6 */ 7 private String name; 8 private Integer age; 9 private Integer id; 10 11 public Integer getId() { 12 return id; 13 } 14 15 public void setId(Integer id) { 16 this.id = id; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public Integer getAge() { 28 return age; 29 } 30 31 public void setAge(Integer age) { 32 this.age = age; 33 } 34 35 public void printAdvice() { 36 System.out.println("name:" + name + ",age:" + age); 37 38 } 39 40 }
3.创建一个StudentMapper.java 文件,用来映射结果集(通常用于查询语句~)内容如下:
1 package com.spring.jdbcTemplate; 2 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 6 import org.springframework.jdbc.core.RowMapper; 7 8 public class StudentMapper implements RowMapper<Student>{ 9 /** 10 * 接口RowMapper被JdbcTemplate 用来映射每一行结果集的数据 11 * JdbcTemplate 用来执行query方法或者调用存储过程 包含方法mapRow(ResultSet rs, int rowNum) 12 * 第一个参数表示获取到的结果集、第二个表示结果集中获取到的结果个数,通常用于查询语句~ 13 */ 14 @Override 15 public Student mapRow(ResultSet rs, int row) throws SQLException { 16 Student student=new Student(); 17 student.setId(rs.getInt("id")); 18 student.setName(rs.getString("name")); 19 student.setAge(rs.getInt("age")); 20 return student; 21 } 22 23 }
4.下面是为定义的 DAO 接口 StudentDAO 的实现类文件 StudentJDBCTemplate.java,具体实现到数据库的操作:
1 package com.spring.jdbcTemplate; 2 3 import java.util.List; 4 5 import javax.sql.DataSource; 6 7 import org.springframework.jdbc.core.JdbcTemplate; 8 /** 9 * 利用Spring 内置jdbc JdbcTemplate来实现StudentDao接口,连接数据库。 10 * @author Administrator 11 * 12 */ 13 public class StudentJdbcTemplate implements StudentDao { 14 private DataSource dataSource; 15 private JdbcTemplate jdbcTemplateObject; 16 17 // 设置数据源 18 @Override 19 public void setDataSource(DataSource dataSource) { 20 this.dataSource = dataSource; 21 this.jdbcTemplateObject = new JdbcTemplate(dataSource); 22 } 23 24 // 添加学生数据 25 @Override 26 public void addStudent(String name, Integer age) { 27 String sql = "insert into Student(name,age) value(?,?)"; 28 jdbcTemplateObject.update(sql, name, age); 29 System.out.println("Created Record Name = " + name + " Age = " + age); 30 return; 31 } 32 33 // 查询学生 34 @Override 35 public Student getStudentId(Integer id) { 36 String sql = "select * from Student where id=?"; 37 Student student = jdbcTemplateObject.queryForObject(sql, new Object[] { id }, new StudentMapper()); 38 return student; 39 } 40 41 // 删除学生记录 42 @Override 43 public void delectStudent(Integer id) { 44 String sql = "delete from Student where id=?"; 45 jdbcTemplateObject.update(sql, id); 46 System.out.println("Deleted Record with ID = " + id); 47 return; 48 } 49 //更新数据 50 @Override 51 public void updata(Integer id,Integer age) { 52 String SQL = "update Student set age = ? where id = ?"; 53 jdbcTemplateObject.update(SQL, age, id); 54 System.out.println("Updated Record with ID = " + id); 55 return; 56 } 57 //查询所有数据 58 @Override 59 public List<Student> SelectAllStudent() { 60 String SQL = "select * from Student"; 61 List<Student> students = jdbcTemplateObject.query(SQL, new StudentMapper()); 62 return students; 63 } 64 65 66 }
5.建立一个 MainApp.java 文件,用于测试。内容如下:
1 package com.spring.jdbcTemplate; 2 3 import java.util.List; 4 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 import org.springframework.jdbc.core.JdbcTemplate; 7 8 public class MainApp { 9 10 public static void main(String[] args) { 11 ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring_xml/bean.xml"); 12 //获取getBean("StudentJdbcTemplate")对象,调用其方法操作数据库 13 StudentJdbcTemplate jdbcTemplate = (StudentJdbcTemplate)applicationContext.getBean("StudentJdbcTemplate"); 14 15 //插入数据 16 /* jdbcTemplate.addStudent("张三", 23); 17 jdbcTemplate.addStudent("李四", 24); 18 jdbcTemplate.addStudent("王五", 25); 19 jdbcTemplate.addStudent("赵六", 26); 20 jdbcTemplate.addStudent("田七", 27);*/ 21 22 //查询所有数据 23 /* List<Student> list=jdbcTemplate.SelectAllStudent(); 24 for(Student student:list){ 25 System.out.println(student.getId()+student.getName()+student.getAge()); 26 }*/ 27 //查询单条记录 28 /* Student student=jdbcTemplate.getStudentId(1); 29 System.out.println(student.getId()+student.getName()+student.getAge());*/ 30 31 //删除单条记录 32 /*jdbcTemplate.delectStudent(2);*/ 33 34 //更新数据 35 jdbcTemplate.updata(3, 45); 36 } 37 38 }
测试结果: