JDBC template

mysql

JDBC(Java DataBase Connectivity 数据库连接),是一种用于执行 SQL 语句的 Java API,由 sun 公司开发,放在 jdk 中的 sql 包下和 javax.sql 包下,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。

通常情况下使用JDBC完成以下操作:

  1. 同数据库建立连接;
  2. 向数据库发送 SQL 语句;
  3. 处理从数据库返回的结果;

JDBC 具有以下优化:

  • JDBC 与 ODBC(open Database Connectivity,即开放数据库连接)十分相似,便于软件开发人员理解;
  • JDBC 使软件开发人员从复杂的驱动程序编写中解脱出来,可以完全专注于业务逻辑开发;
  • JDBC 支持多种关系型数据库,大大增加了软件的可移植性;
  • JDBC API 是面向对象的,软件开发人员可以将常用的方法进行二次封装,从而提高代码的重要性;
为了简化持久化操作,Spring 在 JDBC API 之上提供了 JDBC Template 组件

spring 分装前:

程序员代码 --> JDBC API --> JDBC 驱动 --> 数据库

spring 分装后:

程序员代码 --> JDBC Template --> JDBC API --> JDBC驱动 --> 数据库

JDBC API

public Role getRole(Long id) { Role role = null; // 声明 JDBC 变量 Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { // 注册驱动程序 Class.forName("com.mysql.jdbc.Driver"); //获取连接 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/chapter12", "root", "123456"); // 预编译SQL ps = con.prepareStatement("select id, role_name, note from t_role where id = ?"); // 设置参数 ps.setLong(1, id); // 执行SQL rs = ps.executeQuery(); // 组装结果返回POJO while (rs.next()) { role = new Role(); role.setId(rs.getLong(1)); role.setRoleName(rs.getString(2)); role.setNote(rs.getString(3)); } } catch (ClassNotFoundException | SQLException e) { // 异常处理 e.printStackTrace(); } finally { // 关闭sql执行 try { if (rs != null && !rs.isClosed()) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } // 关闭预编译 try { if (ps != null && !ps.isClosed()) { ps.close(); } } catch (SQLException e) { e.printStackTrace(); } // 关闭连接 try { if (con != null && con.isClosed()) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } return role; } }

JDBC Template

Integer count = jdbcTemplate.queryForObject("select count(*) from student", Integer.class);

使用 Spring-jdbcTemplate准备

  • 引入 jar包(spring 基础jar包、aop、jdbc、tx、Mysql驱动)
  • 配置dataSource源
<!--引入本地数据库配置--> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///selection_course?useUnicode=true&amp;characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean>
  • 配置 JdbcTemplate
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>

JdbcTemplate 基本使用

  • execute方法
  • update与batchUpdate方法
  • query与queryXXX方法
  • call方法

execute对数据库DDR操作

update操作单个增删改
// API int update(String sql, Object[] args) int update(String sql, Object... args)
batchUpdate批量增删改
int[] batchUpdate(String[] sql) int[] batchUpdate(String sql, List<Object>[]>)
单个简单查询
T queryForObject(String sql, Class<T> type) T queryForObject(String sql, Object[] args, Class<T> type) T queryForObject(String sql, Class<T> type, Object... arg)
获取多个
List<T> queryForList(String sql, Class<T> type) List<T> queryForList(String sql, Object[] args, Class<T> type) List<T> queryForList(String sql, Class<T> type, Object... arg)

查询复杂对象(封装为Map)

获取单个
Map queryForMap(String sql) Map queryForMap(String sql, Object[] args) Map queryForMap(String sql, Object... arg)
获取多个
List<Map<String, Object>> queryForList(String sql) List<Map<String, Object>> queryforList(String sql, Object[] args) List<Map<String, Object>> queryForList(String sql, Object... arg)

查询复杂对象(封装为实体对象)

spring jdbcTemplate 是通过实现 org.springframework.jdbc.core.RowMapper 这个接口来完成对 entity 对象映射

获取一个
T queryForObject(String sql, RowMapper<T> mapper) T queryForObject(String sql, Object[] args, RowMapper<T> mapper) T queryForObject(String sql, RowMapper<T> mapper, Object... arg)
获取多个
List<T> query(String sql, RowMapper <T> mapper) List<T> query(String sql, Object[] args, RowMapper<T> mapper) List<T> query(String sql, RowMapper<T> mapper, Object... arg)

执行多条SQL

通过实现 ConnectionCallback 或者 StatementCallback 接口的方法获取 Connection 对象 或者 Statement 对象,这样便能够执行多条 SQL 了。

参考文章

JdbcTemplate
Spring JdbcTemplate的原理及实际使用
Java操作数据库方式一JDBC使用详解