Spring的连接数据库以及JDBC模板(实例讲解)

前言

今天介绍的是关于Spring的数据库连接以及Jdbc模板的相关API方法,虽然在学习了hibernate之后,会知道实现数据库连接一般都是使用hibernate等持久化框架来实现的。但是,很多时候一些涉及到事务的东西使用这些框架并不能够实现,所以我们还需要结合spring来实现相关的需要。

一、创建工程、导包

要想使用Spring的jdbc模板前,还需要导入相关的jar包:

二、进行相关的bean的创建以及工具类的编写

2.1在数据库中创建了两张表,使用spring的jdbcTemplate中的API方法对这两张表进行操作

CREATE TABLE `t_dept` (
 `deptid` int(11) NOT NULL,
 `deptname` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
 `remark` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
 PRIMARY KEY (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin;
CREATE TABLE `user` (
 `USER_ID` int(11) NOT NULL,
 `USER_NAME` varchar(11) DEFAULT NULL,
 `USER_PASSWORD` varchar(11) DEFAULT NULL,
 `USER_ADDRESS` varchar(25) DEFAULT NULL,
 PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2创建实体bean

package com.bean;
/**
 * 创建t_dept表对应的表
 * @author 夜孤寒
 * @version 1.1.1
 *
 */
public class DeptBean {
 private int deptid;
 private String deptname;
 private String remark;
 public DeptBean() {
  super();
 }
 public DeptBean(int deptid, String deptname, String remark) {
  super();
  this.deptid = deptid;
  this.deptname = deptname;
  this.remark = remark;
 }
 public int getDeptid() {
  return deptid;
 }
 public void setDeptid(int deptid) {
  this.deptid = deptid;
 }
 public String getDeptname() {
  return deptname;
 }
 public void setDeptname(String deptname) {
  this.deptname = deptname;
 }
 public String getRemark() {
  return remark;
 }
 public void setRemark(String remark) {
  this.remark = remark;
 }
}

2.3创建spring的工具类——SpringUtil.java

package com.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 读取配置文件的工具类,实现了类似工厂模式的方式
 *
 * @author 夜孤寒
 * @version 1.1.1
 */
public class SpringUtil {
 // 定义属性
 private static ApplicationContext context;
 // 读取配置文件
 static {
  context = new ClassPathXmlApplicationContext("spring.xml");
 }

 // 定义一个方法,判断bean是否为空,如果不为空的,获取这个bean
 public static Object getBean(String beanName) {
  // 定义一个空对象
  Object obj = null;
  // 如果beanName不为空的话,那么根据这个beanName获取到bean对象,赋值给obj并返回
  if (beanName != null && !beanName.equals("")) {
   obj = context.getBean(beanName);
  }
  return obj;
 }
}

2.4进行配置文件的相关配置——spring.xml文件的配置

因为要介绍的API方法可能比较多,所以一次性将写过的xml全部粘贴了,读者可以根据对应的配置,去对应到相应的类中:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

 <!-- 方式一:
   配置使用IOC:直接引用
  -->
  <!-- 首先需要引入一个驱动,然後到這驱动类下面,去查看他的源代码,一下是mysql需要注入的对象 -->
  <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
   <property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc_test"></property>
   <property name="username" value="root"></property>
   <property name="password" value="root"></property>
  </bean>

  <!-- 使用DI注入的构造方法注入的方式来注入,并且查询我们的数据库中的数据。
    注意这里我们还需要一我们之前的dataSource作为引用
  -->
  <bean name="testMain_2" class="com.jdbc.TestMain_2">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 使用我们的模板来获取我们的数据库中的数据 -->
  <bean name="testMain_3" class="com.jdbc.TestMain_3">
   <!-- 首先我们还是需要引入我们的数据库资源,也就是我们之前已经配置过的dataSource -->
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 方式四 -->
  <!-- 配置我们模板,然后在类就只要将这个模板用构造方法的方式注入就可以了 -->
  <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
   <property name="dataSource" ref="dataSource"></property>
  </bean>
  <!-- 配置我们的testMain_4,然后引用我们上面配置的模板 -->
  <bean name="testMain_4" class="com.jdbc.TestMain_4">
   <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  </bean>

  <!-- 方式五:
    直接继承JdbcDaoSupport这个父类,然后用里面的方法获取到模板,
    从而获取到数据。
    备注:这个是最完美的获取数据的方式,以后一般都是使用这种方式!!!
  -->
  <bean name="testMain_5" class="com.jdbc.TestMain_5">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 使用spring配置的方式操作我们的DDL语句 -->
  <bean name="testMain_6" class="com.jdbc.TestMain_6">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 使用spring配置的方式操作我们的DML语句 -->
  <bean name="testMain_7" class="com.jdbc.TestMain_7">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 使用JdbcTemplate模板中的命名参数来操作我们的DML语句 -->
  <bean name="testMain_8" class="com.jdbc.TestMain_8">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 使用JdbcTemplate模板对于查询语句的封装 -->
  <bean name="testMain_9" class="com.jdbc.TestMain_9">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

</beans>

2.5介绍spring对于jdbc的模板的支持

(1)数据库的连接

对应xml中的配置为:

<!-- 方式一:
   配置使用IOC:直接引用
  -->
  <!-- 首先需要引入一个驱动,然後到這驱动类下面,去查看他的源代码,一下是mysql需要注入的对象 -->
  <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
   <property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc_test"></property>
   <property name="username" value="root"></property>
   <property name="password" value="root"></property>
  </bean>

对应的测试类:

package com.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.util.SpringUtil;
/**
 * 连接数据库的测试类
 * @author 夜孤寒
 * @version 1.1.1
 *
 */
public class TestMain_1 {
 public static void main(String[] args) {
  /*
   * 本来需要用applicationContext获取到我们的bean对象,
   * 这里使用工厂类的方法将之独立出来,具体使用见SpringUtil.java
   */
  DataSource datasource=(DataSource)SpringUtil.getBean("dataSource");
  Connection conn=null;
  try{
   conn=datasource.getConnection();
  }catch(SQLException e){
   e.printStackTrace();
  }
  System.out.println(conn);//测试是否能够输出连接
 }
}

测试结果:

由此可见测试成功可以获取到相应的数据库连接。

(2)测试从创建的user表中查询出相应的数据

对应xml配置为:

<!-- 使用DI注入的构造方法注入的方式来注入,并且查询我们的数据库中的数据。
    注意这里我们还需要一我们之前的dataSource作为引用
  -->
  <bean name="testMain_2" class="com.jdbc.TestMain_2">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

对应的测试类为:

package com.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;

import javax.sql.DataSource;

import com.mysql.jdbc.Statement;
import com.util.SpringUtil;

/**
 * 从创建的user表中查询相关的数据
 *
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestMain_2 {
 // 使用构造方法注入
 public DataSource datasource;

 public void setDataSource(DataSource datasource) {
  this.datasource = datasource;
 }

 /**
  * 从user表中获取所有数据
  */
 public void list() {
  /*
   * 在我们的main方法中获取到我们的datasource, 然后就能够获取连接,并且获取到数据库中的数据。
   */
  Connection conn = null;
  Statement stmt = null;
  ResultSet rs = null;
  String sql = "select * from user";
  try {
   conn = datasource.getConnection();
   stmt = (Statement) conn.createStatement();
   rs = stmt.executeQuery(sql);
   while (rs.next()) {
    System.out.println(rs.getInt("user_id") + "\t" + rs.getString("user_name") + "\t"
      + rs.getString("user_password") + "\t" + rs.getString("user_address"));
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   /*
    * 需要自己关闭资源
    */
  }
 }

 public static void main(String[] args) {
  // 获取到我们bean对象
  TestMain_2 testMain_2 = (TestMain_2) SpringUtil.getBean("testMain_2");
  // 调用我们的list方法
  testMain_2.list();
 }
}

测试结果:

备注:本测试类,使用的是常用的纯粹的jdbc获取数据的方式。

(3)使用JdbcTemplate这个类来获取到后端的数据

对应的xml文件的配置为:

<!-- 使用我们的模板来获取我们的数据库中的数据 -->
  <bean name="testMain_3" class="com.jdbc.TestMain_3">
   <!-- 首先我们还是需要引入我们的数据库资源,也就是我们之前已经配置过的dataSource -->
   <property name="dataSource" ref="dataSource"></property>
  </bean>

对应的测试类:

package com.jdbc;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import com.util.SpringUtil;
/**
 * 使用jdbcTemplate这个类来获取后台数据
 * @author 夜孤寒
 *
 */
public class TestMain_3 {
 // 使用构造方法注入
 public DataSource datasource;

 public void setDataSource(DataSource datasource) {
  this.datasource = datasource;
 }

 public void list() {
  /*
   * 使用我们JdbcTemplate模板来获取我们的数据
   */
  JdbcTemplate jdbcTemplate=new JdbcTemplate(this.datasource);
  String sql="select * from user";
  List<Map<String, Object>>userlist=jdbcTemplate.queryForList(sql);
  for(Map<String, Object>rowMap:userlist){
   System.out.println(rowMap);
  }
 }

 public static void main(String[] args) {
  //获取到我们bean对象
  TestMain_3 testMain_3=(TestMain_3)SpringUtil.getBean("testMain_3");
  //调用我们的list方法
  testMain_3.list();
 }
}

测试的结果:

这种方式的话每次我们都要创建一个JdbcTemplate实例,这样子比较复杂,所以考虑能不能将这个类让Spring自己创建,然后在bean配置文件中引用数据源来达到目的。这就是下面要介绍的第四种方式。

(4)在配置文件中配置我们的模板类,让Spring生成需要的bean

对应的xml配置文件为:

<!-- 方式四 -->
  <!-- 配置我们模板,然后在类就只要将这个模板用构造方法的方式注入就可以了 -->
  <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
   <property name="dataSource" ref="dataSource"></property>
  </bean>
  <!-- 配置我们的testMain_4,然后引用我们上面配置的模板 -->
  <bean name="testMain_4" class="com.jdbc.TestMain_4">
   <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  </bean>

对应的测试类为:

package com.jdbc;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;

import com.util.SpringUtil;

/**
 * 在配置文件中配置模板,让spring去创建模板类
 *
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestMain_4 {
 // 使用构造方法的方式注入template
 public JdbcTemplate jdbcTemplate;

 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }

 public void list() {
  /*
   * 使用我们IOC注入模板,然后引用这个使用IOC注入的模板, 最后取出我们的数据
   */
  String sql = "select USER_NAME from user";
  List<Map<String, Object>> userlist = this.jdbcTemplate.queryForList(sql);
  for (Map<String, Object> rowMap : userlist) {
   System.out.println(rowMap);
  }
 }

 public static void main(String[] args) {
  // 获取到我们bean对象
  TestMain_4 testMain_4 = (TestMain_4) SpringUtil.getBean("testMain_4");
  // 调用我们的list方法
  testMain_4.list();
 }
}

测试结果:

这种方式仍旧需要在xml中配置,而在spring中还有一种更加方便的方式就是直接继承JdbcDaoSupport这个类,这种方式是最简单的,也是最常用的方式。下面笔者就简单介绍一下这种方式的使用。

(5)继承JdbcDaoSupport类来获取数据库中的数据

对应的xml文件中的配置为:

<!-- 方式五:
    直接继承JdbcDaoSupport这个父类,然后用里面的方法获取到模板,
    从而获取到数据。
    备注:这个是最完美的获取数据的方式,以后一般都是使用这种方式!!!
  -->
  <bean name="testMain_5" class="com.jdbc.TestMain_5">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

对应的测试类为:

package com.jdbc;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.util.SpringUtil;
/**
 * 继承JdbcDaoSupport来获取模板,再通过模板来获取数据
 * @author 夜孤寒
 * @version 1.1.1
 *
 */
public class TestMain_5 extends JdbcDaoSupport {
 /*
  * 不使用DI注入的方式,直接继承一个上述的父类, 观察上述的父类,发现在这个父类里面已经实现了类似注入JdbcTemplate模板。
  */

 public void list() {
  String sql = "select * from user";
  List<Map<String, Object>> userlist = this.getJdbcTemplate().queryForList(sql);
  for (Map<String, Object> rowMap : userlist) {
   System.out.println(rowMap);
  }
 }

 public static void main(String[] args) {
  // 获取到我们bean对象
  TestMain_5 testMain_5 = (TestMain_5) SpringUtil.getBean("testMain_5");
  // 调用我们的list方法
  testMain_5.list();
 }
}

测试结果为:

(6)使用Spring注入的方式来操作DDL语句

对应xml文件中的配置为:

<!-- 使用spring配置的方式操作我们的DDL语句 -->
  <bean name="testMain_6" class="com.jdbc.TestMain_6">
   <property name="dataSource" ref="dataSource"></property>
  </bean>

对应的测试类为:

package com.jdbc;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.util.SpringUtil;

/**
 * 使用spring注入的方式进行DDL操作
 *
 * @author 夜孤寒
 * @version 1.1.1
 *
 */
public class TestMain_6 extends JdbcDaoSupport {
 /*
  * 创建表
  */
 public void create() {
  StringBuffer createSQL = new StringBuffer();
  createSQL.append("create table T_Temp_XX(id int,testname varchar(30))");
  this.getJdbcTemplate().execute(createSQL.toString());
 }

 /*
  * 修改表,这里面可以添加或者删除某一个属性列
  */
 public void alter() {
  StringBuffer alterSQL = new StringBuffer();
  alterSQL.append("alter table T_Temp_XX add testpassword varchar(30)");
  this.getJdbcTemplate().execute(alterSQL.toString());
 }

 /*
  * 删除一张表
  */
 public void drop() {
  StringBuffer dropSQL = new StringBuffer();
  dropSQL.append("drop table T_Temp_XX");
  this.getJdbcTemplate().execute(dropSQL.toString());
 }

 /*
  * 测试方法
  */
 public static void main(String[] args) {
  // 获取到我们bean对象
  TestMain_6 testMain_6 = (TestMain_6) SpringUtil.getBean("testMain_6");
  // 调用我们的方法,一次调用一个方法,打开数据库观察数据库是不是已经变化了
  // testMain_6.create();
  // testMain_6.alter();
  testMain_6.drop();
 }
}

经过测试可以进行DDL操作。

(7)使用spring注入的方式进行DML操作

对应xml文件中的配置:

<!-- 使用spring配置的方式操作我们的DML语句 -->
<bean name="testMain_7" class="com.jdbc.TestMain_7">
 <property name="dataSource" ref="dataSource"></property>
</bean>

对应测试类:

package com.jdbc;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.util.SpringUtil;

/**
 * 使用spring配置的方式操作我们的DML语句
 *
 * @author 夜孤寒
 * @version 1.1.1
 */

public class TestMain_7 extends JdbcDaoSupport {
 /*
  * statement的写法
  */
 public void insert() {
  int deptid = 1;
  String deptname = "zhangsan";
  String remark = "zhangsanzhenshuai";
  StringBuffer insertSQL = new StringBuffer();
  insertSQL.append("Insert Into T_Dept(");
  insertSQL.append("deptid,deptname");
  insertSQL.append(",remark");
  insertSQL.append(") values(");
  insertSQL.append("" + deptid + ",");
  insertSQL.append("'" + deptname + "',");
  insertSQL.append("'" + remark + "'");
  insertSQL.append("");
  insertSQL.append(")");
  int rowCount = this.getJdbcTemplate().update(insertSQL.toString());
  System.out.println("rowCount影响的行数= " + rowCount);
 }

 /*
  * prepareStatement的写法
  */
 public void update() {
  StringBuffer updateSQL = new StringBuffer();
  updateSQL.append("update t_dept set ");
  updateSQL.append("deptname = ?,");
  updateSQL.append("remark = ?");
  updateSQL.append(" where deptid=?");
  int rowCount = this.getJdbcTemplate().update(updateSQL.toString(), new PreparedStatementSetter() {
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1, "lisi");
    ps.setString(2, "lisizhenshuai");
    ps.setInt(3, 1);
   }
  });
  System.out.println("rowCount影响的行数=" + rowCount);
 }

 /*
  * prepareStatement的写法
  */
 public void delete() {
  StringBuffer deleteSQL = new StringBuffer();
  deleteSQL.append("delete from t_dept");
  deleteSQL.append(" where deptid=?");
  /*
   * 关于对象数组的使用:对象数组的第一个元素对应的是SQL语句中的第一个参数问号
   */
  Object[] obj = { 1 };
  int rowCount = this.getJdbcTemplate().update(deleteSQL.toString(), obj);
  System.out.println("rowCount影响的行数=" + rowCount);
 }

 public static void main(String[] args) {
  // 获取到bean对象
  TestMain_7 testMain_7 = (TestMain_7) SpringUtil.getBean("testMain_7");
  // 测试方法
  // testMain_7.insert();
  // testMain_7.update();
  testMain_7.delete();
 }
}

