Spring JDBC的详解

   日期:2020-09-28     浏览:99    评论:0    
核心提示:一.Spring jdbc概述1.概述:Spring JDBC是Spring所提供的持久层技术,他主要目的降低JDBC API的使用难度,以一种更直接、更简洁的方式使用JDBC API。2.作用:Spring的JDBC模块负责数据库资源和错误处理,大大简化了开发人员对数据库的操作。3.包:core:核心包,包含了JDBC的核心功能。例如jdbcTemplate类datasource:数据源包object:对象包support:支持包。是core包和object包的支持类。二.Spri

一.Spring jdbc概述

1.概述:

Spring JDBC是Spring所提供的持久层技术,他主要目的降低JDBC API的使用难度,以一种更直接、更简洁的方式使用JDBC API。

2.作用:

Spring的JDBC模块负责数据库资源和错误处理,大大简化了开发人员对数据库的操作。

3.包:
  • core:核心包,包含了JDBC的核心功能。例如jdbcTemplate类
  • datasource:数据源包
  • object:对象包
  • support:支持包。是core包和object包的支持类。

二.Spring jdbc的配置

针对mysql数据库,有以下四种配置:

1.使用org.springframework.jdbc.datasource.DriverManagerDataSource

使用 DriverManagerDataSource建立连接是只要有连接就新建一个connection,根本没有连接池的作用。

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">
     <!-- spring管理jdbc和数据库连接池-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
        <property name="url" value="jdbc:mysql:///shop"></property>
     </bean>
    <!-- spring管理jdbc模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>
2.使用org.apache.commons.dbcp.BasicDataSource

需要下载的jar包:commons-dbcp.jar,commons-pool.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">

     <!-- spring管理dbcp数据库连接池-->

    <bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
        <property name="url" value="jdbc:mysql:///shop"></property>
        <property name="maxActive" value="20"></property>
        <property name="maxIdle" value="5"></property>
        <property name="minIdle" value="2"></property>
        <property name="maxWait" value="10000"></property>
    </bean>
    <!-- spring管理jdbc模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>
3.spring管理c3p0数据库连接池

注意:这种方法中用了$(username)之后好像会取当前计算机用户名来连接数据库,将db.properties中的username改成user就可以了。

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">

     <!-- spring管理c3p0数据库连接池-->

  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
      <property name="jdbcUrl" value="jdbc:mysql:///shop"></property>
      <property name="password" value="root"></property>
      <property name="user" value="root"></property>
  </bean>
    <!-- spring管理jdbc模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>
4. 使用hibernate数据源

需要hiberante核心jar包。
目前三大框架较流行,spring一般与hiberante做搭档,数据库连接方式写在hiberante的配置文件中,在spring管理hibernate中的配置文件中,直接读取hibernate核心配置文件即可。

[html]  
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
<property name="configLocations">   
<list>   
<value>classpath:com/config/hibernate.cfg.xml</value>   
</list>   
</property>   
<property name="mappingLocations">   
<!-- 所有的实体类映射文件 -->   
<list>   
<value>classpath:com/hibernate/hbm.xml</value>   
</list>   
</property>   
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
 <property name="configLocations">  
   <list>  
      <value>classpath:com/config/hibernate.cfg.xml</value>  
   </list>  
 </property>  
    <property name="mappingLocations">   
<!-- 所有的实体类映射文件 -->  
        <list>  
            <value>classpath:com/hibernate/hbm.xml</value>  
        </list>  
</property>  
 

三.jdbcTemplate

1.引入

Spring对数据库的操作在jdbc上面做了深层次的封装,使用Spring的注入功能,可以吧DataSource注册到jdbcTemplate中

2.jdbcTemplate更新数据库的常用方法
  • update(更新数据,即数据的增删改)
  • batchUpdate(批量更新数据库)
  • queryForObject(查询单行)
  • query(查询多行)
  • queryForObject(查询单值)
