Spring系列--JdbcTemplate详解

Spring JDBC

Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从烦琐的数据库操作中解脱出来,从而将更多的精力投入编写业务逻辑中。

Spring JdbcTemplate的解析

针对数据库的操作,Spring框架提供了jdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,jdbcTemplate类是Spring JDBC的核心类。

JdbcTemplate类的继承关系十分简单。它继承自抽象类JdbcAccessor,同时实现了JdbcOperations接口。

  1. JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
  2. JdbcTemplate类的直接父类是JdbcAccessor, 该类为子类提供了一些访问数据库时使用的公共属性
    • DataSource: 其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布事务的支持,它可以作为访问数据库资源的标准接口。

Spring JDBC的配置

Spring JDBC模块主要由4个包组件,分别是core(核心包)、dataSource(数据包)、object(对象包)和support(支持包)。 具体说明如下表:

在这里插入图片描述
JDBC的配置是在配置文件applicationContext.xml中完成的,其配置模板如下:
在这里插入图片描述
上述代码中定义了3个Bean, 分别是dataSource、jdbcTemplate和需要注入类的Bean。其中dataSource对应的org.springframework.jdbc.datasource.DriverManagerDataSource类用于对数据源进行配置,jdbcTemplate对应的org.springframework.jdbc.core.JdbcTemplate类中定义了JdbcTemplate的相关配置。

dataSource中的4个属性,如下表所示;
在这里插入图片描述

定义jdbcTemplate时,需要将dataSource注入jdbcTemplate中,而其他需要使用jdbcTemplate的Bean,也需要将jdbcTemplate注入该Bean中(通常注入Dao类中,在Dao类中进行与数据库的相关操作)

Spring JdbcTemplate常用方法

execute()——执行SQL语句

execute(String sql) 方法能够完成执行SQL语句的功能。

这里我使用的是SQLyong, 打开SQLyong创建数据库text,并创建sprint_text表,如下图所示
在这里插入图片描述
导入以下jar包
在这里插入图片描述
如果使用的是Maven的话,我在前面Spring系列中已经给出了所有的坐标,这里就不再给出了。

applicationContext.xml

在该文件中配置id为dataSource的数据源Bean和id为jdbcTemplate的JDBC模板Bean,并将数据源注入JDBC模板中。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--1.配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--数据库驱动-->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <!--连接数据库的url-->
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false&amp;serverTimezone=UTC"/>
        <!--连接数据库的用户名-->
        <property name="username" value="root"/>
        <!--连接数据库的密码-->
        <property name="password" value="1424025155abc"/>
    </bean>

    <!--2.配置JDBC模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--默认必须使用数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
JdbcTemplateTest.java

在src.java目录下创建一个com.ssm.jdbc包,在该包中创建测试类JdbcTemplateTest.

package com.ssm.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTemplateTest {
    public static void main(String[] args) {
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2. 获取JdbcTemplate实例
        JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
        
        //3.使用execute()方法执行SQL语句,往spring_text表中插入一条数据
        jdbcTemplate.execute("insert into sprint_text(username,password) values ('小鑫','726599');");
        System.out.println("插入成功");
    }
}

成功运行程序后,可以发送spint_text表中多出了一条数据.
在这里插入图片描述

update()——更新数据

update()方法可以完成插入、更新和删除数据的操作。JdbcTemplate类中提供了一系列update()方法,如下表所示:
在这里插入图片描述

User.java

在com.ssm.jdbc包中创建User类,为数据Model

package com.ssm.jdbc;

//User实例类
public class User {
    private  Integer id; //用户id
    private  String username; //用户名
    private  String password;//密码

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

UserDao.java

在com.ssm.jdbc包中创建接口UserDao,并在接口中定义添加、更新和删除用户的方法,代码如下:

package com.ssm.jdbc;

public interface UserDao {
    //1.添加用户
    public  int addUser(User user);

    //2.更新用户方法
    public  int updateUser(User user);

    //3.删除用户方法
    public  int deleteUser(int id);
}

UserDaoImpl.java

在com.ssm.jdbc包中创建UserDao接口的实现类UserDaoImpl,并在类中实现添加、更新和删除账户的方法,代码如下:

package com.ssm.jdbc;

import org.springframework.jdbc.core.JdbcTemplate;

public class UserDaoImpl implements  UserDao {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    //添加用户方法
    public int addUser(User user) {
        String sql = "insert into sprint_text(username,password) values(?,?)";
        Object[] objects = new Object[]{
                user.getUsername(),
                user.getPassword()
        };
        int num = jdbcTemplate.update(sql,objects);
        return num;
    }


