zoukankan      html  css  js  c++  java
  • Spring集成JDBC

    不同spring版本合成的方式,有时候不一样,需要查看帮助文档来看如何集成,帮助文档在spring发行包中。

    1.导入spring的包(这里吧Spring-3.1.3 Release的所有jar包都导入了)和导入MySQL的依赖包mysql-connector-java-5.1.17-bin.jar

    2.选择一个数据源(JDBC自己的数据源管理器,DBCP和C3p0),我们一般用DBCP

    <bean id="dataSource" class="org.springframework.jdbc.DriverManagerDataSource">

    下面我们讲解使用DBCP:

    3.导入数据源(DBCP方式)的包commons-dbcp.jar和commons-pools.jar

    4.在beans.xml中创建dataSource数据源

      dataSource中各项配置解释:http://www.cnblogs.com/snake-hand/p/3144811.html

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/spring_teach" />
            <property name="username" value="root" />
            <property name="password" value="rootadmin" />
        </bean>
    View Code

    注意:在上面的代码中,我们直接将连接数据库所需要的用户名、密码、驱动类、连接字符串等信息直接在配置文件中给出了。我们其实也可以将这些信息写在一个

    properties文件中,命名为jdbc.properties(邮件src,选择File),我们在文件中写下如下内容,驱动类的名字,可以在导入的MySQL依赖jar包中找到

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/spring_teach
    jdbc.username=root
    jdbc.password=rootadmin
    View Code

    并且在beans.xml中稍作修改即可

        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <!-- 此处还可以配置其他信息,比如连接池的初始值、连接池最大值等等 -->
        </bean>
        <!-- beans.xml中导入相应的properties文件,这句话不能缺 -->
        <context:property-placeholder location="classpath:jdbc.properties"/>  
    View Code

     前面提到了DataSource有三种,我们可以在帮助文档中找到每种数据源的配置方法(帮助文档374页),代码如下。

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>
    <context:property-placeholder location="jdbc.properties"/>
    
    DBCP configuration:
    
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>
    <context:property-placeholder location="jdbc.properties"/>
    
    C3P0 configuration:
    
    <bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </bean>
    <context:property-placeholder location="jdbc.properties"/>
    View Code

    7.在MySQL数据库中建立user表(int id,String username,String password,String nickname),和创建User对象

    package org.zttc.itat.model;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class User {
        private int id;
        private String username;
        private String password;
        private String nickname;
            
        public User() {
            super();
        }
        public User(int id, String username, String password, String nickname) {
            super();
            this.id = id;
            this.username = username;
            this.password = password;
            this.nickname = nickname;
        }
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        
    
    }
    View Code

    8 .写相应的dao,并且为这个dao创建一个JDBCTemplate对象,通过JdbcTemplate对象可以方便的完成对数据库的操作

    9.为dao注入相应的dataSource,并创建JdbcTemplate

    第八步和第九步代码:

    10.完成数据对象的添加、删除、更新、查找操作。

    11.创建JUnit测试代码如下(21分钟):

    不用JUnit测试代码如下:

    package org.zttc.itat.test;
    
    import org.apache.commons.dbcp.BasicDataSource;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.zttc.itat.jdbcdao.UserJdbcDao;
    import org.zttc.itat.model.User;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            BeanFactory ctx = new ClassPathXmlApplicationContext("beans.xml");
            UserJdbcDao dao = (UserJdbcDao) ctx.getBean("userJdbcDao");
            User u=new User(6,"ss","232","fff");
            dao.add(u);
            BasicDataSource bs;
        }
    
    }
    View Code

    报错:

      1.如果没有加common-logging.jar,会报如下错误

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:164)
        at org.springframework.context.support.AbstractRefreshableApplicationContext.<init>(AbstractRefreshableApplicationContext.java:90)
        at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.<init>(AbstractRefreshableConfigApplicationContext.java:59)
        at org.springframework.context.support.AbstractXmlApplicationContext.<init>(AbstractXmlApplicationContext.java:61)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:136)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
        at org.zttc.itat.test.test.main(test.java:12)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 7 more

     在这个例子中,我们发现在UserJdbcDao中,setDataSource(DataSource dataSource),需要接收的参数类型是javax.sql.DataSource,
    而我们在beans.xml中配置的是org.apache.commons.dbcp.BasicDataSource(来自DBCP依赖包),也就是说我们传入的参数类型是org.apache.commons.dbcp.BasicDataSource, 所以我们可以得出结论:org.apache.commons.dbcp.BasicDataSource
    继承自javax.sql.DataSource,如果javax.sql.DataSource一个接口,那么BasicDataSource就是它的一个实现类。我们从Java的源码中做了
    验证,javax.sql.DataSource就是一个接口,并且他只定义了两个方法
    Connection getConnection(),
    Connection getConnection(String username, String password)。
    这里我们就会有点明朗了,org.apache.commons.dbcp.BasicDataSource是DBCP依赖包中的类,需要额外导入jar包才能使用,而javax.sql.DataSource是java源码中的一个接口,
    二者是接口与实现类的关系,我们就可以知道了javax.sql.DataSource是java的API暴露给外部的一个接口,由该接口中定义的方法可知,该接口的实现类需要完成创建和数据库的连接工作,并返回
    一个Connection,我们在javax.sql.DataSource中,可以继续查看Conncetion是什么,发现他也是javaAPI的一个接口,里面定义了许多的方法,我们查看Conncetion的继承树,
    发现DBCP的依赖包中有Conncetion的实现类。BasicDataSource创建了数据库的连接,并且返回了一个Connection的实现类,然后用Connection的实现类中的方法,执行sql语句。
    具体是怎么实现的,我们就不往深入的探究了。

    这样我们就明白了,DBCP依赖包中的BasicDataSource就是javax.sql.DataSource的实现类中的一个,DBCP依赖中其他的东西,应该是辅助各种DataSource实现类创建数据库连接的,也就是刚才说的那两个方法。

    回过头来,我们再看JdbcTemplate,他是Spring框架中的一个类org.springframework.jdbc.core.JdbcTemplate,既然在他的构造函数new JdbcTemplate(dataSource)中,接收了
    DataSource类,那么它就一定会调用getConnection()方法,我们例子中传入的是BasicDataSource,所以实际上就是调用BasicDataSource的getConnection()方法。我们导入spring
    的源码,来看看是不是这样。在JdbcTemplate源码中有多处调用了DataSourceUtils.getConnection(getDataSource())方法,而在该方法中,则调用了同一个类中的doGetConnection()方法,继而调用了dataSource.getConnection()
    从而验证,我们的想法是正确的。

    在spring的配置文件中,如何配置dataSource:http://hackpro.iteye.com/blog/1037376,该网址中的方法,有重复。

  • 相关阅读:
    FFC详解及应用
    getBoundingClientRect
    userAgent
    各种排序算法的分析及java实现
    解读TCP 四种定时器
    TCP那些事儿(下)
    TCP那些事儿(上)
    10个实用的 Linux 网络和监控命令[转]
    监控 Linux 性能的 18 个命令行工具[转]
    4个强大的Linux服务器监控工具[转]
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/5579124.html
Copyright © 2011-2022 走看看