您的当前位置:首页正文

使用Spring 和 JDBC 来操作数据 (持续更新中)

2023-11-08 来源:画鸵萌宠网

1. 使用 JNDI 的数据源(jndi data source)

代码如下:

@Beanpublic JndiObjectFactoryBean dataSource() {    JndiObjectFactoryBean jndiObjectFB = new JndiObjectFactoryBean();    jndiObjectFB.setJndiName("jdbc/XXXDS");    jndiObjectFB.setResourceRef(true);    jndiObjectFB.setProxyInterface(javax.sql.DataSource.class);    return jndiObjectFB;}

说明,这是利用JndiObjectFactoryBean 从JNDI 中查找DataSource

2.使用数据源池(data source pool)

@Beanpublic BasicDataSource dataSource() {    BasicDataSource ds = new BasicDataSource();    ds.setDriverClassName("org.h2.Driver");    ds.setUrl("jdbc:h2:tcp://localhost/~/XXX");    ds.setUsername("sa");    ds.setPassword("");    ds.setInitialSize(5);    ds.setMaxActive(10);    return ds;}

driverclassname、url、username以及password 是BasicDataSource 配置的基本元素。

其它的还有:initialSize、maxActive、maxIdle、maxOpenPreparedStatements、maxWait、minEvictableIdleTimeMillis、minIdle、poolPreparedStatements。

3. 使用基于JDBC 驱动的数据源(jdbc driver-base data source)

有三个JDBC data source class:DriverManagerDataSource、SimpleDriverDataSource和SingleConnectionDataSource

举个例子,配置DriverManagerDataSource:

@Beanpublic DataSource dataSource() {    DriverManagerDataSource ds = new DriverManagerDataSource();    ds.setDriverClassName("org.h2.Driver");    ds.setUrl("jdbc:h2:tcp://localhost/~/XXX");    ds.setUsername("sa");    ds.setPassword("");    return ds;}

说明,由于这个datasource ,在每次请求时,都会创建一个新的连接,从而牺牲了性能。所以,在生产环境中,尽量要使用数据源池的方式。

4.使用嵌入的数据源(embedded data source)

相当于内存数据库,在开发和测试时,比较有用。

举例:

@Beanpublic DataSource dataSource() {    return new EmbeddedDatabaseBuilder()        .setType(EmbeddedDatabaseType.H2)        .addScript("classpath:schema.sql")        .addScript("classpath:test-data.sql")        .build();}

说明,H2 要加在classpath中。

5. 使用 profiles 来选择数据源,

举例:

@Configurationpublic class DataSourceConfiguration {    @Profile("development")    @Bean    public DataSource embeddedDataSource() {        return new EmbeddedDatabaseBuilder()            .setType(EmbeddedDatabaseType.H2)            .addScript("classpath:schema.sql")            .addScript("classpath:test-data.sql")            .build();    }        @Profile("qa")    @Bean    public DataSource Data() {    // ......    }

说明:在启动的时候,指明哪个profile 是 active 的。

<二> 在Spring 中使用JDBC

1.Spring 提供了三种JDBC 的模板

  • JdbcTemplate

  • NameParameterJdbcTemplate

  • SimpleJdbcTemplate

  • 2. JDBC 模板的操作

    通过@Bean,将DataSource 赋给JDBCTemplate,就可以使用这些模板。

    举例:

    @Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {    return new JdbcTemplate(dataSource);}

    通过将JDBC 的Template 注入进Repository 即可使用。即在ComponentScan 的时候,创建了该模板。举例:

    @Repositorypublic class JdbcSpitterRepository implements SpitterRepository {    private JdbcOperations jdbcOperations;    @Inject    public JdbcSpitterRepository(JdbcOperations jdbcOperations) {        this.jdbcOperations = jdbcOperations;    }    ...}

    剩下的就是使用该模板进行CRUD 操作。

    使用Spring 和 JDBC 来操作数据 (持续更新中)

    标签:

    小编还为您整理了以下内容,可能对您也有帮助:

    如何使用spring整合JDBC

