Spring JDBC概述

1、jdbc 概述

  Spring JDBC是Spring框架的持久层子框架。用于对数据库的操作(增删改查)。

  而JdbcTemplate它是spring jdbc子框架中提供的一个操作类,用于对原始Jdbc API对象的简单封装。

2、JdbcTemplate 的创建 

  我们如何创建一个JdbcTemplate对象呢?不妨,我们通过简单分析一下JdbcTemplate的源码,从而理解创建一个JdbcTemplate对象需要声明前提条件。

  源码如下:

 1 public JdbcTemplate() {
 2     }
 3 
 4     /**
 5      * Construct a new JdbcTemplate, given a DataSource to obtain connections from.
 6      * <p>Note: This will not trigger initialization of the exception translator.
 7      * @param dataSource the JDBC DataSource to obtain connections from
 8      */
 9     public JdbcTemplate(DataSource dataSource) {
10         setDataSource(dataSource);
11         afterPropertiesSet();
12     }
13 
14     /**
15      * Construct a new JdbcTemplate, given a DataSource to obtain connections from.
16      * <p>Note: Depending on the "lazyInit" flag, initialization of the exception translator
17      * will be triggered.
18      * @param dataSource the JDBC DataSource to obtain connections from
19      * @param lazyInit whether to lazily initialize the SQLExceptionTranslator
20      */
21     public JdbcTemplate(DataSource dataSource, boolean lazyInit) {
22         setDataSource(dataSource);
23         setLazyInit(lazyInit);
24         afterPropertiesSet();
25     }

  通过这段代码我们可以理解,创建一个JdbcTemplate对象,需要一个获得数据库连接的的数据源。就类似于我们以前学习JDBC技术的时候,获得操作对象Statement对象,必须要有数据库连接一样!!所以要创建JdbcTemplate对象,必须学会在Spring里面配置数据源。

3、Spring 配置数据源

① 环境搭建

  第一步:导入包

  

   第二步:配置文件准备

<?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-4.2.xsd">
  

</beans>

  第三步:配置数据源

  市面上主流的连接池有两个。一个是C3P0,一个是DBCP。要想使用这两数据源都需要导入对应的jar包。 

  问题:我们原来使用数据库连接Connection就可以连接数据库了,但是为什么需要使用DataSource来获取数据库连接呢?

  答:因为使用Connection获得数据库连接,每次操作都需要打开和关闭数据库,效率不高!

  使用DataSource来获得数据库连接,涉及一个概念连接池!!!所以使用数据源的概念可以整合连接池!!市场上主流的连接池有:DBCP,C3P0.

  配置C3P0数据源

  导入 c3p0的jar包到工程的lib目录。在spring的配置文件中配置:

<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql:///spring_day04"></property>
    <property name="user" value="root"></property>
    <property name="password" value="1234"></property>
</bean>

  

  配置DBCP数据源:

  导入 commons-dbcp2-2.1.1.jar 和 commons-pool2-2.4.2.jar 到工程的 lib 目录。在 spring 的配置文件中配置:

<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:// /spring_day04"></property>
    <property name="username" value="root"></property>
    <property name="password" value="1234"></property>
</bean>

  配置 spring jdbc 内置数据源:

  

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:///spring_day04"></property>
    <property name="username" value="root"></property>
    <property name="password" value="1234"></property>
</bean>

