• JDBCTemplate


    JDBCTemplate技术

    JDBCTemplate概述

    Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装。语法风格非常接近DBUtils。
    JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTemplate也是为声明式事务做准备,毕竟要对数据库中的数据进行操纵!
    JdbcTemplate中并没有提供一级缓存,以及类与类之间的关联关系!就像是spring提供的一个DBUtils。
    Spring对数据库的操作使用JdbcTemplate来封装JDBC,结合Spring的注入特性可以很方便的实现对数据库的访问操作。使用JdbcTemplate可以像JDBC一样来编写数据库的操作代码


    JDBCTemplate的作用

    Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
    Spring提供的JdbcTemplate对jdbc做了封装,大大简化了数据库的操作。
    如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作;繁琐且代码看起来不直观。此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值/赋值等操作,提高开发效率。


    配置环境

    1.导入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

    2.在IOC容器中配置数据源(applicationContext.xml文件中配置)

    <!-- 加载properties文件中 信息 -->
            <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.passowrd}"></property>
                <property name="jdbcUrl" value="${jdbc.url}"></property>
                <property name="driverClass" value="${jdbc.driver}"></property>
            </bean>

    其中jdbc.properties文件内容:
    jdbc.user=root
    jdbc.passowrd=123456
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.driver=com.mysql.jdbc.Driver

    3.在IOC容器中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中.

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

    持久化操作

    1.增删改操作

    JdbcTemplate.update(String sql, Object...)

    实例:

    private ApplicationContext ioc = new ClassPathXmlApplicationContext("applictionContext.xml");
        private JdbcTemplate template=ioc.getBean(JdbcTemplate.class);
        String sql="update employee set salary=? where emp_id=?";
        template.update(sql, 1300,5);

    2.批量增删改

    JdbcTemplate.batchUpdate(String sql, List<Object[]>)
    Object[]封装了SQL语句每一次执行时所需要的参数
    List集合封装了SQL语句多次执行时的所有参数
    
    String sql="INSERT INTO employee(emp_name,salary) VALUES(?,?)";
        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);

    3.查询单行

    JdbcTemplate.queryForObject(String sql, RowMapper<Department>, Object...)

    这里写图片描述

    //需要注意的是: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);

    4.查询多行

    JdbcTemplate.query(String, RowMapper<Department>, Object...)

    RowMapper对象依然可以使用BeanPropertyRowMapper

    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);
            }

    5.查询单一值
    JdbcTemplate.queryForObject(String, Class, Object…)

    String sql = "SELECT MAX(salary) FROM employee";
            //需要指定返回值的类型,而且类型必须是包装类型
            Double maxSalary = template.queryForObject(sql, Double.class);
            System.out.println(maxSalary);

    使用具名参数的JdbcTemplate

    1.具名参数:在Hibernate的HQL查询中我们体验过具名参数的使用,相对于基于位置的参数,具名参数具有更好的可维护性,在SQL语句中参数较多时可以考虑使用具名参数。
    在Spring中可以通过NamedParameterJdbcTemplate类的对象使用带有具名参数的SQL语句。

    2.通过IOC容器创建NamedParameterJdbcTemplate对象

    <!-- 配置可以使用具名参数的JDBCTemplate类对象 -->
    <bean 
        id="namedTemplate" 
        class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <!-- 没有无参构造器,必须传入数据源或JdbcTemplate对象 -->
        <constructor-arg ref="dataSource"/>
    </bean>

    3.具名参数在SQL语句中的格式

    INSERT INTO depts (dept_name) VALUES (:deptName)

    4.具名参数传入
    ①通过Map对象传入

    NamedParameterJdbcTemplate.update(String, Map<String, ?>)

    Map的键是参数名,值是参数值

    ②通过SqlParameterSource对象传入

    String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(:paramName,:paramSalary)";
            Map<String,Object> paramMap = new HashMap<String,Object>();
    
            paramMap.put("paramName", "赵三");
            paramMap.put("paramSalary",1500);
    
            namedJdbcTemplate.update(sql, paramMap);

    通过对象传入参数

    String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(:empName,:salary)";
            //该BeanPropertySqlParameterSource类构造器需要一个对象参数,该对象参数是一个封装了sql语句参数的对象!
            //此时要求对象的属性名要和sql中的参数名保持一致!这里我们使用Employee对象来完成
            Employee employee= new Employee(null, "郭富城", 1500);
            Employee employee2=new Employee(null, "zhangsan", 2000);
            //以实体对象的形式封装具名参数和值
            SqlParameterSource source = new BeanPropertySqlParameterSource(employee);   
            namedJdbcTemplate.update(sql, source);

    JdbcTemplate类是线程安全的,所以可以在IOC容器中声明它的单个实例

  • 相关阅读:
    Spring security 浅谈用户验证机制
    Spring Boot Oauth2
    解决端口被占用问题
    Intellij idea run dashboard面板
    深入了解Vue组件 — Prop(上)
    深入了解Vue组件 — 组件注册
    使用命令行工具创建Vue项目
    Vue.js — 组件基础
    Vue.js — 表单输入绑定
    Vue.js — 事件处理
  • 原文地址:https://www.cnblogs.com/mazhitao/p/7461438.html
Copyright © 2020-2023  润新知