当前位置: 首页 > news >正文

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容器中声明它的单个实例

转载于:https://www.cnblogs.com/mazhitao/p/7461438.html

相关文章:

  • 20160323实盘短线操作
  • Java 开发必会的 Linux 命令
  • 第三季度斩获重要投资的15家网络安全公司
  • 被迫尝试了各个版本的asm库读取类annotation
  • 思科推出新一代互联网边界防火墙 助力企业兼顾性能与安全
  • MacBook小技巧
  • 瞧!那个SSD领域的后来者正变为引领者
  • 【转】Data URL和图片,及Data URI的利弊
  • 高效运维最佳实践七字诀,不再憋屈的运维!
  • 报org.hibernate.MappingException: Unknown entity,可能
  • 从世界杯看社交大数据分析如何为行业客户创造价值
  • 前端开发者必备的20个在线工具和指南
  • 轻量函数式 JavaScript:三、管理函数输入
  • javascript视频教程之《ECMA5核心+设计模式》
  • 五家共井(第1届第3题)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JavaScript新鲜事·第5期
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • learning koa2.x
  • maya建模与骨骼动画快速实现人工鱼
  • PHP的类修饰符与访问修饰符
  • Python实现BT种子转化为磁力链接【实战】
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • storm drpc实例
  • Web Storage相关
  • Yii源码解读-服务定位器(Service Locator)
  • 回顾2016
  • 技术发展面试
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端工程化(Gulp、Webpack)-webpack
  • 数据仓库的几种建模方法
  • 突破自己的技术思维
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Prometheus VS InfluxDB
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #ifdef 的技巧用法
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #在 README.md 中生成项目目录结构
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2.2w字)前端单元测试之Jest详解篇
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)u-boot-nand.bin的下载
  • (原)本想说脏话,奈何已放下
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)平衡树
  • . Flume面试题
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET项目中存在多个web.config文件时的加载顺序