zoukankan      html  css  js  c++  java
  • 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

    我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate

    首先我们肯定要引入对应的jar,来构建数据源对象

         <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-dbcp2</artifactId>
                <version>2.1.1</version>
            </dependency>

    根据这个我们简单的创建一个jdbctemplate对象

    package cn.cutter.start.bean;
    
    import org.apache.commons.dbcp2.BasicDataSource;
    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * 用来封装第三方对象的类,加入spring容器
     * @author xiaof
     *
     */
    @Component
    public class JdbcTemplateFactoryTestBean implements FactoryBean<JdbcTemplate> {
    
        @Override
        public JdbcTemplate getObject() throws Exception {
            BasicDataSource dataSource = new BasicDataSource();
            
            //设置相应的参数
            //1、数据库驱动类
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            //2、url,用户名,密码
            dataSource.setUrl("jdbc:mysql://localhost:3306/liferay?characterEncoding=utf-8");
            dataSource.setUsername("liferay"); dataSource.setPassword("xiaofeng2017");
            //3、初始化连接大小
            dataSource.setInitialSize(1);
            //4、连接池最大数据量
            dataSource.setMaxTotal(500);
            //5、连接池最大小空闲
            dataSource.setMinIdle(1);
            dataSource.setMaxIdle(20);
            //6、最大等待时间 单位毫秒
            dataSource.setMaxWaitMillis(20 * 1000);
            //7、指明连接是否被空闲连接回收器(如果有)进行检验
            dataSource.setPoolPreparedStatements(true);
            //8、运行一次空闲连接回收器的时间间隔(60秒)
            dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000);
            //9、验证时使用的SQL语句
            dataSource.setValidationQuery("SELECT 1 FROM DUAL");
            //10、借出连接时不要测试,否则很影响性能
            //11、申请连接的时候检测,如果空闲时间大于  timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
            dataSource.setTestWhileIdle(false);
            
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            return jdbcTemplate;
        }
    
        @Override
        public Class<?> getObjectType() {
            return JdbcTemplate.class;
        }
    
    
    }

    好了,测试一下

    @Test
        public void testJdbcTemplate() {
            ApplicationContext ctx = this.before();
            
            JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplateFactoryTestBean");
    //        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");
            
            //执行sql
            String sql = "select 1 from dual";
            String sql2 = "update xiaof_foo t set t.userName = ?, t.modifiedDate = ? where t.fooid = ? ";
            
    //        jdbcTemplate.execute(sql);
            
            jdbcTemplate.update(sql2, "cutter_point",  new Date(), "1");
            
        }

    Jdbctemplate

    创建jdbctemplate只要创建对应的DataSource就可以了,至于其他查询,多种多样

    NamedParameterJdbcTemplate

    我们在使用jdbctemplate的时候,都是通过?来指定对应的参数,那么这里就有一种更加贴近语义的方式

    我们创建这个template对象

    package cn.cutter.start.bean;
    
    import org.apache.commons.dbcp2.BasicDataSource;
    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * 加入spring容器,使用 NamedParameterJdbcTemplate
     * @author xiaof
     *
     */
    @Component
    public class NamedParameterJdbcTemplateTestFactoryBean implements FactoryBean<NamedParameterJdbcTemplate> {
    
        @Override
        public NamedParameterJdbcTemplate getObject() throws Exception {
            BasicDataSource dataSource = new BasicDataSource();
            
            //设置相应的参数
            //1、数据库驱动类
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            //2、url,用户名,密码
            dataSource.setUrl("jdbc:mysql://localhost:3306/liferay?characterEncoding=utf-8");
            dataSource.setUsername("liferay"); dataSource.setPassword("xiaofeng2017");
            //3、初始化连接大小
            dataSource.setInitialSize(1);
            //4、连接池最大数据量
            dataSource.setMaxTotal(500);
            //5、连接池最大小空闲
            dataSource.setMinIdle(1);
            dataSource.setMaxIdle(20);
            //6、最大等待时间 单位毫秒
            dataSource.setMaxWaitMillis(20 * 1000);
            //7、指明连接是否被空闲连接回收器(如果有)进行检验
            dataSource.setPoolPreparedStatements(true);
            //8、运行一次空闲连接回收器的时间间隔(60秒)
            dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000);
            //9、验证时使用的SQL语句
            dataSource.setValidationQuery("SELECT 1 FROM DUAL");
            //10、借出连接时不要测试,否则很影响性能
            //11、申请连接的时候检测,如果空闲时间大于  timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
            dataSource.setTestWhileIdle(false);
            
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
            return namedParameterJdbcTemplate;
        }
    
        @Override
        public Class<?> getObjectType() {
            // TODO Auto-generated method stub
            return NamedParameterJdbcTemplate.class;
        }
    
    }

    使用这个,我们来查询一下数据库的数据量

    数据库中我们查询结果

    select count(*) from xiaof_foo t where t.fooId = '1'

     

    代码中使用NamedParameterJdbcTemplate

    @Test
        public void testNamedParameterJdbcTemplate() {
            ApplicationContext ctx = this.before();
            
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
    //        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");
            
            //执行sql
            //设置参数对象
            SqlParameterSource sqlParameterSource = new MapSqlParameterSource("fooId", "1");
            //统计个数
            String sql = "select count(*) from xiaof_foo t where t.fooId = :fooId";
            int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParameterSource, Integer.class);
            
            
            System.out.println("个数是:" + count);
        }

    还有哦,最后注意下,这个 :参数名  这个是区分大小写的

    如果有多个参数,那么直接对map对象进行put就可以了

    @Test
        public void testNamedParameterJdbcTemplate() {
            ApplicationContext ctx = this.before();
            
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
    //        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");
            
            //执行sql
            //设置参数对象
            MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource("fooid", "1");
            sqlParameterSource.addValue("userName", "cutter_point");
            //统计个数
            String sql = "select count(*) from xiaof_foo t where t.fooId = :fooid and userName = :userName";
            int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParameterSource, Integer.class);
            
            
            System.out.println("个数是:" + count);
        }

    结果:

     

    借助bean对象进行传参

    @Test
        public void testNamedParameterJdbcTemplateModel() {
            ApplicationContext ctx = this.before();
            
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplateTestFactoryBean");
    //        Object obj = (IntroductionTestBean) ctx.getBean("introductionTestBean");
            
            String sql = "select * from xiaof_foo t where t.fooId = :fooId";
            XiaoFFoo xiaoFFoo = new XiaoFFoo();
            xiaoFFoo.setFooId(1l);
            
            SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(xiaoFFoo);
            
            List<Map<String, Object>> xiaoFFoo2s = namedParameterJdbcTemplate.queryForList(sql, sqlParameterSource);
            
            System.out.println("名字是:" + xiaoFFoo2s.get(0).get("userName"));
            
        }

    SimpleJdbcTemplate

    集jdbctemplate和namedparameterJdbctemplate 与一身,并在两者基础上新增java 5的特性:

    动态参数

    自动拆箱解箱

    范型

    不过这个在后面的spring中会被去除,既然这样,我们就不浪费时间再这个上面了,拜拜呢你嘞。。。

  • 相关阅读:
    分页
    hibernate 集合查询
    springmvc <mvc:default-servlet-handler/> & <mvc:annotation-driven>
    An owner of this repository has limited the ability to open a pull request to users that are collaborators on this repository.
    git 本地提交代码到 github 远程库,没有弹框 github login
    小鸡饲料任务,线下扫码付款收饲料地址
    小鸡饲料任务,蚂蚁庄园养鸡线下扫码付款收饲料地址,蚂蚁庄园养鸡线下扫码付款0.01元收饲料地址
    支付宝蚂蚁庄园线下支付链接,支付宝蚂蚁庄园线下支付地址
    kvm虚拟化
    Error Code: 1030. Got error -1 from storage engine
  • 原文地址:https://www.cnblogs.com/cutter-point/p/9147745.html
Copyright © 2011-2022 走看看