zoukankan      html  css  js  c++  java
  • spring的关于数据源的datasource接口的深入理解


    1.DataSource的接口
    这是一个spring接口,可以获取数据库的Connection。是标准化的,取得连接的一种方式。

    默认市面上有两个数据库连接池实现了spring的datasource接口,

    分别是apache的dbcp数据库连接池和c3p0连接池。

    2.spring对java jdk的jdbc做了深层次的封装,叫jdbctemplate,在org.springframework.jdbc包下

    org.springframework.jdbc.core.JdbcTemplate包下,

    JdbcTemplate主要提供以下五类方法:

    • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

    • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;

    • query方法及queryForXXX方法:用于执行查询相关语句;

    • call方法:用于执行存储过程、函数相关语句。

    3.DataSource是数据源,jdbctemplate是操控sql语句的,所以datasource要注入到jdbc之中

    DataSource要注入到JdbcTemplate之中。

    DataSource要注入到JdbcTemplate之中。

    DataSource要注入到JdbcTemplate之中。

    JdbcTemplate简介

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

      JdbcTemplate位于中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个这个包包含了一下事务和异常控制

    配置Spring配置文件applicationContext.xml

    复制代码
     1 <context:property-placeholder location="classpath:db.properties"/>
     2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     3     <property name="user" value="${jdbc.user}"></property>
     4     <property name="password" value="${jdbc.password}"></property>
     5     <property name="driverClass" value="${jdbc.driverClass}"></property>
     6     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
     7 </bean>
     8 
     9 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    10     <property name="dataSource" ref="dataSource"></property>
    11 </bean>
    复制代码

      第一行代码:用来读取db.properties文件中的数据。

      第二行代码:用来配置一个数据源,这里数据实现类来自C3P0中的一个属性类。其中属性的值就是来自于db.properties

      第九行代码:配置一个JdbcTemplate实例,并注入一个dataSource数据源

     

    二。spring操控数据库的几种方法

    1.spring的自带jdbctemplate

    2.mybatis的sqlsessionFactoryBean或者sqlsessionTemplate

    Spring+JdbcTemplate/Mybatis

    1.dao组件继承org.springframework.jdbc.core.support.JdbcDaoSupport 
    applicationContext.xml文件中配置

        <util:properties id = "jdbcProperties" location = "classpath:db.properties"></util:properties>
    
        <bean id = "myDataSource2" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close">
            <property name="driverClassName" value ="#{jdbcProperties.driver}"></property>
            <property name="url" value="#{jdbcProperties.url}"></property>
            <property name="username" value="#{jdbcProperties.user}"></property>
            <property name="password" value="#{jdbcProperties.pwd}"></property>
        </bean>
    
        <bean id = "empDao01" class = "hateapple.dao.EmpDao01">
            <property name="dataSource" ref = "myDataSource2"></property>
        </bean>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    empDao01通过setter注入dataSource,set方法继承自JdbcDaoSupport,且不能被覆盖重写

    //set方法签名
    public final void setDataSource(DataSource dataSource)
    • 1
    • 2
    • 1
    • 2

    其实就是注入的dataSource被父类JdbcDaoSupport拿去初始化自己的成员变量jdbcTemplate了,empDao01想要使用jdbcTemplate只能通过getJdbcTemplate。

    2.不继承 
    org.springframework.jdbc.core.support.JdbcDaoSupport,为empDao02注入jdbcTemplate,empDao02通过jdbcTemplate操作数据库; 
    applicationContext.xml文件配置

        <bean id = "myDataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close">
            <property name="driverClassName" value ="oracle.jdbc.driver.OracleDriver"></property>
            <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
            <property name="username" value="em"></property>
            <property name="password" value="em"></property>
        </bean>
    
        <bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref = "myDataSource"></property>
        </bean>
        <bean id = "empDao02" class = "hateapple.dao.EmpDao02">
            <property name="jdbcTemplate" ref = "jdbcTemplate"></property>
        </bean>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    对比两种方式,第一种是把钥匙交给门卫用的时候向门卫拿,第二种自己带身上。

    Spring+myBatis

    1.spring整合mybatis 的核心是 SqlSessionFactoryBean、MapperFactoryBean(单一接口)

    org.mybatis.spring.SqlSessionFactoryBean包含了dataSource(数据源)、mapperLocations(接口的mapper映射文件路径);
    
    org.mybatis.spring.mapper.MapperFactoryBean包含了sqlSessionFactory(上面的bean),mapperInterface(接口的完整名称);
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref = "myDataSource"></property>
            <!-- 加载多个可以改为*.xml -->
            <property name="mapperLocations" value = "classpath:hateapple/mapper/StudentMapperMyBatis.xml"></property>
    </bean>
    
    <!-- hateapple.dao.BaseDao是包含了一个findAll()方法的接口 -->
    <bean id="studentMapper" class= "org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="hateapple.dao.BaseDao"></property>
            <property name="sqlSessionFactory" ref ="sqlSessionFactory"></property>
    </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试代码

            @Test
            public void testMybatis(){
                String conf = "applicationContext.xml";
                ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
                BaseDao baseDao = (BaseDao)ac.getBean("studentMapper");
                List<Student> studentList = baseDao.findAll();
                for (Student  student : studentList) {
                    System.out.println(student.getName());
                }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    如果需要多个org.mybatis.spring.mapper.MapperFactoryBean,一个一个配置肯定不现实
    

    2. MapperScannerConfigurer批量扫描接口,并为每个接口生成一个 MapperFactoryBean的实例

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 扫描的接口的包 -->
            <property name="basePackage" value ="hateapple.dao"></property>
            <!-- 会话工厂 -->
            <property name="sqlSessionFactory" ref ="sqlSessionFactory"></property>
            <!-- 自定义注解,只有被自定义的注解标记的接口才会被扫描 -->
            <property name="annotationClass" value="hateapple.annotation.MyMapperAnnotation"></property>
    </bean>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    MyMapperAnnotation .Java

    public @interface MyMapperAnnotation {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    BaseDao.java

    @MyMapperAnnotation
    public interface BaseDao {
        public List<Student> findAll();
    }
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    测试代码:

            @Test
            public void testMybatis(){
                String conf = "applicationContext.xml";
                ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
                BaseDao baseDao = (BaseDao)ac.getBean("baseDao");
                List<Student> studentList = baseDao.findAll();
                for (Student  student : studentList) {
                    System.out.println(student.getName());
                }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    spring+SqlSessionTemplate

    其实org.mybatis.spring.mapper.MapperFactoryBean就是封装了一个SqlSessionTemplate操作数据库,我们调用baseDao.findAll()最终的操作还是sqlSessionTemplate.selectList(“findAll”)

    1.直接为操作数据库类注入sqlSessionTemplate

    <bean id ="sqlSessionTemplate" class = "org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index = "0" ref="sqlSessionFactory"></constructor-arg>
    </bean>
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
        //sqlSessionTemplate是被注入进来的
        @Override
        public List<Student> findAll() {
            List<Student> studentList = sqlSessionTemplate.selectList("findAll");
            for (Student student : studentList) {
                System.out.println(student.getName());
            }
            return studentList;
        }
    本文部分转自http://blog.csdn.net/zhaohuijiadelu/article/details/51899080
  • 相关阅读:
    WordPress让文本小工具支持简码
    修改WordPress后台登录地址,提高安全性
    WordPress用键盘左右方向键来查看上一篇和下一篇文章
    Git 补丁操作
    Git 标签操作
    Git 修正错误
    Git 删除操作
    Git 重命名操作
    Git 移动操作
    Git 藏匿操作
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6770515.html
Copyright © 2011-2022 走看看