4、JdbcTemoplate 的增删改查操作

  注意:测试要导入spring-test-4.2.9.RELEASE.jar包

  配置文件:

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

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/sms"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
    
    <!-- 配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <!-- 配置指定连接池 -->
      <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

  实体类:

 1 package com.sxt.entity;
 2 
 3 public class Student {
 4     
 5     private Long stuId;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学生编号',
 6     private String stuName;//VARCHAR(50) NULL DEFAULT NULL COMMENT '学生名字',
 7     private String stuAge;//INT(11) NULL DEFAULT NULL COMMENT '学生年龄',
 8     private String stuPassword;//VARCHAR(50) NULL DEFAULT NULL COMMENT '登录密码',
 9     public Long getStuId() {
10         return stuId;
11     }
12     public void setStuId(Long stuId) {
13         this.stuId = stuId;
14     }
15     public String getStuName() {
16         return stuName;
17     }
18     public void setStuName(String stuName) {
19         this.stuName = stuName;
20     }
21     public String getStuAge() {
22         return stuAge;
23     }
24     public void setStuAge(String stuAge) {
25         this.stuAge = stuAge;
26     }
27     public String getStuPassword() {
28         return stuPassword;
29     }
30     public void setStuPassword(String stuPassword) {
31         this.stuPassword = stuPassword;
32     }
33 }

  实现代码:

  1 package com.sxt.test;
  2 
  3 import java.sql.ResultSet;
  4 import java.sql.SQLException;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 import java.util.Map;
  8 
  9 import javax.sql.DataSource;
 10 
 11 import org.junit.Test;
 12 import org.junit.runner.RunWith;
 13 import org.springframework.beans.factory.annotation.Autowired;
 14 import org.springframework.dao.DataAccessException;
 15 import org.springframework.jdbc.core.JdbcTemplate;
 16 import org.springframework.jdbc.core.ResultSetExtractor;
 17 import org.springframework.test.context.ContextConfiguration;
 18 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 19 
 20 import com.sxt.entity.Student;
 21 
 22 @RunWith(value = SpringJUnit4ClassRunner.class)
 23 @ContextConfiguration(locations = "classpath:bean.xml")
 24 public class JdbcTemplateTest {
 25 
 26     @Autowired
 27     private DataSource datasource;
 28     @Autowired
 29     private JdbcTemplate jdbctemplate;
 30 
 31     /**
 32      * 测试数据源是否成功
 33      */
 34     @Test
 35     public void dataSource() {
 36         try {
 37             System.out.println(datasource.getConnection());
 38         } catch (SQLException e) {
 39             // TODO Auto-generated catch block
 40             e.printStackTrace();
 41         }
 42     }
 43 
 44     /**
 45      * 测试jdbctemplate对象是否成功
 46      */
 47     @Test
 48     public void jdbctemplate() {
 49         System.out.println(jdbctemplate);
 50     }
 51 
 52     /**
 53      * 测试jdbctemplate插入数据
 54      */
 55     @Test
 56     public void insert() {
 57 
 58         jdbctemplate.update("INSERT INTO tb_student (stu_name, stu_age, stu_password)    VALUES (?, ?, ?)", new Object[] {"o1",30,"999"});
 59     }
 60 
 61     /**
 62      * 测试jdbctemplate删除数据
 63      */
 64     @Test
 65     public void delete() {
 66     
 67         jdbctemplate.update("DELETE FROM tb_student WHERE stu_id=?", 15);
 68     }
 69 
 70     /**
 71      * 测试jdbctemplate更新数据
 72      */
 73     @Test
 74     public void update() {
 75 
 76         jdbctemplate.update("UPDATE tb_student    SET stu_name=?     WHERE stu_id=?", new Object[] {"测试",16});
 77     }
 78 
 79     /**
 80      * 测试jdbctemplate查询所有数据返回List
 81      */
 82     @Test
 83     public void findAll() {
 84         List<Map<String, Object>> students = jdbctemplate.queryForList("SELECT *    FROM tb_student");
 85         
 86         for (Map<String, Object> student : students) {
 87             System.out.println("学生名:" + student.get("stu_name"));
 88         }
 89     }
 90     
 91     /**
 92      * 测试jdbctemplate查询返回一个Map
 93      */
 94     @Test
 95     public void getByMap() {
 96         Map<String, Object> entity = jdbctemplate.queryForMap("SELECT *    FROM tb_student WHERE stu_id=?",1);
 97         System.out.println(entity.get("stu_name"));
 98     }
 99     
100     /**
101      * 测试jdbctemplate查询返回一个JavaBean
102      */
103     @Test
104     public void getByEntity() {
105         ResultSetExtractor<Student> rowMapper = new ResultSetExtractor<Student>() {
106             @Override
107             public Student extractData(ResultSet rs) throws SQLException, DataAccessException {
108                 Student student=new Student();
109                 if(rs.next()) {
110             
111                 student.setStuName(rs.getString("stu_name"));
112                 }
113                 return student;
114             }
115         };
116         
117         Student student = jdbctemplate.query("SELECT *    FROM tb_student WHERE stu_id=?",new Object[] {1}, rowMapper);
118     System.out.println(student.getStuName());
119     }
120     
121     /**
122      * 测试测试jdbctemplate查询返回一个JavaBean元素的List
123      */
124     @Test
125     public void getByEntityList() {
126         ResultSetExtractor<List<Student>> rowMapper = new ResultSetExtractor<List<Student>>() {
127 
128             @Override
129             public List<Student> extractData(ResultSet rs) throws SQLException, DataAccessException {
130                 List<Student> students =new ArrayList<Student>();
131                 while(rs.next()) {
132                     Student student=new Student();
133                     student.setStuId(rs.getLong("stu_id"));
134                     student.setStuName(rs.getString("stu_name"));
135                     student.setStuPassword(rs.getString("stu_password"));
136                     students.add(student);
137                 }
138                 return students;
139             }
140         };
141         
142         List<Student> query = jdbctemplate.query("SELECT *    FROM tb_student", rowMapper);
143         for (Student student : query) {
144             System.out.println(student.getStuName());
145         }
146     }
147 }
原文地址:https://www.cnblogs.com/maigy/p/10724552.html