    使用Spring提供的三个JDBC模板类(JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate)操作数据库
    一、JdbcTemplate是Spring中最基本的JDBC模板, 利用JDBC和简单的索引参数查询对数据库进行简单访问
    二、NamedParameterJdbcTemplate能够在查询的时候把值绑定到SQL里的命名参数,而不是索引参数
    NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干;
    NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
    三、SimpleJdbcTemplate利用Java5的特性,比如自动装箱、通用和可变参数列表来简化JDBC模板的使用
    SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能干,
    SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可变长度参数支持。
    1、使用JDBC Template
    JdbcTemplate是一个辅助类,封装了JDBC的操作,直接使用JdbcTemplate很简单~Template只依赖于数据源。
    本例子使用的DriverManagerDataSource,是一个“伪”数据源,只是模拟了形式,并没事实现数据源的功能。
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/sampledb");
    ds.setUsername("root");
    ds.setPassword("");

    JdbcTemplate jdbc = new JdbcTemplate();
    jdbc.setDataSource(ds);
    String sql = "create table t_user1(user_id int primary key,user_name varchar(60))";
    jdbc.execute(sql);

    2、JdbcDaoSupport,&& 让Spring JDBC更“Spring”
    如果在代码中反复声明JdbcTemplate,代码会被污染的很严重,那和JDBC没区别了就~
    所以Spring提供了JdbcDaoSupport,所有DAO继承这个类,就会自动获得JdbcTemplate(前提是注入DataSource)。
    另外:Spring的xml配置可以很好的用在这里,在xml中配置,基本流程如下:
    (1)声明DataSrouce的Bean,这里用BasicDataSource,就是DBCP数据源(Tomcat用的那个)
    (2)声明模板JdbcTemplate的Bean,并把DataSource注入之
    (3)声明Dao,class为集成自JdbcDaoSupport的东西,并注入JdbcTemplate。
    上述Bean生成过程可以用Spring IDE……相当的方便。

    如何使用spring整合JDBC

    使用Spring提供的三个JDBC模板类(JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate)操作数据库
    一、JdbcTemplate是Spring中最基本的JDBC模板, 利用JDBC和简单的索引参数查询对数据库进行简单访问
    二、NamedParameterJdbcTemplate能够在查询的时候把值绑定到SQL里的命名参数,而不是索引参数
    NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干;
    NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
    三、SimpleJdbcTemplate利用Java5的特性,比如自动装箱、通用和可变参数列表来简化JDBC模板的使用
    SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能干,
    SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可变长度参数支持。
    1、使用JDBC Template
    JdbcTemplate是一个辅助类,封装了JDBC的操作,直接使用JdbcTemplate很简单~Template只依赖于数据源。
    本例子使用的DriverManagerDataSource,是一个“伪”数据源,只是模拟了形式,并没事实现数据源的功能。
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/sampledb");
    ds.setUsername("root");
    ds.setPassword("");

    JdbcTemplate jdbc = new JdbcTemplate();
    jdbc.setDataSource(ds);
    String sql = "create table t_user1(user_id int primary key,user_name varchar(60))";
    jdbc.execute(sql);

    2、JdbcDaoSupport,&& 让Spring JDBC更“Spring”
    如果在代码中反复声明JdbcTemplate,代码会被污染的很严重,那和JDBC没区别了就~
    所以Spring提供了JdbcDaoSupport,所有DAO继承这个类,就会自动获得JdbcTemplate(前提是注入DataSource)。
    另外:Spring的xml配置可以很好的用在这里,在xml中配置,基本流程如下:
    (1)声明DataSrouce的Bean,这里用BasicDataSource,就是DBCP数据源(Tomcat用的那个)
    (2)声明模板JdbcTemplate的Bean,并把DataSource注入之
    (3)声明Dao,class为集成自JdbcDaoSupport的东西,并注入JdbcTemplate。
    上述Bean生成过程可以用Spring IDE……相当的方便。

    如何在spring框架中解决多数据源的问题

    问题的解决

    (一)            采用Decorator设计模式

    要解决这个问题,我的思路锁定在了这个dataSource上了。如果sessionFactory指向的dataSource可以根据客户的需求去连接客户所需要的真正的数据源,即提供动态切换数据源的功能,那么问题就解决了。那么我们怎么做呢?去修改那些我们要使用的dataSource源码吗?这显然不是一个好的方案,我们希望我们的修改与原dataSource代码是分离的。根据以上的分析,使用GoF设计模式中的Decorator模式(装饰者模式)应当是我们可以选择的最佳方案。