经测试,可以实现DML操作中的增删改查。

(8)使用JdbcTemplate模板中的命名参数来操作我们的DML语句

对应xml中的配置为:

<!-- 使用JdbcTemplate模板中的命名参数来操作我们的DML语句 -->
<bean name="testMain_8" class="com.jdbc.TestMain_8">
 <property name="dataSource" ref="dataSource"></property>
</bean>

对应的测试类:

package com.jdbc;

import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import com.bean.DeptBean;
import com.util.SpringUtil;

/**
 * 使用JdbcTemplate模板中的命名参数来操作我们的DML语句
 *
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestMain_8 extends NamedParameterJdbcDaoSupport {
 /*
  * statement的写法
  */
 public void insert(boolean flag_1, boolean flag_2) {
  int deptid = 1;
  String deptname = "zhangsan";
  String remark = "zhangsanzhenshuai";
  StringBuffer insertSQL = new StringBuffer();
  insertSQL.append("insert into T_Dept(deptid");
  if (flag_1) {
   insertSQL.append(",deptname");
  }
  if (flag_2 == true) {
   insertSQL.append(",remark");
  }
  insertSQL.append(") values(");
  insertSQL.append(":deptid");
  if (flag_1 == true) {
   insertSQL.append(",:deptname");
  }
  if (flag_2 == true) {
   insertSQL.append(",:remark");
  }
  insertSQL.append(")");
  // 将数据放进我们的map中 备注:map中key的名称==命名参数的名称
  Map<String, Object> paramMap = new HashMap<String, Object>();
  paramMap.put("deptid", deptid);
  paramMap.put("deptname", deptname);
  paramMap.put("remark", remark);
  int rowCount = this.getNamedParameterJdbcTemplate().update(insertSQL.toString(), paramMap);
  System.out.println("rowCount影响的行数= " + rowCount);
 }

 /*
  * prepareStatement的写法
  */
 public void update() {
  StringBuffer updateSQL = new StringBuffer();
  updateSQL.append("update T_Dept set");
  updateSQL.append(" deptname = :deptname,");
  updateSQL.append(" remark = :remark");
  updateSQL.append(" where deptid = :deptid");
  updateSQL.append("");
  // 获取到模板
  NamedParameterJdbcTemplate template = this.getNamedParameterJdbcTemplate();
  // 将数据放置到bean里面去
  DeptBean deptbean = new DeptBean();
  deptbean.setDeptid(1);
  deptbean.setDeptname("lisi");
  deptbean.setRemark("lisizhenshuai");
  // 使用一个bean工厂的方法将预处理我们的bean
  BeanPropertySqlParameterSource paramSource = new BeanPropertySqlParameterSource(deptbean);
  // 调用模板方法更新数据
  int rowCount = template.update(updateSQL.toString(), paramSource);
  // 输出影响的行数
  System.out.println("影响的行数rowCount=" + rowCount);
 }

 public static void main(String[] args) {
  // 获取到bean对象
  TestMain_8 testMain_8 = (TestMain_8) SpringUtil.getBean("testMain_8");
  // 测试方法
  // testMain_8.insert(true,true);//由这个参数来控制是不是插入某一个属性列的数据
  testMain_8.update();
 }
}

