Spring JdbcTemplate增删改查基本用法及封装

    本文介绍Spring JdbcTemplate增删改查基本用法及基于查询的封装:public <T> T queryForObject(String sql, Class<T> tClass, Object... args) ,调用封装后的queryForObject,可以基于sql、返回类型、可选参数值返回Java Bean,Map,或String、int等基本类型。本文涉及:Spring Bean配置,Java 范型使用,JdbcTemplate基本用法。

    环境:mysql5.6,jdk1.8,spring3.2.5。

    一、数据库准备,Mysql5.6

    1、创建数据表jdbc_student,并模拟几个学生数据

CREATE TABLE `jdbc_student` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1    lizhuo    34
2    Zara    11
3    Nuha    2
4    Ayan    15
5    AA    12
6    BB    34
7    CC    23
8    DD    32
9    EE    25
2、创建数据表jdbc_student映射类,Student.java
package com.marcus.spring.jdbc;

public class Student {
    private Integer age;
    private String name;
    private Integer id;
	
    @Override  
    public String toString() {  
        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";  
    } 

    public void setAge(Integer age) {
	this.age = age;
    }

    public Integer getAge() {
	return age;
    }

    public void setName(String name) {
	this.name = name;
    }

    public String getName() {
	return name;
    }

    public void setId(Integer id) {
	this.id = id;
    }

    public Integer getId() {
	return id;
    }
}

二、jdbcTemplate增删改查基本用法

1、查询:返回String、Integer等简单类型,queryForObject(String sql, Class<T> requiredType, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
	
	String sql = "select name from jdbc_student where id = ?";
	String name = jdbcTemplate.queryForObject(sql, String.class, 1);
	System.out.println("name: " + name);		// name: lizhuo

	sql = "select age from jdbc_student where id = ?";
	int age = jdbcTemplate.queryForObject(sql, Integer.class, 1);
	System.out.println("age: " + age);		// age: 34
	
	context.close();
}
2、查询:返回POJO,Student类,queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "select * from jdbc_student where id = ?";
	RowMapper<Student> rowMapper = new BeanPropertyRowMapper<Student>(Student.class);
	Student student = jdbcTemplate.queryForObject(sql, rowMapper, 1);
	System.out.println(student);		// Student [id=1, name=lizhuo, age=34]
		
	context.close();
}

3、查询:返回Map,Map<String, Object> queryForMap(String sql, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "select * from jdbc_student where id = ?";
	Map<String, Object> student = jdbcTemplate.queryForMap(sql, 1);
	System.out.println(student);		// {id=1, name=lizhuo, age=34}
		
	context.close();
}

4、查询:返回List<String>, List<Intege>等,List<T> queryForList(String sql, Class<T> elementType, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "select name from jdbc_student where age between ? and ? ";
	List<String> names = jdbcTemplate.queryForList(sql, String.class, 11, 20);
	System.out.println("names: " + names);		// names: [Zara, Ayan, AA]

	sql = "select age from jdbc_student where age between ? and ? ";
	List<Integer> ages = jdbcTemplate.queryForList(sql, Integer.class, 11, 20);
	System.out.println("ages: " + ages);		// ages: [11, 15, 12]
		
	context.close();
}

5、查询:返回List<Student>, List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "select * from jdbc_student where age between ? and ?";
	RowMapper<Student> rowMapper = new BeanPropertyRowMapper<Student>(Student.class);
	List<Student> students = jdbcTemplate.query(sql, rowMapper, 11, 20);
	System.out.println(students);		
        // [Student [id=2, name=Zara, age=11], Student [id=4, name=Ayan, age=15], ]
		
        context.close();
}

6、查询:返回List<Map>, List<Map<String, Object>> queryForList(String sql, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "select * from jdbc_student where age between ? and ?";
	List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 11,20);
	System.out.println(list);
	// [{id=2, name=Zara, age=11}, {id=4, name=Ayan, age=15}, {id=5, name=AA, age=12}]
		
	context.close();
}

7、增、删、改操作,统一调用 int update(String sql, Object... args)即可

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
	String sql = "insert into jdbc_student (name, age) values (?, ?)";
	jdbcTemplate.update(sql, "name-001", 15);
	queryForStudent(jdbcTemplate);
		
	sql = "update jdbc_student set age = ? where name = ?";
	jdbcTemplate.update(sql, 12, "name-001");
	queryForStudent(jdbcTemplate);
		
	sql = "delete from jdbc_student where name = ?";
	jdbcTemplate.update(sql, "name-001");
	queryForStudent(jdbcTemplate);
		
	context.close();
}
private static void queryForStudent(JdbcTemplate jdbcTemplate) {
	String sql = "select * from jdbc_student where name = ? ";
	RowMapper<Student> rowMapper = new BeanPropertyRowMapper<Student>(Student.class);
	Student student = jdbcTemplate.queryForObject(sql, rowMapper, "name-001");
	System.out.println(student);
}