3.数据库连接池的优点
  • 资源重用,避免频繁创建
  • 更快的系统反应速度
  • 实现某一应用最大可用数据库连接数的限制避免某一应用独占所有资源
  • 统一的连接管理,避免数据库连接池链接泄露
4.Spring中实现jdbcTemplate对数据库操作

(1).导入jar包
(2).src下创建属性配置文件db.properties

driverClass=com.mysql.jdbc.Driver
#url=jdbc:mysql://localhost:3306/shop
url=jdbc:mysql://localhost:3306/shop
#username=root
user=root
password=root

(3).配置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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">
    <!-- 引入工程中src下的db.properties文件1-->
    <!-- 1 可以 <property name="location" value="db.properties"></property>-->
    <!-- 2 不可以<property name="location"  value="classpath*:db.properties"></property>-->
<!--    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">-->
<!--        <property name="location" value="classpath:db.properties"></property>-->
<!--    </bean>-->

    <!-- 引入工程中src下的db.properties文件2-->
 <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>

     <!-- spring管理c3p0数据库连接池-->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="${driverClass}"></property>
      <property name="jdbcUrl" value="${url}"></property>
      <property name="password" value="${password}"></property>
      <property name="user" value="${user}"></property>
  </bean>
    <!-- spring管理jdbc模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

bean类:

package com.it.spring.jdbc;
 
public class Account { 

    private Integer id;
    private String name;
    private Double money;

    public Account() { 
    }

    public Account(Integer id, String name, Double money) { 
        this.id = id;
        this.name = name;
        this.money = money;
    }

    @Override
    public String toString() { 
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }

    public Integer getId() { 
        return id;
    }

    public void setId(Integer id) { 
        this.id = id;
    }

    public String getName() { 
        return name;
    }

    public void setName(String name) { 
        this.name = name;
    }

    public Double getMoney() { 
        return money;
    }

    public void setMoney(Double money) { 
        this.money = money;
    }
}

测试类

package com.it.spring.jdbc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration("classpath:applicationContext.xml")
public class SpringJDBCTest1 { 
  @Resource
 JdbcTemplate jdbcTemplate;
 

  @Test
  public void addAccount(){ 
     jdbcTemplate.update("insert into account(id,name,money)values(?,?,?)",5,"admin1",9100L);
      System.out.println("--------操作成功!-----------");

  }
    @Test
    public void updateAccount(){ 
        jdbcTemplate.update("update account set name=?,money=? where id=?","wwe",19100L,5);
        System.out.println("--------操作成功!-----------");

    }
    @Test
    public void delAccount(){ 
        jdbcTemplate.update("delete from account where id=?",5);
        System.out.println("--------操作成功!-----------");

    }
    //查询某个属性
    @Test
    public void findNameAccount(){ 
      String name = jdbcTemplate.queryForObject("select name from account where id=?",String.class,4);
        System.out.println("name-->"+name);
        System.out.println("--------操作成功!-----------");

    }

    //查询某个属性
    @Test
    public void countAccount(){ 
        Long count = jdbcTemplate.queryForObject("select count(*) from account",Long.class);
        System.out.println("count-->"+count);
        System.out.println("--------操作成功!-----------");

    }
    //查询返回对象或集合

     @Test
    public void findAccountById(){ 
     Account account =  jdbcTemplate.queryForObject("select * from account where id=?",new MyRowMapper(),4);
       if(account!=null){ 
           System.out.println(account);
       }
    }

    @Test
    public void queryAllAccount(){ 
        List<Account> accounts = jdbcTemplate.query("select * from account",new MyRowMapper());
        for (Account account :accounts) { 
            System.out.println(account);
        }
    }


    //定义内部类
    class MyRowMapper implements  RowMapper<Account>{ 
        @Override
        public Account mapRow(ResultSet resultSet, int i) throws SQLException { 
            Account account = new Account();
            account.setId(resultSet.getInt("id"));
            account.setMoney(resultSet.getDouble("money"));
            account.setName(resultSet.getString("name"));
            return account;
        }
    }

}

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服