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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章