本文介绍Spring JdbcTemplate增删改查基本用法及基于查询的封装:public
环境: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
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, RowMapperpublic 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 rowMapper = new BeanPropertyRowMapper(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
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 student = jdbcTemplate.queryForMap(sql, 1);
System.out.println(student); // {id=1, name=lizhuo, age=34}
context.close();
}
4、查询:返回List
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 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 ages = jdbcTemplate.queryForList(sql, Integer.class, 11, 20);
System.out.println("ages: " + ages); // ages: [11, 15, 12]
context.close();
}
5、查询:返回List
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 rowMapper = new BeanPropertyRowMapper(Student.class);
List 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
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> 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 rowMapper = new BeanPropertyRowMapper(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 List queryForList(String sql, Class tClass, Object... args) {
RowMapper rowMapper = null;
if (Map.class.isAssignableFrom(tClass)) {
rowMapper = (RowMapper) new ColumnMapRowMapper();
} else if (String.class.equals(tClass) || Integer.class.equals(tClass)
|| Long.class.equals(tClass)) {
rowMapper = new SingleColumnRowMapper(tClass);
} else {
rowMapper = new BeanPropertyRowMapper(tClass);
}
List list = jdbcTemplate.query(sql, rowMapper, args);
return list;
}
public T queryForObject(String sql, Class tClass, Object... args) {
List list = queryForList(sql, tClass, args);
return list == null || list.isEmpty() ? null : list.get(0);
}
}
2、返回List,List
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("jdbc.xml");
BaseJdbcDao jdbcDao = (BaseJdbcDao) context.getBean("jdbcDao");
//List
String sql = "select name from jdbc_student where age between ? and ? ";
List names = jdbcDao.queryForList(sql, String.class, 11, 20);
System.out.println(names); //[Zara, Ayan, AA]
//List
sql = "select age from jdbc_student where age between ? and ? ";
List ages = jdbcDao.queryForList(sql, Integer.class, 11, 20);
System.out.println(ages); //[11, 15, 12]
//List
sql = "select * from jdbc_student where age between ? and ? ";
List 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
sql = "select * from jdbc_student where age between ? and ? ";
List 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等,
与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