    //更新用户方法
    @Override
    public int updateUser(User user) {
      String sql = "update sprint_text set username=?,password=? where id=?";
        Object[] params = new Object[]{
                user.getUsername(),
                user.getPassword(),
                user.getId()
        };
        int num = jdbcTemplate.update(sql,params);
        return num;
    }

    @Override
    //删除用户方法
    public int deleteUser(int id) {
        String sql = "delete from sprint_text where id = ?";
        int num = jdbcTemplate.update(sql,id);
        return 0;
    }
}

applicationContext.xml

在applicationContext.xml中定义一个id为userDao的Bean,该Bean用于将jdbcTemplate注入userDao实例中,代码如下:

<!--定义id为userDao的Bean-->
    <bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
        <!--将jdbcTemplate注入userDao实例中-->
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>
JdbcTemplateTest.java

在测试类JdbcTemplateTest中添加一个测试方法addUserTest。用于添加用户信息。

private  static   void addUserTest(){
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取userDao实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        //创建user实例
        User user = new User();
        user.setUsername("小鑫好看錒");
        user.setPassword("1111111");

        //添加用户
        int num = userDao.addUser(user);
        if(num>0){
            System.out.println("成功插入了"+num+"条数据");
        }else{
            System.out.println("插入操作执行失败");
        }
    }

运行程序后,打开SQLyong发现多了一条数据。
在这里插入图片描述

接着在添加一个测试方法updateUserTest(),用于修改用户数据,代码如下:

 private  static void updateUserTest(){
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取userDao实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        //创建user实例
        User user = new User();
        user.setId(1);
        user.setUsername("小鑫是仙女");
        user.setPassword("1456789");
        //更新用户
        int num = userDao.updateUser(user);
        if(num>0){
            System.out.println("成功更新了"+num+"条数据");
        }else{
            System.out.println("插入操作执行失败");
        }
    }

更新数据,我们增加了id属性值的设置, 因为我们是根据id去修改用户。运行程序后,打开SQLyong,发现id为1的数据得到了更新
在这里插入图片描述

添加一个测试方法deleteUser() 用来删除用户,代码如下:

public static  void  deleteUser(){
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取userDao实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        int num = userDao.deleteUser(2);
        if(num>0){
            System.out.println("成功删除了"+num+"条数据");
        }else{
            System.out.println("插入操作执行失败");
        }
    }

在删除操作中,我们删除id为2的数据,运行程序后,打开SQLyong,发现id为2的数据已经被删除了。
在这里插入图片描述

query()——查询数据

JdbcTemplate类中提供了大量的query()方法来处理各种对数据库表的查询操作。其中常用的query()方法如下表所示:
在这里插入图片描述

1.我们先调用addUserTest()方法,往数据库中添加几条用户数据。
2.在UserDao中创建一个通过id查询一个通过id查询单个用户和查询所有用户的方法,代码如下:

//通过id查询用户
    public  User findUserById(int id);

    //查询所有用户
    public List<User> findAllUser();

3.在UserDao接口的实现类UserDaoImpl中实现接口中的方法,并使用query()方法分别进行查询,代码如下:

  //通过id查询用户数据
    @Override
    public User findUserById(int id) {
        String sql = "select * from sprint_text where id=?";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);

        return (User) jdbcTemplate.queryForObject(sql,rowMapper,id);
    }


    //查询所有用户数据信息
    @Override
    public List<User> findAllUser() {
        String sql = "select * from sprint_text";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
        return jdbcTemplate.query(sql,rowMapper);
    }

其中,BeanPropertyRowMapper是RowMapper接口的实现类,可以自动地将数据表中的数据映射到用户自定义类中(前提是用户自定义类中的字段要与数据表中的字段相对应)。创建完BeanPropertyRowMapper对象后,在findUserById()方法中通过quertForObject()方法返回了一个Object类型的单行记录,而在findAllUser()方法中通过query()方法返回了一个集合列表。

4.在JdbcTemplateTest中添加一个测试方法,在findUserByIdTest()来测试条件查询,代码如下:

 public  static  void findUserByIdTest(){
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取userDao实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        //通过id查询用户数据信息
        User user = userDao.findUserById(5);
        System.out.println(user);
    }

运行程序,通过findUserById()方法获取了id为5的用户信息,结果如下:
在这里插入图片描述
5.接着在测试类JdbcTemplate中添加一个测试方法findAllUserTest()来测试所有用户信息,代码如下:

 public static  void findAllUserTest(){
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取userDao实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        //通过id查询用户数据信息
        List<User> userList = userDao.findAllUser();
        System.out.println(userList);
    }

运行程序,控制台可以看到,我们将所有的用户查询出来了。
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值