(9)JdbcTemplate模板对于查询语句的封装

对应的xml文件的配置:

<!-- 使用JdbcTemplate模板对于查询语句的封装 -->
<bean name="testMain_9" class="com.jdbc.TestMain_9">
 <property name="dataSource" ref="dataSource"></property>
</bean>

对应的测试类:

package com.jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.bean.DeptBean;
import com.util.SpringUtil;
/**
 * JdbcTemplate模板对于查询语句的封装测试类
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestMain_9 extends JdbcDaoSupport{
 /*
  * 最简单的一个查询
  */
 public void one(){
  System.out.println("==============================");
  System.out.println("1:返回所有的对象");
  String sql="select * from t_dept order by deptid asc";
  List<Map<String, Object>>deptList=this.getJdbcTemplate().queryForList(sql);
  for(Map<String, Object>rowMap:deptList){
   System.out.println(rowMap);
  }
  System.out.println("==============================");
  System.out.println("2:返回一条对象");
  /*
   * 返回一条对象,将返回的对象使用Map的方式来接收
   */
  sql="select * from t_dept where deptid=1";
  Map<String, Object>rowMap=this.getJdbcTemplate().queryForMap(sql);
  if(rowMap!=null){
   System.out.println(rowMap);
  }
  /*
   * 使用queryForObject方法来接收一个对象:
   *  1、如果方法的第二个参数是class类型的话,表示SQL只能返回一行一列。相当于RowMapper中的SingleColumnRowMapper;
   *  2、如果方法的第二个参数是rowMapper类型的话,表示SQL语句只能返回一行多列。
   *  一行多列,默认是返回queryForMap,但是Spring允许可以对返回的行数据进行自定义的映射
   */
  /*
   * 方式一:返回的class类型
   */
  sql="select count(1) from t_dept where deptid=1";//什么意思?
  Integer dept_count=this.getJdbcTemplate().queryForObject(sql, Integer.class);
  System.out.println("dept_count="+dept_count);
  /*
   * 方式二:返回的是rowMapper的类型
   */
  sql="select * from t_dept where deptid=1";
  BeanPropertyRowMapper<DeptBean>rowMapper=new BeanPropertyRowMapper<DeptBean>(DeptBean.class);
  //需要将返回的数据转换成bean对象
  DeptBean deptbean=this.getJdbcTemplate().queryForObject(sql, rowMapper);
  System.out.println(deptbean.getDeptid()+"\t"+deptbean.getDeptname()+"\t"+deptbean.getRemark());
  System.out.println("==============================");

 }
 /*
  * 复杂的查询queryForXX:
  * 这个是模板封装好的查询方法
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
 public void two(){
  //1、处理有预编译的语句
  String sql="select * from t_dept where deptname like ? order by deptid asc";
  List<Map<String, Object>>deptList=this.getJdbcTemplate().query(sql, new PreparedStatementSetter() {
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    //查询带有"l"这个字符的所有对象
    ps.setString(1, "%l%");
   }
  },new ColumnMapRowMapper());//这里代表返回的是一个什么类型
  System.out.println(deptList);
  //2、处理带有预编译的语句,并且返回的是一个javabean
  List<DeptBean>deptList_2 = this.getJdbcTemplate().query(
    sql, new PreparedStatementSetter() {
     @Override
     public void setValues(PreparedStatement ps)
       throws SQLException {
      ps.setString(1, "%l%");

     }
    }, new BeanPropertyRowMapper(DeptBean.class));
  System.out.println(deptList_2);
  //3、直接处理resultSet???????什么意思
  List<Vector<String>>deptList_3=this.getJdbcTemplate().query(sql, new PreparedStatementSetter() {

   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1, "%l%");
   }
  },new RowMapper() {
   @Override
   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    int deptid = rs.getInt("deptid");
    String deptname = rs.getString("deptname");
    Vector<String> vector = new Vector<String>();
    vector.add(String.valueOf(deptid));
    vector.add(deptname);
    return vector;
   }
  });
  System.out.println(deptList_3);
 }

 /*
  * 使用命名参数的查询:
  * 前提是首先要实例化命名参数查询的对象
  */
 public void three(){//传一个bean条件,返回结果
  //实例化一个对象
  NamedParameterJdbcTemplate template=new NamedParameterJdbcTemplate(this.getDataSource());

  //如果参数是javabean,那么返回值也就是javabean
  String sql="select * from t_dept where deptname like :deptname and remark like :remark";
  //创建一个bean,设置好查询的条件
  DeptBean parambean=new DeptBean();
  parambean.setDeptname("%l%");
  parambean.setRemark("%shuai%");
  //将创建好的bean放到查询语句的池子里面
  BeanPropertySqlParameterSource paramSource=new BeanPropertySqlParameterSource(parambean);
  BeanPropertyRowMapper<DeptBean> rowBean = new BeanPropertyRowMapper<DeptBean>(
    DeptBean.class);
  List<DeptBean>deptList=template.query(sql, paramSource, rowBean);
  for(DeptBean deptbean:deptList){
   System.out.println(deptbean.getDeptname()+"\t"+deptbean.getRemark());
  }
 }
 public static void main(String[] args) {
  //获取到bean对象
  TestMain_9 testMain_9=(TestMain_9)SpringUtil.getBean("testMain_9");
  //测试方法
//  testMain_9.one();
//  testMain_9.two();
  testMain_9.three();
 }
}