输出结果如下:

Student [id=10, name=name-001, age=15]
Student [id=10, name=name-001, age=12]
Exception in thread "main" org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
	at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71)
	at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:737)
	at com.marcus.spring.jdbc.JdbcApp.queryForStudent(JdbcApp.java:70)
	at com.marcus.spring.jdbc.JdbcApp.main(JdbcApp.java:42)

8、存储过程调用,参考:JdbcTemplate调用存储过程常见情况及封装

三、基于jdbcTemplate查询的封装

1、BaseJdbcDao.java

package com.marcus.spring.jdbc;

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

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;

public class BaseJdbcDao {
	private JdbcTemplate jdbcTemplate;
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	@SuppressWarnings("unchecked")
	public <T> List<T> queryForList(String sql, Class<T> tClass, Object... args) {
		RowMapper<T> rowMapper = null;
		if (Map.class.isAssignableFrom(tClass)) {
			rowMapper = (RowMapper<T>) new ColumnMapRowMapper();
		} else if (String.class.equals(tClass) || Integer.class.equals(tClass) 
                            || Long.class.equals(tClass)) {
			rowMapper = new SingleColumnRowMapper<T>(tClass);
		} else {
			rowMapper = new BeanPropertyRowMapper<T>(tClass);
		}
		List<T> list = jdbcTemplate.query(sql, rowMapper, args);
		return list;
	}
	
	public <T> T queryForObject(String sql, Class<T> tClass, Object... args) {
		List<T> list = queryForList(sql, tClass, args);
		return list == null || list.isEmpty() ? null : list.get(0);
	} 
}

2、返回List,List<T> queryForList(String sql, Class<T> tClass, Object... args)

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	BaseJdbcDao jdbcDao = (BaseJdbcDao) context.getBean("jdbcDao");
		
	//List<String>
	String sql = "select name from jdbc_student where age between ? and ? ";
	List<String> names = jdbcDao.queryForList(sql, String.class, 11, 20);
	System.out.println(names);	//[Zara, Ayan, AA]
		
	//List<Integer>
	sql = "select age from jdbc_student where age between ? and ? ";
	List<Integer> ages = jdbcDao.queryForList(sql, Integer.class, 11, 20);
	System.out.println(ages);	//[11, 15, 12]
		
	//List<Student>
	sql = "select * from jdbc_student where age between ? and ? ";
	List<Student> students = jdbcDao.queryForList(sql, Student.class, 11, 20);
	System.out.println(students);
	//[Student [id=2, name=Zara, age=11], Student [id=4, name=Ayan, age=15], ]
		
	//List<Map>
	sql = "select * from jdbc_student where age between ? and ? ";
	List<Map> maps = jdbcDao.queryForList(sql, Map.class, 11, 20);
	System.out.println(maps);
	//[{id=2, name=Zara, age=11}, {id=4, name=Ayan, age=15}, {id=5, name=AA, age=12}]
		
	context.close();
}

3、返回Object:String, Integer, Student, Map等,<T> T queryForObject(String sql, Class<T> tClass, Object... args)

与jdbcTemplate原生queryForObject最大区别是,查找结果为空返回null,不为空则返回集合第一个元素。

public static void main(String[] args) {
	AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
	BaseJdbcDao jdbcDao = (BaseJdbcDao) context.getBean("jdbcDao");
		
	//返回 String
	String sql = "select name from jdbc_student where id = ?";
	String name = jdbcDao.queryForObject(sql, String.class, 1);
	System.out.println("id = 1, name = " + name);	//id = 1, name = lizhuo
		
	//返回 Integer
	sql = "select age from jdbc_student where id = ?";
	Integer age = jdbcDao.queryForObject(sql, Integer.class, 1);
	System.out.println("id = 1, age = " + age);	//id = 1, age = 34
		
	//返回 Student
	sql = "select * from jdbc_student where id = ? ";
	Student student = jdbcDao.queryForObject(sql, Student.class, 1);
	System.out.println(student);		//Student [id=1, name=lizhuo, age=34]
		
	//返回 Map
	sql = "select * from jdbc_student where id = ? ";
	Map map = jdbcDao.queryForObject(sql, Map.class, 1);
	System.out.println(map);		//{id=1, name=lizhuo, age=34}
		
	context.close();
}

四、spring配置文件,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-3.0.xsd 
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
   <!-- Initialization for data source -->
   <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://47.*.*.*:3306/lmdgh_demo?useUnicode=true&characterEncoding=utf-8"/>
	  <property name="username" value="user" />
	  <property name="password" value="pwd" />
   </bean>

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
      <property name="dataSource" ref="dataSource"></property> 
   </bean>
   
   <bean id="jdbcDao" class="com.marcus.spring.jdbc.BaseJdbcDao">  
      <property name="jdbcTemplate" ref="jdbcTemplate"></property>
   </bean>
</beans>

猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/80821793