spring框架——JdbcTemplate

1 前言

JdbcTemplate 对 jdbc 进行了封装,是一个小型的轻量级持久层框架,其操作数据库的方法主要有:

//查询
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) //原生SQL语句查询一条数
public <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper) //查询一条数据
public <T> List<T> query(String sql, RowMapper<T> rowMapper) //查询多条数据
public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) //查询多条数据
public <T> T queryForObject(String sql, Class<T> requiredType) //常用于查询聚合函数值
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) //常用于查询聚合函数值或查询某个属性

//增删改
public int update(final String sql) //原生SQL语句进行增删改操作,返回作用的行数
public int update(String sql, Object... args) //sql中通过?号占位,args对应sql中的?号,返回作用的行数
public int[] batchUpdate(String sql, List<Object[]> batchArgs) //常用于批量增添记录

注意:args 表示待传入参数,用于替换 sql 中的占位符(?),当 args 中有字符串类型变量,在替换 sql 中占位符时,会自动在该字符串值的两边加单引号,如下2种写法需要特别注意:

(1)批量删除

//错误写法
jdbcTemplate.update("delete from students where sid in (?)","1,2,3");

//正确写法
String del_sid="1,2,3";
String sql="delete from students where sid in ("+del_sid+")";
jdbcTemplate.update(sql);

(2) 模糊查询

RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射
//错误写法
List<Student> students=jdbcTemplate.query("select * from students where sname like '%?%')", new Object[] {"a"}, rowMapper);
//正确写法
List<Student> students=jdbcTemplate.query("select * from students where sname like concat('%',?,'%')", new Object[] {"a"}, rowMapper);

需要导入的 jar 包如下,其中最后三个包是 JdbcTemplate 所需的 jar 包。

2 案例 

2.1 配置

首先在 MySQL 中创建数据库:users,再在此数据库中创建表:students,包含sid(int)、sname(varchar) 2个字段,其中,sid 设置了自增,students 表中数据如下:

Student.java

package com.jdbc;

public class Student {
	private Integer sid;
	private String sname;
	
	public Integer getSid() {
		return sid;
	}
	
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	
	public String getSname() {
		return sname;
	}
	
	public void setSname(String sname) {
		this.sname = sname;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}

 db.properties

# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users
jdbc.username=root
jdbc.password=0.

jdbc.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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 引入属性文件 -->
	<context:property-placeholder location="db.properties"/>
	
	<!-- 创建数据源 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 通过数据源配置JdbcTemplate -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
</beans>

注意:需要导入 context 命名空间 

2.2 查询

(1)查询一条记录

Test.java

package com.jdbc;

import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("jdbc.xml");
		JdbcTemplate jdbcTemplate=ac.getBean("jdbcTemplate",JdbcTemplate.class);
		
		RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射		
		Student student=jdbcTemplate.queryForObject("select * from students where sid=?", new Object[] {"1003"}, rowMapper);
		System.out.println(student);
	}
}

运行结果:

Student [sid=1003, sname=王五]

(2)查询多条记录

RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射	
List<Student> students=jdbcTemplate.query("select * from students where sid>=? and sid <?",new Object[] {1002,1005}, rowMapper);
System.out.println(students);

运行结果:

[Student [sid=1002, sname=李四], Student [sid=1003, sname=王五], Student [sid=1004, sname=zhaoliu]]

(3)查询聚合函数值

Integer count=jdbcTemplate.queryForObject("select count(*) from students where sid<=?", new Object[] {1005}, Integer.class);
System.out.println(count); //输出:5

(4)查询一条记录的一个属性

String sname=jdbcTemplate.queryForObject("select sname from students where sid=?",new Object[] {1001}, String.class);
System.out.println(sname); //输出:张三

2.3 增删改

本节仅介绍插入操作,对于删除和修改,与插入操作类似。

(1)插入一条记录

int count=jdbcTemplate.update("insert into students values(?,?)", null, "abc");
System.out.println(count); //输出:1

(2)插入多条记录

List<Object[]> list=new ArrayList<>();
list.add(new Object[] {null,"xyz"});
list.add(new Object[] {null,"efg"});
int[] count=jdbcTemplate.batchUpdate("insert into students values(?,?)",list);
System.out.println(count[0]+" "+count[1]); //输出:1 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章