    什么是“Decorator模式”?简单点儿说就是当我们需要修改原有的功能,但我们又不愿直接去修改原有的代码时,设计一个Decorator套在原有代码外面。当我们使用Decorator的时候与原类完全一样,当Decorator的某些功能却已经修改为了我们需要修改的功能。Decorator模式的结构如图。

    我们本来需要修改图中所有具体的Component类的一些功能,但却并不是去直接修改它们的代码,而是在它们的外面增加一个Decorator。Decorator与具体的Component类都是继承的AbstractComponent,因此它长得和具体的Component类一样,也就是说我们在使用Decorator的时候就如同在使用ConcreteComponentA或者ConcreteComponentB一样,甚至那些使用ConcreteComponentA或者ConcreteComponentB的客户程序都不知道它们用的类已经改为了Decorator,但是Decorator已经对具体的Component类的部分方法进行了修改,执行这些方法的结果已经不同了。

    (二)            设计MultiDataSource类

    现在回到我们的问题,我们需要对dataSource的功能进行变更,但又不希望修改dataSource中的任何代码。我这里指的dataSource是所有实现javax.sql.DataSource接口的类,我们常用的包括apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等,这些类我们不可能修改它们本身,更不可能对它们一个个地修改以实现动态分配数据源的功能,同时,我们又希望使用dataSource的sessionFactory根本就感觉不到这样的变化。Decorator模式就正是解决这个问题的设计模式。

    首先写一个Decorator类,我取名叫MultiDataSource,通过它来动态切换数据源。同时在配置文件中将sessionFactory的dataSource属性由原来的某个具体的dataSource改为MultiDataSource。如图:

    对比原Decorator模式,AbstractComponent是一个抽象类,但在这里我们可以将这个抽象类用接口来代替,即DataSource接口,而ConcreteComponent就是那些DataSource的实现类,如BasicDataSource、JndiObjectFactoryBean等。MultiDataSource封装了具体的dataSource,并实现了数据源动态切换:

    java 代码

    1.public class MultiDataSource implements DataSource {

    2.    private DataSource dataSource = null;

    3.public MultiDataSource(DataSource dataSource){

    4.        this.dataSource = dataSource;

    5.    }

    6.    /* (non-Javadoc)

    7.     * @see javax.sql.DataSource#getConnection()

    8.     */

    9.    public Connection getConnection() throws SQLException {

    10.        return getDataSource().getConnection();

    11.    }

    12.    //其它DataSource接口应当实现的方法

    13.

    14.    public DataSource getDataSource(){

    15.        return this.dataSource;

    16.        }

    17.    }

    18.    public void setDataSource(DataSource dataSource) {

    19.        this.dataSource = dataSource;

    20.    }

    21.}

    客户在发出请求的时候,将dataSourceName放到request中,然后把request中的数据源名通过调用new MultiDataSource(dataSource)时可以告诉MultiDataSource客户需要的数据源,就可以实现动态切换数据源了。但细心的朋友会发现这在单例的情况下就是问题的,因为MultiDataSource在系统中只有一个对象,它的实例变量dataSource也只有一个,就如同一个静态变量一般。正因为如此,单例模式让许多设计模式都不得不需要更改,这将在我的《“单例”更改了我们的设计模式》中详细讨论。那么,我们在单例模式下如何设计呢?

    (三)            单例模式下的MultiDataSource

    在单例模式下,由于我们在每次调用MultiDataSource的方法的时候,dataSource都可能是不同的,所以我们不能将dataSource放在实例变量dataSource中,最简单的方式就是在方法getDataSource()中增加参数,告诉MultiDataSource我到底调用的是哪个dataSource:

    java 代码

    1.public DataSource getDataSource(String dataSourceName){

    2.        log.debug("dataSourceName:"+dataSourceName);

    3.        try{

    4.            if(dataSourceName==null||dataSourceName.equals("")){

    5.                return this.dataSource;

    6.            }

    7.            return (DataSource)this.applicationContext.getBean(dataSourceName);

    8.        }catch(NoSuchBeanDefinitionException ex){

    9.            throw new DaoException("There is not the dataSource

    10.        }

    11.    }

    值得一提的是,我需要的数据源已经都在spring的配置文件中注册,dataSourceName就是其对应的id。

    xml 代码

    1.<bean id="dataSource1"

    2.    class="org.apache.commons.dbcp.BasicDataSource">

    3.    <property name="driverClassName">

    4.        <value>oracle.jdbc.driver.OracleDrivervalue>

    5.    property>

    6.    ......

    7.bean>

    8.<bean id="dataSource2"

    9.    class="org.apache.commons.dbcp.BasicDataSource">

    10.    <property name="driverClassName">

    11.        <value>oracle.jdbc.driver.OracleDrivervalue>

    12.    property>

    13.    ......

    14.bean>

    为了得到spring的ApplicationContext,MultiDataSource类必须实现接口org.springframework.context.ApplicationContextAware,并且实现方法:

    java 代码

    1.private ApplicationContext applicationContext = null;

    2.public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

    3.        this.applicationContext = applicationContext;

    4.    }

