一、Spring模板JdbcTemplate

为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate。

作为 Spring JDBC 框架的核心, JDBC 模板JdbcTemplate的设计目的是为不同类型的 JDBC 操作提供模板方法。每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务。通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低。





二、在Spring中配置使用JdbcTemplate

1、在XML中配置JdbcTemplate

使用JdbcTemplate需要结合C3P0数据源,这里采用引用外部属性文件的方式配置数据源。

  1. <!-- 导入资源文件 -->
  2. <context:property-placeholder location="classpath:db.properties"/>
  3.  
  4. <!-- 配置 C3P0 数据源 -->
  5. <bean id="dataSource"
  6. class="com.mchange.v2.c3p0.ComboPooledDataSource">
  7. <property name="user" value="${jdbc.user}"></property>
  8. <property name="password" value="${jdbc.password}"></property>
  9. <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
  10. <property name="driverClass" value="${jdbc.driverClass}"></property>
  11.  
  12. <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
  13. <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
  14. </bean>
  15.  
  16. <!-- 配置 Spirng 的 JdbcTemplate -->
  17. <bean id="jdbcTemplate"
  18. class="org.springframework.jdbc.core.JdbcTemplate">
  19. <property name="dataSource" ref="dataSource"></property>
  20. </bean>

2、在程序中获取JdbcTemplate

与获取其他bean对象类似

  1. private ApplicationContext ctx=null;
  2. private JdbcTemplate jdbcTemplate;
  3. {
  4. ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//初始化IOC容器
  5. jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");//通过IOC容器获取JdbcTemplate对象
  6. }

三、JdbcTemplate操作数据库

1、update方法:更新数据库

调用形式:

  1. jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); //通过IOC容器获取JdbcTemplate对象
  2. String sql="UPDATE employees SET last_name= ? WHERE id= ?"; //定义执行的SQL语句
  3. jdbcTemplate.update(sql, "Kang",1);//传递参数

update方法可以执行INSERT, UPDATE, DELETE的数据库操作。

例如:

INSERT操作

  1. String sql="INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";
  2. jdbcTemplate.update(sql, "Kang","Kang@qq.com",1);

DELETE操作

  1. String sql="DELETE FROM employees WHERE id= ?";
  2. jdbcTemplate.update(sql,1);

2、batchUpdate方法:批量更新数据库

调用形式:

  1. String sql="INSERT INTO employees(last_name,email,dept_id) VALUES(?,?,?)";
  2. List<Object[]> batchArgs=new ArrayList<>();
  3. batchArgs.add(new Object[]{"AA","aa@qq.com",2});
  4. batchArgs.add(new Object[]{"BB","bb@qq.com",3});
  5. batchArgs.add(new Object[]{"CC","cc@qq.com",1});
  6. batchArgs.add(new Object[]{"DD","dd@qq.com",4});
  7. jdbcTemplate.batchUpdate(sql, batchArgs);

batchUpdate的第二个参数batchArgs是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组, 那么多条就需要一个Object[]的集合。

batchUpdate方法可以批量执行INSERT, UPDATE, DELETE的数据库操作,具体实现方法与上述方法类似,不做详述。



3、queryForObject方法:查询单行和统计查询

---查询单行的调用形式:

  1. //已经定义好了Employee类为一个POJO类,并提供了相应的get/set方法
  2. String sql = "SELECT id, last_name lastName, email, dept_id deptId FROM employees WHERE id = ?";
  3. RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
  4. Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);//直接返回一个相应的对象
  5. System.out.println(employee);

queryForObject方法从数据库中获取一条记录, 实际得到对应的一个对象。

这里需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)方法。

其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper,传入对应的类即可完成映射。

而在SQL语句中,需要使用SQL中列的别名完成列名和类的属性名的映射. 例如 last_name lastName和dept_id deptId。需要注意的是指定的别名(lastName和deptId)必须和类中的属性名保持一致。



---统计查询的调用形式:

  1. String sql = "SELECT count(id) FROM employees";//查询数据表的总记录数
  2. long count = jdbcTemplate.queryForObject(sql, Long.class);//第二个参数表示返回值的类型
  3. System.out.println(count);

4、query方法:查询多行

调用形式:

  1. String sql = "SELECT id, last_name lastName, email, dept_id deptId FROM employees WHERE id > ?";
  2. RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
  3. List<Employee> employees = jdbcTemplate.query(sql, rowMapper,2);//查询id>2的结果集合
  4. System.out.println(employees);

query查到的是实体类的集合。注意调用的不是 queryForList 方法。

其他实现细节与queryForObject方法类似。





5、JdbcTemplate的使用简化

