• 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 }
  • 相关阅读:
    Kubernetes 多租户:Pod 安全策略
    程序员是怎样的人
    AES加解密(golang <> cryptojs)
    matplotlib可视化系列之【缩放和投影】
    mac系统 hhkb切换搜狗中英文输入法方法
    java 多线程 带返回值与不带返回值
    linux /etc/fstab 文件详细说明(转)
    Pythonspyder设置python版本
    C++std::iota
    python使用lxml的xpath解析xml
  • 原文地址:https://www.cnblogs.com/maigy/p/10724552.html
Copyright © 2020-2023  润新知