    如此这样,我就可以通过this.applicationContext.getBean(dataSourceName)得到dataSource了。

    Java程序员,最常用的20%技术有哪些?

    两个月,这让我想到了我当年第一份工作,也是两个月从零学JAVA。当时就买了3本书,强啃了6周。

    记住一点,你要抓重点,你只要让人家知道,你足够初级开发就可以了,学了长长一个列表,个个不精,被面试官随便问起来,就糟了。倒不如抓住最基本的,反正你就是初级人员,只懂最基本的,是最正常的情况。

    首先,学会一个J2EE服务器,tomcat (Nginx或者httpd等web服务),学会的标准是,会下载,能启动,知道什么文件部署在什么地方,能看到启动画面,能知道最直接,最关键的配置文件名字和位置。你要了解下其他的服务器的名字,就足够了。有人叫你去学weblogic?那是坑你,2个月weblogic,你最多也只能懂十分之一。太重。

    其次,学一个框架,以前SSH,现在SSM,这些都多余,你就只看spring MVC,因为所有的mvc框架都类似,你只要坚持你了解MVC,其他的我觉得是容易借鉴类推的,H和M,你就直接说,我没有项目经验,我是没有实际接触过的,我只了解一点点原理,这个不要花时间,最后去看几眼文档就可以了。spring MVC,就这么简单,一个就行。

    然后是数据库,别赶时髦搞nosql,老老实实关系型,mysql就很好,坑浅应用多,最近连集群支持的都很好了,你只要强调一点,数据库,你不是DBA,你还不懂如何调优,如何调执行计划,你只懂增删改查,所以你要学的就是T-SQL,标准是你能手写带条件的增删改查,会复杂语句更好,稍微了解下sql效率方面的问题,为了面试也是可以。MSSQL在国内被鄙视的不行,如果有人叫你弄oracle,那又是太装,我手下一票的5年程序员,其中有超过一半连oracle的AWR都不会读,有的连数据字典都不知道。

    IDE不多谈,你总逃不过eclipse和几个大厂的东西。要用简单易用的,别花太多时间在这个上面。

    设计模式你要稍微看一下,了解什么是设计模式,你大可以老实说,你根本刚入行,只是粗通工厂模式和单粒,其他的需要在工作中学习,这样既不会显得完全不懂,也不会出什么纰漏。

    程序方面,jdbc需要了解下,相关的有连接字的写法,如何准备和获取结果,什么是resultset这类东西,当然,数据库连接的关闭和释放也是需要的。

    类和抽象类和接口的关系搞清楚,继承和实现搞清楚,重载重写搞清楚这些都是基本概念。

    EJB现在不太用了,稍微了解下,你可以用spring所以不用手写EJB了。spring除了MVC以外,还有很多项目,DAO可以看一下,比较初级。

    由于java主要是B/S结构,无论是集成还是自己的前后端,你都要看一下http,整个http的生命周期是什么?存在哪些步骤和不同的application负责哪个阶段,相关的有几个request和response实体,包含什么是session了解下。

    业务逻辑的话,上手仔细写几个例子就好了

    前段你不需要了解太多,JSP JS就足够了,你是程序员,不是前端的美工,不用去了解太多。jsp上有个容易忽视的基础点:tag到底是什么如何处理。jsp的生命周期这些也最好看一下。

    基础的devops稍微了解下, git的代表,github可以注册一个账号,搞清楚本地repo和远程repo之间的关系即可。SVN更为简单一点。

    Maven也要学习一下,主要是pom文件的几个主要的部分,尤其是depedency。

    code smells方面手写万把行代码。自己有个感觉,不用去刻意背javadoc。

    去面试吧,祝你好运!

    Top