今日笔者就将Spring中的JdbcTemplate模板介绍到这。

以上这篇Spring的连接数据库以及JDBC模板(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解spring开发_JDBC操作MySQL数据库

    本文介绍spring开发_JDBC操作MySQL数据库,具体如下: 项目结构: 数据库表: /spring_1100_spring+jdbc/src/com/b510/bean/Person.java package com.b510.bean; /** * 普通的javaBean类Person * * @author Hongten * */ public class Person { /** * id号 */ private int id; /** * 姓名 */ private Strin

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • Spring Boot JDBC 连接数据库示例

    文本将对在spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍. 包括JDBC.JPA.MyBatis.多数据源和事务. JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 sprin

  • Spring 数据库连接池(JDBC)详解

    数据库连接池 对一个简单的数据库应用,由于对数据库的访问不是很频繁,这时可以简单地在需要访问数据库时,就新创建一个连接,就完后就关闭它,这样做也不会带来什么性能上的开销.但是对于一个复杂的数据库应用,情况就完全不同而,频繁的建立.关闭连接,会极大地减低系统的性能,因为对于连接的使用成了系统性能的瓶颈. 通过建立一个数据库连接池以及一套连接使用管理策略,可以达到连接复用的效果,使得一个数据库连接可以得到安全.高效的复用,避免了数据库连接频繁建立.关闭的开销. 数据库连接池的基本原理是在内部对象池中

  • MySQL为例讲解JDBC数据库连接步骤

    1.什么是JDBC?有什么作用? Java Data Base Connectivity Java数据库连接协议 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 他提供了一种基准,据此可以构建更高级的工具和接口,使开发人员能够编写数据库应用程序 有了JDBC, 向各种关系数据发送sql语句就变得很容易了 换句话说就是有了JDBC API就不用为了访问Oracle数据库专门写一个程序 或者又为访问MySQL数据库专门写一个程序. 2.Java APP使用JDBC连接

  • Spring的连接数据库以及JDBC模板(实例讲解)

    前言 今天介绍的是关于Spring的数据库连接以及Jdbc模板的相关API方法,虽然在学习了hibernate之后,会知道实现数据库连接一般都是使用hibernate等持久化框架来实现的.但是,很多时候一些涉及到事务的东西使用这些框架并不能够实现,所以我们还需要结合spring来实现相关的需要. 一.创建工程.导包 要想使用Spring的jdbc模板前,还需要导入相关的jar包: 二.进行相关的bean的创建以及工具类的编写 2.1在数据库中创建了两张表,使用spring的jdbcTemplat

  • Spring编程式和声明式事务实例讲解小结

    Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理: 通过Transaction Template手动管理事务,实际应用中很少使用, 使用XML配置声明式事务: 推荐使用(代码侵入性最小),实际是通过AOP实现 实现声明式事务的四种方式: 基于 TransactionInterceptor 的声明式事务: Spring 声明式事务的基础,通常也不建议使用这种方式,但是与前面一样,了解这种方式对理解 Spring 声明式事务有很大作用. 基于 TransactionProx

  • spring boot+mybatis 多数据源切换(实例讲解)

    由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的 1.首先定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TargetDataSource { String value();//此处接收的是数据源的名称 } 2.然后建一个配置类,这个在项目启动时会加载数据源,一开始采用了HikariCP,查资料说是最快性能最好的

  • jquery tmpl模板(实例讲解)

    之前用模板渲染都是用angular,无意间发现了jquery tmpl这种轻量级,其文档在这里 官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下: .tmpl([data,][options]) 其中参数data的用途很明显:用于render的数据,可以是任意js类型,包括数组和对象.options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间. 在这里可以下

  • 在Spring中使用JDBC和JDBC模板的讲解

    spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作. 我们要在一个类中进行CRUD操作(crud主要被用在描述软件系统中数据库或者持久层的基本操作功能.),首先要将jdbcTemplate这个模板类注入到数据对象类中,然后将DataSource这个类注入到jdbcTemplate,获取数据源. 这样数据对象类就可以通过jdbcTemplate类中的方法进行数据库操作了. 注意:这里需要

  • Spring Boot应用开发初探与实例讲解

    Spring Boot是由Pivotal团队提供的全新Spring开发框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 从它的名字可以看出,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目. 它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Spring 框架的应用. 它包含的特性如下: 应用独立运行,对于Web应用直接嵌入应用服务器(Tomcat or Jetty) 根据项目的依赖(Maven or Gradle中定义的依赖)自动配

  • Spring 配置文件XML头部文件模板实例详解

    普通spring配置文件模板: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.s

  • Spring+SpringMVC+Hibernate整合实例讲解

    使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns

  • Spring整合多数据源实现动态切换的实例讲解

    在实际项目中时常需要连接多个数据库,而且不同的业务需求在实现过程当中往往需要访问不同的数据库. jdbc.properties配置文件,配置多个dataSource ##########################MySQL##################################### hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect connection.driver_class=com.mysql.jdbc.

  • Spring boot + mybatis + orcale实现步骤实例代码讲解

    接着上次的实现, 添加 mybatis 查询 orcale 数据库 第一步: 新建几个必须的包, 结果如下 第二步: 在service包下新建personService.java 根据名字查person方法接口 package com.example.first.service; import com.example.first.entity.Person; public interface personService { Person queryPersonByName(String name

随机推荐