每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下。而JdbcTemplate 类被设计成为线程安全的, 所以可以在 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中。同时JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发。





四、使用具名参数

1、为什么使用具名参数

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。 

在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)。 

具名参数是指SQL 按名称(以冒号开头)而不是按位置进行指定。具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。

注意:具名参数只在 NamedParameterJdbcTemplate 中得到支持 





2、配置XML启用具名参数

  1. <!-- 配置 NamedParameterJdbcTemplate, 该对象可以使用具名参数, 其没有无参数的构造器, 所以必须为其构造器指定参数-->
  2. <bean id="namedParameterJdbcTemplate"
  3. class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
  4. <constructor-arg ref="dataSource"></constructor-arg>
  5. </bean>

3、使用NamedParameterJdbcTemplate操作数据库

使用方法:

  1. //使用具名参数
  2. String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(:lastName,:email,:deptid)";
  3. Map<String, Object> paramMap = new HashMap<>();
  4. paramMap.put("lastName", "kang");
  5. paramMap.put("email", "kang@qq.com");
  6. paramMap.put("deptid", 2);
  7. namedParameterJdbcTemplate.update(sql, paramMap);//第二个参数是具名参数和实际值得映射Map。

可以看到使用具名参数时,必须使用Map结构来对具名参数和实际值进行一一映射,并将其传入相关方法中。批量更新时可以提供Map型的数组。

其他操作数据库的方法与之前一致,只是需要传入map来完成映射。

Spring中的JDBC操作的更多相关文章

  1. 【转】在Spring中基于JDBC进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...

  2. spring框架总结(04)----介绍的是Spring中的JDBC模板

    1.1  Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...

  3. Spring中使用JDBC

    Spring中的数据库异常体系 使用JDBC(不使用Spring)的时候,我们需要强制捕获SQLException,否则无法使用JDBC处理任何事情.SQLException表示尝试访问数据库的时候出 ...

  4. Spring框架学习(3)spring中使用jdbc

    内容源自:spring中使用jdbc spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作 ...

  5. Spring 对JDBC操作的支持

    1.Spring 对JDBC操作的支持 Spring对jdbc技术提供了很好的支持,体现在: 1.Spring对c3p0连接池的支持很完善 2.Spring对jdbc提供了jdbcTemplate,来 ...

  6. 在Spring中配置jdbc为什么不能用${username}问题

    楼主在spring中配置jdbc时,引用的是dbcp.jar包,在dataSource.properties配置文件中,有mysql用户名,楼主自然的选择了使用username,密码是root, 然后 ...

  7. Spring 中的 JDBC 事务

    Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...

  8. Spring中的事务操作

    事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...

  9. Spring 中的事务操作、注解、以及 XML 配置

    事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQ ...

随机推荐

  1. HibernateException: No Hibernate Session bound to thread

    解决No Hibernate Session bound to thread 背景交代 在使用this.getHibernateTemplate().getSessionFactory().getCu ...

  2. wpf LookUpEdit PopupContentTemplate

    <dxg:LookUpEdit Name="searchLookUpEdit" HorizontalAlignment="Stretch" PopupHe ...

  3. LeetCode OJ--Path Sum *

    https://oj.leetcode.com/problems/path-sum/ 树的深搜,求从根到叶子的路径. 记住深搜的样子 #include <iostream> using n ...

  4. Latex algorithm

    方式一 需要包含的 \usepackage[noend]{algpseudocode} \usepackage{algorithmicx,algorithm} 源码 \begin{algorithm} ...

  5. 洛谷—— P2117 小Z的矩阵

    https://www.luogu.org/problemnew/show/2117 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1 ...

  6. logging模块配置共享以及使用文件配置

    1.配置共享 如果每个文件都配置logging,那就太繁琐了,logging提供了父子模块共享配置的机制, 会根据Logger的名称来自动加载父模块的配置.首先定义一个 main.py 文件: imp ...

  7. 【APIO2015】Bali Sculptures

    题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 $N$ 座雕塑,为方便起见,我们把这些雕塑从 $1$ 到 $N$ 连续地进行标号,其中第 $i$ 座雕塑的年 ...

  8. MVP的理解和使用

    MVP大家应该差不多都知道了,他其实是MVC的升华版,差不多是在view和model中加了一个调节器,这样view不能直接调用model中得数据,而是通过presenter来进行操作,此外Presen ...

  9. angular http ajax header

    myAppModule.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common ...

  10. 1.【nuxt起步】-nuxt是什么?

    百度了解下,简单说就是vue的seo化,因为vue是spa,不支持seo,从本地运行的源码可以看出来,html没有tkd和相关文字,导致百度收录困难,所以nuxt可以很好的解决这个问题, 举个例子:纯 ...