• Spring-JDBC配置


    以C3P0连接池为例:由于C3P0是第三方,我们无法使用注解将其定义为bean,因此需要在applicationContext.xml中配置:

     1     <!-- 导入配置文件 -->
     2     <context:property-placeholder location="classpath:dataSource.properties"/>
     3     <aop:aspectj-autoproxy proxy-target-class="true"/>
     4     <bean id="dataSourceLocal" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
     5         <!-- 指定连接数据库的驱动-->
     6         <property name="driverClass" value="${jdbc.driverClassName}"/>  
     7         <!-- 指定连接数据库的URL-->  
     8         <property name="jdbcUrl" value="${jdbc.url}"/>  
     9         <!-- 指定连接数据库的用户名-->  
    10         <property name="user" value="${jdbc.username}"/>  
    11         <!-- 指定连接数据库的密码-->  
    12         <property name="password" value="${jdbc.password}"/>  
    13         <!-- 指定连接池中保留的最大连接数. Default:15-->  
    14         <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>  
    15         <!-- 指定连接池中保留的最小连接数-->  
    16         <property name="minPoolSize" value="${jdbc.minPoolSize}"/>  
    17         <!-- 指定连接池的初始化连接数  取值应在minPoolSize 与 maxPoolSize 之间.Default:3-->  
    18         <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>  
    19         <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0-->  
    20         <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>  
    21         <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3-->  
    22         <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>  
    23         <!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。  
    24         但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0-->  
    25         <property name="maxStatements" value="${jdbc.maxStatements}"/>  
    26         <!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->  
    27         <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>  
    28     </bean>  
    c3p0连接池配置

    可以看到,连接配置中引用了<context:property-placeholder location="classpath:dataSource.properties"/>标签,这是说从外部配置文件中读取数据库相关的数据,用${}表达式可以读取,因此,我们需要同时配置dataSource.properties文件,内容如下:

     1 jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
     2 jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
     3 jdbc.username=scott
     4 jdbc.password=orcl
     5 jdbc.initialPoolSize=20 
     6 jdbc.maxPoolSize=100  
     7 jdbc.minPoolSize=10  
     8 jdbc.maxIdleTime=600  
     9 jdbc.acquireIncrement=5  
    10 jdbc.maxStatements=5  
    11 jdbc.idleConnectionTestPeriod=60
    dataSource

    只要保证配置文件正确,数据库的连接配置也就完成了,接下来需要配置JDBCTemplate,仍然是在applicationContext.xml中配置:

    1     <!-- 配置jdbcTemplate -->
    2     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    3         <property name="dataSource" ref="dataSourceLocal"></property>
    4     </bean>
    JDBCTemplate

    JDBCTemplate类中,只有一个参数,那就是dataSource,因此需要注入上面的dateSource。

    接下来以Oracle中Scott用户下的dept表为例测试:

    1 private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
    2 private JdbcTemplate jt=(JdbcTemplate) ctx.getBean("jdbcTemplate");
    取得bean-JDBCTemplate
    1     @Test
    2     public void updateTest(){
    3         String sqlUpdate="update emp set ename=? where empno=?";
    4         jt.update(sqlUpdate,"SMITH",7369);
    5     }
    单条增删改测试

    可以看到,此处在sql语句中使用了?作为占位符,在JDBCTemplate的update方法中一一对应定义即可。

    另外,JDBCTemplate同时支持批量操作,代码如下:

     1     @Test
     2     public void testBatchUpdate(){
     3         //批量修改
     4         String[] s=new String[]{"update emp set ename='SMITH1' where empno=7369","update emp set ename='SMITH' where empno=7369"};
     5         jt.batchUpdate(s);
     6         //批量添加
     7         List<Object[]> addList = new ArrayList<Object[]>();
     8         addList.add(new Object[]{52,"AA","SHANGHAI"});
     9         addList.add(new Object[]{62,"BB","BEIJING"});
    10         addList.add(new Object[]{72,"CC","XI'AN"});
    11         addList.add(new Object[]{82,"DD","HANGZHOU"});
    12         jt.batchUpdate("insert into scott.dept values (?,?,?)",addList);
    13         //批量删除
    14         List<Object[]> delList = new ArrayList<Object[]>();
    15         delList.add(new Integer[]{40});
    16         jt.batchUpdate("delete dept where deptno>?",delList);
    17     }
    批量增删改

    批量操作需要用到batchUpdate方法,其重载形式如下:

    我们使用了第一和第三种方法就够用了。

    查询分为单条数据查询和多条数据查询,JDBCTemplate支持使用RowMapper类将其对应到相应的实体类,如果是单条数据,可使用queryForObject方法:

    1     @Test
    2     public void testQueryForObject(){
    3         String sql="select deptno,dname,loc from dept where deptno=?";
    4         RowMapper<Dept> rm=new BeanPropertyRowMapper<Dept>(Dept.class);
    5         Dept d=jt.queryForObject(sql,rm,20);
    6         System.err.println(d);
    7     }
    查询单条数据

    如果是多条数据,可以用query方法:

    1     @Test
    2     public void testQueryForList(){
    3         String sql="select * from dept where deptno>?";
    4         RowMapper<Dept> re=new BeanPropertyRowMapper<Dept>(Dept.class);
    5         List<Dept> dept=jt.query(sql, re,20);
    6         System.out.println(dept);
    7     }
    查询多条数据

    另外,也支持统计查询和单列查询:

     1     @Test
     2     public void testQueryColumnOrCount(){
     3         //获取统计信息
     4         String sql="select count(empno) from emp";
     5         Long l=jt.queryForObject(sql, Long.class);
     6         System.err.println(l);
     7         //获取单列信息
     8         String sql4Date="select hiredate from emp";
     9         RowMapper<Date> re=new BeanPropertyRowMapper<Date>(Date.class);
    10         List<Date> d=jt.query(sql4Date, re);
    11         System.err.println(d);
    12     }
    统计查询和单列查询

    从上面的例子中可以看到,参数都是通过?占位符顺序一一对应传递参数的,如果参数位置变动,那么JDBC操作需要同时变更,不安全且工作量大,因此Spring同时提供了NamedParameterJDBCTemplate具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定.。

    优势:具名参数更易于维护, 也提升了可读性.

    与JDBCTemplate一样,需要在XML中配置:

    1     <!-- 配置NamedParameterJDBCTemplate -->
    2     <bean id="namedParameterJDBCTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    3         <constructor-arg><ref bean="dataSourceLocal"/></constructor-arg>
    4     </bean>
    NamedParameterJDBCTemplate配置

    用法:

    在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键

    也可以使用 SqlParameterSource 参数

    批量更新时可以提供 Map 或 SqlParameterSource 的数组

    代码如下:

     1     /**
     2      * NamedParameterJDBCTemplate用法测试,以update为例
     3      */
     4     @Test
     5     public void testNamedParameterJDBCTemplate(){
     6         String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数是可以自由命名的
     7         Map<String, Object> map=new HashMap<String, Object>();
     8         map.put("deptno", 94);
     9         map.put("dname", "管理部");
    10         map.put("loc", "金华");
    11         npjt.update(sql, map);
    12     }
    13     /**
    14      * 使用SqlParameterSource类与实体类对应,此时参数命名需与实体类属性名对应
    15      * SqlParameterSource sps = new BeanPropertySqlParameterSource(对象)
    16      */
    17     @Test
    18     public void testNamedParameterJDBCTemplateByEntity(){
    19         String sql="insert into dept values (:deptno,:dname,:loc)";//此处参数命名需与实体类属性名相同
    20         SqlParameterSource sps=new BeanPropertySqlParameterSource(new Dept(88, "业务部", "北京"));
    21         npjt.update(sql, sps);
    22     }
    具名参数测试

    高级用法参考:Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数


    总结:JDBCTemplate很强大,但毕竟不是ORM框架,比如,并不支持级联操作。

      

  • 相关阅读:
    Vue对象提供的属性功能
    Vue快速入门
    Django-DRF(路由与扩展功能)
    Django-DRF(视图相关)
    Django-DRF(1)
    Django-Xadmin
    python 列表的append()和extend()
    map apply applymap
    pd.merge(), pd.concat()
    描述性分析与数据清洗 笔记
  • 原文地址:https://www.cnblogs.com/yw0219/p/6020361.html
Copyright © 2020-2023  润新知