在 spring 中可以使用 JdbcTemplate 对数据库进行操作,这比原始的方式简单很多。这篇文章使用的是c3p0数据库连接池
JdbcTemplate简介
为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架。作为 Spring JDBC 框架的核心, JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法. 每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务. 通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低。
1、创建一个properties文件
db.properties
user=root
password=123456
url=jdbc:mysql://localhost:3306/spring
driverClass=com.mysql.jdbc.Driver
我这里在数据库里创建了一个学生表 studen 字段有 id,name,age,teacher_id 和一个老师表 teacher 字段为 id,name
student.java
public class Student {
private Integer id;
private String name;
private Integer age;
private Teacher teacher;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", teacher=" + teacher +
'}';
}
}
teacher.java
public class Teacher {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
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.xsd">
<context:component-scan base-package="com.spring.demo5"/>
<!-- 加载外部配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置c3p0数据池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="driverClass" value="${driverClass}"/>
</bean>
</beans>
测试类
public class JDBCTest {
private ApplicationContext context = null;
DataSource dataSource = null;
private JdbcTemplate jdbcTemplate = null;
{
context = new ClassPathXmlApplicationContext("bean4.xml");
dataSource = (DataSource) context.getBean("dataSource");
jdbcTemplate = new JdbcTemplate(dataSource); // 获取 JdbcTemplate 实例
}
/*
* 从数据库里获取一条记录,实际得到对应的一个对象
* 不是使用queryFoeObject(String sql, Class<Object> requiredType),
* 这个方法可以用来获取单独一列的值
* 而需要调用queryForObject(String sql, RowMapper<Object> rowMapper)
* 其中的rowMapper 指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper
* 不支持级联属性,JdbcTemplate 就是一个 JDBC 的小工具,而不是ORM框架
* */
@Test
public void test3(){
String sql = "SELECT id, age, name, teacher_id FROM student where id=?";
RowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
Student student = jdbcTemplate.queryForObject(sql, rowMapper, 1);
System.out.println(student);
}
// 对于单挑记录的 增 删 改,均可以使用 int update(String sql, Object... args)
// 插入一条数据,int update(String sql, Object... args) 一个是 sql
@Test
public void test4() {
String sql = "INSERT INTO student(name, age, teacher_id) VALUES(?, ?, ?)";
int honor = jdbcTemplate.update(sql, "Honor", 40, 2);
System.out.println(honor);
}
// 修改一条记录
@Test
public void test9(){
String sql = "UPDATE student SET name=? WHERE id=?";
int superMan = jdbcTemplate.update(sql, "superMan", 2);
System.out.println(superMan);
}
// 批量插入,需要传入一个 Object 类型的数组的集合,调用 batchUpdate 方法,
@Test
public void test5(){
String sql = "INSERT INTO student(name, age, teacher_id) VALUES(?, ?, ?)";
List<Object[]> list = new ArrayList<>();
list.add(new Object[]{"Tom", 18, 1});
list.add(new Object[]{"dome", 20, 1});
list.add(new Object[]{"abandon", 20, 1});
list.add(new Object[]{"banner", 20, 1});
int[] ints = jdbcTemplate.batchUpdate(sql, list);
}
// 查找多条记录,并封装成实体类的集合,调用 query 方法
@Test
public void test6(){
String sql = "SELECT * FROM student WHERE id>?";
RowMapper<Student> mapper = new BeanPropertyRowMapper<>(Student.class);
List<Student> query = jdbcTemplate.query(sql, mapper, 5);
query.stream().forEach(System.out::println);
}
//获取一个单独列的值,调用 queryForObject 方法,自定的数据类型是基本的数据类型的类型
@Test
public void test8() {
String sql = "SELECT name FROM student WHERE id=?";
String s = jdbcTemplate.queryForObject(sql, String.class, 2);
System.out.println(s);
}
}