• Spring的Template


    什么是Tenplate?

      Spring提供的一种操作数据库的技术,是对Jdbc的封装。语法非常接近DBUtils.

      JdbcTemplate可以直接操作数据库,加快效率,jdbcTemplate也可以为声明式事务准备

    为什么用JdbcTemplate进行开发?  

      Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
      Spring提供的JdbcTemplate对jdbc做了封装,大大简化了数据库的操作。找到Spring   JdbcTemplate源码,可以看到如下方法:
      Connection con = DataSourceUtils.getConnection(getDataSource());
      如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作;繁琐且代码看起来不直观。
      此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取  ResultSet去获取值/赋值等操作,提高开发效率;
      如下:return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class)

    配置环境:

      导入jar包:

        IOC需要的jar包:

          commons-logging-1.1.3.jar
          spring-aop-4.0.0.RELEASE.jar //注解会使用到的包
          spring-beans-4.0.0.RELEASE.jar
          spring-context-4.0.0.RELEASE.jar
          spring-core-4.0.0.RELEASE.jar
          spring-expression-4.0.0.RELEASE.jar

        MySQL驱动包、c3p0jar包:   

          c3p0-0.9.1.2.jar
          mysql-connector-java-5.1.37-bin.jar

        JdbcTemplate需要的jar包:

          spring-jdbc-4.0.0.RELEASE.jar
          spring-orm-4.0.0.RELEASE.jar
          spring-tx-4.0.0.RELEASE.jar

    在IOC容器中配置数据源:

      即在applicationContext.xml中

      

    <!-- 引入外部属性文件-->
        <context:property-placeholder location="classpath:jdbc.properties" />
        <!-- 配置数据源 -->
        <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="${jdbc.user}"></property>
            <property name="password" value="${jdbc.password}"></property>
            <property name="jdbcUrl" value="${jdbc.url}"></property>
            <property name="driverClass" value="${jdbc.driver}"></property>
        </bean>

    其中jdbc.properties文件内容:

      jdbc.user=root

      jdbc.password=1234

      jdbc.url=jdbc:mysql://localhost:3306/test

      jdbc.driver=com.mysql.jdbc.Driver

    在IOC容器中配置JdbcTemplate对应的bean 

    <!--配置jdbcTemplate,并装配DataSource数据源属性  -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="comboPooledDataSource"></property>
        </bean>

    测试数据源: 

      建立一个Junit Test Case 类:

      将emp_id=5的记录的salary字段更新为1300.00【更新操作】
      

    public class TestDataSource {
            private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
            private JdbcTemplate template=ioc.getBean(JdbcTemplate.class);
    
            @Test
            public void test01(){
                //实验2:将emp_id=5的记录的salary字段更新为1300.00
                String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?";
                template.update(sql, 1300,5);//第一个是sql语句,后面的按着顺序传入参数即可,这个update方法是接收的可变参数!参数的个数和类型不收限制。
            }    

    从上述实验中就可以看到,该操作不用我们自己再去获取数据库连接信息了,而是直接传递sql语句及其参数!

     

    批量插入 :

    public class TestDataSource {
                    private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
                    private JdbcTemplate template=ioc.getBean(JdbcTemplate.class);
                    @Test
                    public void testBatch(){
                        String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(?,?)";
                        //执行sql语句需要传递的参数 ,一个类型为Object数组的list集合。    
                        List<Object[]> list = new ArrayList<Object[]>();
                        list.add(new Object[]{"Tom2015",1000});
                        list.add(new Object[]{"Tom2016",2000});
                        list.add(new Object[]{"Tom2017",3000});                  
                        template.batchUpdate(sql, list);//批量插入,所以用带有batch的batchupdate方法,该方法有两个参数,前一个为SQL,后一个为参数集合。
                    }
            }

    查询:

      emp_id=5的数据库记录,封装为一个Java对象返回 分析:封装为一个对象返回的话,首先我们需要有一个与数据表对应的实体类!

    @Test
                public void test01(){
                    //需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!
                    String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE emp_id=?";
                    
                    //RowMapper是一个接口,这里我们使用其子类
                    RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
                    //最后一个参数是可变参数,用于向sql语句中依次传递参数!
                    Employee employee = template.queryForObject(sql, rowMapper, 5);
                    System.out.println(employee);
                }
            }

    查询集合:

      查询salary>4000的数据库记录,封装为List集合返回

    public class TestDataSource {
                private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
                private JdbcTemplate template=ioc.getBean(JdbcTemplate.class);
                
                @Test
                public void test01(){
                    //需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!
                    String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE salary > ?";
                    
                    //RowMapper是一个接口,这里我们使用其子类
                    RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
                    //该query方法查询出来的是一个list列表,query方法的最后一个参数是可变参数!
                    List<Employee> list = template.query(sql, rowMapper, 4000);
                    
                    for (Employee employee : list) {
                        System.out.println(employee);
                    }
                }
            }
            

      

      

  • 相关阅读:
    SQl语句学习笔记(二)
    Adaboost 算法
    降维PCA技术
    scanf 格式化字符串详解
    大小端模式和位域详解(转载)
    推荐系统开源软件列表汇总和点评(转载)
    遗传算法入门(转载)
    大白话解析模拟退火算法(转载)
    机器学习相关——协同过滤(转载)
    python面向对象之单例模式
  • 原文地址:https://www.cnblogs.com/xuesheng/p/7460424.html
Copyright © 2020-2023  润新知