spring使用JdbcTemplate操作数据库

在 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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值