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。
去面试吧,祝你好运!