Spring(九)

Spring JDBC框架

  1. Spring JDBC 提供几种方法和数据库中相应的不同的类与接口
  2. JdbcTemplate 类框架是管理所有数据库通信和异常处理的中央框架类
  3. JdbcTemplate 类执行 SQL 查询、更新语句和存储过程调用,执行迭代结果集和提取返回参数值
  4. JdbcTemplate 类也捕获 JDBC 异常并转换它们到 org.springframework.dao 包中定义的通用类、更多的信息、异常层次结构。
  5. JdbcTemplate 类的实例是线程安全配置的。所以可以配置 JdbcTemplate 的单个实例,然后将这个共享的引用安全地注入到多个 DAOs 中。
  6. 使用 JdbcTemplate 类时常见的做法是再Spring配置文件中配置数据源,然后共享数据源bean依赖注入到DAO类中,并在数据源的设值函数中创建JdbcTemplate类

Spring配置数据源

  1. 在数据库 TEST 中创建一个数据库表 Student,假设正在使用 MySQL 数据库,如果使用其他数据库,那么可以改变DDL 和相应的 SQL 查询。
CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);
  1. 现在,需要提供一个数据源到 JdbcTemplate 中,所以它可以配置本身来获得数据库访问。可以在 XML 文件中配置数据源,其中一段代码如下所示:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <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="password"/>
</bean>

Spring 数据访问对象(DAO)

  1. DAO 代表常用的数据库交互的数据访问对象
  2. DAOs 提供一种方法来读取数据并将数据写入到数据库中,它们应该通过一个接口显示此功能,应用程序的其余部分将访问它们。
  3. 在 Spring 中,数据访问对象(DAO)支持很容易用统一的方法使用数据访问技术,如 JDBC、Hibernate、JPA 或者 JDO。

Spring 执行SQL语句

  1. 使用 SQL 和 jdbcTemplate 对象在数据库表中执行 CRUD(创建、读取、更新和删除)操作。
  2. 查询一个整数类型:
String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );
  1. 查询一个 long 类型:
String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );
  1. 一个使用绑定变量的简单查询:
String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{
    
    10});
  1. 查询字符串:
String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{
    
    10}, String.class);
  1. 查询并返回一个对象
String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(SQL, 
                  new Object[]{
    
    10}, new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
    
    
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}
  1. 查询并返回多个对象:
String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(SQL,
                         new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
    
    
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}
  1. 在表中插入一行:’
String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{
    
    "Zara", 11} );
  1. 更新表中的一行
String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{
    
    "Zara", 10} ); 
  1. 从表中删除一行:
String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{
    
    20} );
  1. 可以使用 jdbcTemplate 中的 execute(…) 方法来执行任何 SQL 语句或 DDL 语句
  2. 使用 CREATE 语句创建一个表的示例:
String SQL = "CREATE TABLE Student( " +
   "ID   INT NOT NULL AUTO_INCREMENT, " +
   "NAME VARCHAR(20) NOT NULL, " +
   "AGE  INT NOT NULL, " +
   "PRIMARY KEY (ID));"
jdbcTemplateObject.execute( SQL );

Spring JDBC 示例

  1. 创建一个名为 SpringExample 的项目,并在创建的项目中的 src 文件夹下创建包 com.tutorialspoint。
  2. 使用 Add External JARs 选项添加必需的 Spring 库
  3. 在项目中添加 Spring JDBC 指定的最新的库 mysql-connector-java.jar,org.springframework.jdbc.jar 和 org.springframework.transaction.jar。如果这些库不存在,可以下载它们。
  4. 创建 DAO 接口 StudentDAO 并列出所有必需的方法(可以直接编写 StudentJDBCTemplate 类)
  5. 在 com.tutorialspoint 包下创建其他的必需的 Java 类 Student,StudentMapper,StudentJDBCTemplate 和 MainApp 。
  6. 在 TEST 数据库中创建了 Student 表。MySQL 服务器运行正常,可以使用给出的用户名和密码读/写访问数据库。
  7. 在 src 文件夹下创建 Beans 配置文件 Beans.xml。

StudentDAO.java 的内容:

package com.tutorialspoint;
import java.util.List;
import javax.sql.DataSource;
public interface StudentDAO {
    
    
   
   public void setDataSource(DataSource ds);
   
   public void create(String name, Integer age);
  
   public Student getStudent(Integer id);
  
   public List<Student> listStudents();
  
   public void delete(Integer id);
 
   public void update(Integer id, Integer age);
}

** Student.java 文件的内容:**

package com.tutorialspoint;
public class Student {
    
    
   private Integer age;
   private String name;
   private Integer id;
   public void setAge(Integer age) {
    
    
      this.age = age;
   }
   public Integer getAge() {
    
    
      return age;
   }
   public void setName(String name) {
    
    
      this.name = name;
   }
   public String getName() {
    
    
      return name;
   }
   public void setId(Integer id) {
    
    
      this.id = id;
   }
   public Integer getId() {
    
    
      return id;
   }
}

StudentMapper.java 文件的内容:

package com.tutorialspoint;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class StudentMapper implements RowMapper<Student> {
    
    
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
      Student student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}

为定义的 DAO 接口 StudentDAO 的实现类文件 StudentJDBCTemplate.java

package com.tutorialspoint;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class StudentJDBCTemplate implements StudentDAO {
    
    
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject; 
   public void setDataSource(DataSource dataSource) {
    
    
      this.dataSource = dataSource;
      this.jdbcTemplateObject = new JdbcTemplate(dataSource);
   }
   public void create(String name, Integer age) {
    
    
      String SQL = "insert into Student (name, age) values (?, ?)";     
      jdbcTemplateObject.update( SQL, name, age);
      System.out.println("Created Record Name = " + name + " Age = " + age);
      return;
   }
   public Student getStudent(Integer id) {
    
    
      String SQL = "select * from Student where id = ?";
      Student student = jdbcTemplateObject.queryForObject(SQL, 
                        new Object[]{
    
    id}, new StudentMapper());
      return student;
   }
   public List<Student> listStudents() {
    
    
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, 
                                new StudentMapper());
      return students;
   }
   public void delete(Integer id){
    
    
      String SQL = "delete from Student where id = ?";
      jdbcTemplateObject.update(SQL, id);
      System.out.println("Deleted Record with ID = " + id );
      return;
   }
   public void update(Integer id, Integer age){
    
    
      String SQL = "update Student set age = ? where id = ?";
      jdbcTemplateObject.update(SQL, age, id);
      System.out.println("Updated Record with ID = " + id );
      return;
   }
}

MainApp.java 文件的内容:

package com.tutorialspoint;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tutorialspoint.StudentJDBCTemplate;
public class MainApp {
    
    
   public static void main(String[] args) {
    
    
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate = 
      (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");    
      System.out.println("------Records Creation--------" );
      studentJDBCTemplate.create("Zara", 11);
      studentJDBCTemplate.create("Nuha", 2);
      studentJDBCTemplate.create("Ayan", 15);
      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();
      for (Student record : students) {
    
    
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
      System.out.println("----Updating Record with ID = 2 -----" );
      studentJDBCTemplate.update(2, 20);
      System.out.println("----Listing Record with ID = 2 -----" );
      Student student = studentJDBCTemplate.getStudent(2);
      System.out.print("ID : " + student.getId() );
      System.out.print(", Name : " + student.getName() );
      System.out.println(", Age : " + student.getAge());      
   }
}

配置文件 Beans.xml 的内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

   <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <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="password"/>
   </bean>

   <bean id="studentJDBCTemplate" 
      class="com.tutorialspoint.StudentJDBCTemplate">
      <property name="dataSource"  ref="dataSource" />    
   </bean>

</beans>

Spring 中SQL的存储过程

  1. SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程。可以在处理任何一个关系数据库时使用这个方法
  2. Spring JDBC 应用程序,实现对Student 数据库表的创建和读取操作

Spring 中SQL的存储过程样例

  1. 创建一个名为 SpringExample 的项目,并且在所创建项目的 src 文件夹下创建一个名为 com.tutorialspoint 的包
  2. 使用 Add External JARs 选项添加所需的 Spring 库文件
  3. 在项目中添加 Spring JDBC 指定的最新的库文件 mysql-connector-java.jar, org.springframework.jdbc.jar 和 org.springframework.transaction.jar。
  4. 创建 DAO 接口 StudentDAO 并且列出所有需要的方法
  5. 在 com.tutorialspoint 包下创建其他所需要的 Java 类 Student, StudentMapper, StudentJDBCTemplate 和 MainApp。
  6. 确保你已经在 TEST 数据库中创建了 Student 表。 MySQL 服务器是正常工作的,
  7. 在 src 文件夹下创建 Beans 配置文件 Beans.xml。

数据访问对象接口文件 StudentDAO.java 的内容

package com.tutorialspoint;
import java.util.List;
import javax.sql.DataSource;
public interface StudentDAO {
    
    
   public void setDataSource(DataSource ds);

   public void create(String name, Integer age);
 
   public Student getStudent(Integer id);
  
   public List<Student> listStudents();
}

Student.java 文件的内容:

package com.tutorialspoint;
public class Student {
    
    
   private Integer age;
   private String name;
   private Integer id;
   public void setAge(Integer age) {
    
    
      this.age = age;
   }
   public Integer getAge() {
    
    
      return age;
   }
   public void setName(String name) {
    
    
      this.name = name;
   }
   public String getName() {
    
    
      return name;
   }
   public void setId(Integer id) {
    
    
      this.id = id;
   }
   public Integer getId() {
    
    
      return id;
   }
}

StudentMapper.java 文件的内容:

扫描二维码关注公众号,回复: 13418450 查看本文章
package com.tutorialspoint;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class StudentMapper implements RowMapper<Student> {
    
    
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
      Student student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}

实现类文件 StudentJDBCTemplate.java,定义了 DAO 接口 StudentDAO:

package com.tutorialspoint;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
public class StudentJDBCTemplate implements StudentDAO {
    
    
   private DataSource dataSource;
   private SimpleJdbcCall jdbcCall;
   public void setDataSource(DataSource dataSource) {
    
    
      this.dataSource = dataSource;
      this.jdbcCall =  new SimpleJdbcCall(dataSource).
                       withProcedureName("getRecord");
   }
   public void create(String name, Integer age) {
    
    
      JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
      String SQL = "insert into Student (name, age) values (?, ?)";
      jdbcTemplateObject.update( SQL, name, age);
      System.out.println("Created Record Name = " + name + " Age = " + age);
      return;
   }
   public Student getStudent(Integer id) {
    
    
      SqlParameterSource in = new MapSqlParameterSource().
                              addValue("in_id", id);
      Map<String, Object> out = jdbcCall.execute(in);
      Student student = new Student();
      student.setId(id);
      student.setName((String) out.get("out_name"));
      student.setAge((Integer) out.get("out_age"));
      return student;
   }
   public List<Student> listStudents() {
    
    
      String SQL = "select * from Student";    
      List <Student> students = jdbcTemplateObject.query(SQL,new StudentMapper());
      return students;
   }
}

** MainApp.java,如下所示**

package com.tutorialspoint;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tutorialspoint.StudentJDBCTemplate;
public class MainApp {
    
    
   public static void main(String[] args) {
    
    
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate = 
      (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");     
      System.out.println("------Records Creation--------" );
      studentJDBCTemplate.create("Zara", 11);
      studentJDBCTemplate.create("Nuha", 2);
      studentJDBCTemplate.create("Ayan", 15);
      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();
      for (Student record : students) {
    
    
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
      System.out.println("----Listing Record with ID = 2 -----" );
      Student student = studentJDBCTemplate.getStudent(2);
      System.out.print("ID : " + student.getId() );
      System.out.print(", Name : " + student.getName() );
      System.out.println(", Age : " + student.getAge());      
   }
}

配置文件 Beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

   <!-- Initialization for data source -->
   <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <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="password"/>
   </bean>

   <!-- Definition for studentJDBCTemplate bean -->
   <bean id="studentJDBCTemplate" 
      class="com.tutorialspoint.StudentJDBCTemplate">
      <property name="dataSource"  ref="dataSource" />    
   </bean>

</beans>

猜你喜欢

转载自blog.csdn.net/qq_43408367/article/details/120836326