Spring5总述(七)—— 基于JdbcTemplate实现数据库操作(代码演示)

了解更多关于Spring的基础知识

前言:Spring框架将Jdbc封装到了JdbcTemplate类中,以此来方便实现对数据库的连接操作


1、前期准备工作

  1. 安装MySQL+Navicat(找到安装教程,跟着操作即可)

  2. 导入JdbcTemplate相应的jar包(如何导入jar包,在博客Spring总述(一)中有介绍)
    在这里插入图片描述
    druid.jar下载地址:
    https://repo1.maven.org/maven2/com/alibaba/druid/

    mysql-connection-java.jar包下载:
    https://dev.mysql.com/downloads/connector/j/

     注:其他的jar包在Spring-libs文件夹中都能找到
    
  3. 创建数据库表,并在Spring配置文件中配置数据库连接池(固定格式,只需要修改数据库的表名,密码,用户名)

    <!--数据库连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <!--根据实际情况修改user_db-->
        <property name="url" value="jdbc:mysql:///user_db"></property>
        <!--根据实际情况修改value属性值-->
        <property name="username" value="root"></property>
        <!--根据实际情况修改value属性值-->
        <property name="password" value="lll159357."></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    </bean>
  1. 配置JdbcTemplate对象,并注入DataSource对象
    <!--JdbcTempla对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  1. 对应数据库的属性创建Book实体类以便后面进行数据库操作的时候使用
public class Book {
    private int userid;
    private String username;
    private String ustatua;

    public int getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }

    public String getUstatua() {
        return ustatua;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

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

    public void setUstatua(String ustatua) {
        this.ustatua = ustatua;
    }

    @Override
    public String toString() {
        return "Book{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", ustatua='" + ustatua + '\'' +
                '}';
    }
}

2、基于JdbcTemplate实现数据库的添加、删除、更新操作


1、增删改需要利用JdbcTemplate类调用update方法

    public int update(String sql, @Nullable Object... args) throws DataAccessException {
        return this.update(sql, this.newArgPreparedStatementSetter(args));
    }

(1)第一个参数:SQL语句
(2)第二个参数:通过可变长参数 args 指明 SQL 语句中问号代表的参数


2、代码演示

  1. 创建BookDao类,在BookDao类中注入jdbcTemplate对象,并调用JdbcTemplate对象里面update方法实现添加操作
@Repository
public class BookDao {
    //注入jdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void add(Book book) {
		//添加操作的sql语句,sql语句的写法在这里就不陈述了
        String sql = "insert into t_book values(?,?,?)";
        //第二个参数与上面的?一一对应
        int update=jdbcTemplate.update(sql,book.getUserid(),book.getUsername(),book.getUstatua());
        System.out.println("影响的数据库表中信息的行数为:"+update);
    }

}
  1. 创建BookService类,在BookService类中调用数据库中的add方法
@Service
public class BookService {

    //注入dao
    @Autowired
    private BookDao bookDao;

    public void addBook(Book book){
        bookDao.add(book);
    }
}
  1. 创建测试类,进行测试
public class testBook {
    @Test
    public void testJdbcTemplate(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService=context.getBean("bookService", BookService.class);
        Book book = new Book();
        book.setUserid(1);
        book.setUsername("java");
        book.setUstatua("a");
        bookService.addBook(book);
    }
}
  1. 测试结果(Idea控制台输出展示,数据库表数据展示)
影响的数据库表中信息的行数为:1

在这里插入图片描述


对于删除和修改操作,在此只书写BookDao中的方法,其余调用过程与上面操作类似,不做过多冗余演示

	//这里传入的参数ID就是Book实体类中的ID属性值
    public void deleteBook(int id) {
        String sql="delete from t_book where user_id=?";
        int update = jdbcTemplate.update(sql,id);
        System.out.println(update);
    }

    public void updateBook(Book book) {
        String sql="update t_book set username=?,ustatua=? where user_id=?";
        Object[] args={book.getUsername(),book.getUstatua(),book.getUserid()};
        //第二个参数就是传入的数组,可以与上面的问号一一对应
        int update=jdbcTemplate.update(sql,args);
        System.out.println(update);
    }

3、基于JdbcTemplate实现数据库的查询操作


1、查询数据库中表里面有多少条记录,返回某个值

此操作需要调用JdbcTemplate类中的queryForObject方法

    public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {
        return this.queryForObject(sql, this.getSingleColumnRowMapper(requiredType));
    }

(1)第一个参数:SQL语句
(2)第二个参数:设置返回类型的class


2、查询某个具体的对象

此操作同样需要调用JdbcTemplate类中的queryForObject方法,但是方法传入的参数类型不同

    public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
        List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
        return DataAccessUtils.nullableSingleResult(results);
    }

(1)第一个参数:SQL语句
(2)第二个参数:RowMapper是接口,通过 RowMapper 接口实现类指明从数据库查询出来的参数应该如何封装到指定的对象中
(3)第三个参数:通过可变长参数 args 指明 SQL 语句的参数


3、查询数据库表中所有对象(多行数据)

此操作需要调用JdbcTemplate类中的query方法

    public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
        return (List)result(this.query((String)sql, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper))));
    }

(1)第一个参数:SQL语句
(2)第二个参数:RowMapper是接口,通过 RowMapper 接口实现类指明从数据库查询出来的参数应该如何封装到指定的对象中


具体代码不做演示,只展示一下BookDao类中的对上面三种方法的调用

	//查询数据库表中数据的行数
    public int selectCount() {
        String sql="select count(*) from t_book";
        Integer count=jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }
	//查询单条数据
    public Book findBookInfo(int id) {
        String sql="select * from t_book where user_id=?";
        Book book=jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id);
        return book;
    }
	//查询数据库表中的所有数据
    public List<Book> findAllBook() {
        String sql="select * from t_book";
        List<Book> books=jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
        return books;
    }

4、基于JdbcTemplate实现数据库的批量操作


此操作需要调用JdbcTemplate类中batchUpdate方法

public int[] batchUpdate(String sql, List<Object[]> batchArgs) throws DataAccessException {
    return this.batchUpdate(sql, batchArgs, new int[0]);
}

(1)第一个参数:SQL语句
(2)第二个参数:指明批处理 SQL 语句的参数,是一个对象集合


具体代码不做演示,只展示一下BookDao类中的对上面方法的调用

public void batchAddBook(List<Object[]> batchArgs) {
    String sql="insert into t_book values(?,?,?)";
    int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
    System.out.println(Arrays.toString(ints));
}

5、上述所有数据库操作的全部实现代码

  1. Book类,实体类
public class Book {
    private int userid;
    private String username;
    private String ustatua;

    public int getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }

    public String getUstatua() {
        return ustatua;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

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

    public void setUstatua(String ustatua) {
        this.ustatua = ustatua;
    }

    @Override
    public String toString() {
        return "Book{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", ustatua='" + ustatua + '\'' +
                '}';
    }
}
  1. BookDao类,实现数据库操作
@Repository
public class BookDao {
    //注入jdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void add(Book book) {

        String sql = "insert into t_book values(?,?,?)";
        int update=jdbcTemplate.update(sql,book.getUserid(),book.getUsername(),book.getUstatua());
        System.out.println("影响的数据库表中信息的行数为"+update);
    }

    public void deleteBook(int id) {
        String sql="delete from t_book where user_id=?";
        int update = jdbcTemplate.update(sql,id);
        System.out.println(update);
    }

    public void updateBook(Book book) {
        String sql="update t_book set username=?,ustatua=? where user_id=?";
        Object[] args={book.getUsername(),book.getUstatua(),book.getUserid()};
        int update=jdbcTemplate.update(sql,args);
        System.out.println(update);
    }

    public int selectCount() {
        String sql="select count(*) from t_book";
        Integer count=jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }

    public Book findBookInfo(int id) {
        String sql="select * from t_book where user_id=?";
        Book book=jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id);
        return book;
    }

    public List<Book> findAllBook() {
        String sql="select * from t_book";
        //调用方法
        List<Book> books=jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
        return books;
    }

    public void batchAddBook(List<Object[]> batchArgs) {
        String sql="insert into t_book values(?,?,?)";
        int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
        System.out.println(Arrays.toString(ints));
    }
}
  1. BookService类,用于调用BookDao中的数据库操作方法
@Service
public class BookService {

    //注入dao
    @Autowired
    private BookDao bookDao;

    public void addBook(Book book){
        bookDao.add(book);
    }

    public void updateBook(Book book){
        bookDao.updateBook(book);
    }

    public void deleteBook(int id){
        bookDao.deleteBook(id);
    }

    public int findcount(){
        return bookDao.selectCount();
    }

    public Book findOne(int id){
        return bookDao.findBookInfo(id);
    }

    public List<Book> findAll(){
        return bookDao.findAllBook();
    }

    public void batchAdd(List<Object[]> batchArgs){
        bookDao.batchAddBook(batchArgs);
    }
}
  1. testBook类,用于测试
public class testBook {
    @Test
    public void testJdbcTemplate(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService=context.getBean("bookService", BookService.class);

        //创建Book实体类
        Book book = new Book();

        //添加操作
        book.setUserid(1);
        book.setUsername("java");
        book.setUstatua("a");
        bookService.addBook(book);

        //更新操作
        book.setUserid(1);
        book.setUsername("Spring5");
        book.setUstatua("5");
        bookService.updateBook(book);

        //删除操作
        bookService.deleteBook(1);

        //查询数据库表中一共有多少条数据
        System.out.println(bookService.findcount());

        //单个对象查询操作
        Book book1=bookService.findOne(1);

        //查询数据库表中的所有对象
        List<Book> all=bookService.findAll();

        //批量添加操作
        List<Object[]> batchaArgs = new ArrayList<>();
        Object[] o1 = {6,"java","良好"};
        Object[] o2 = {7,"MySQL","良好"};
        Object[] o3 = {8,"Python","良好"};
        batchaArgs.add(o1);
        batchaArgs.add(o2);
        batchaArgs.add(o3);
        bookService.batchAdd(batchaArgs);
    }
}
  1. 创建Spring配置文件,并配置相关属性
<?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="jdbc_dao,Jdbc_service"></context:component-scan>
    <!--数据库连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <!--根据实际情况修改user_db-->
        <property name="url" value="jdbc:mysql:///user_db"></property>
        <!--根据实际情况修改value属性值-->
        <property name="username" value="root"></property>
        <!--根据实际情况修改value属性值-->
        <property name="password" value="lll159357."></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    </bean>

    <!--JdbcTempla对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
若对Spring基础知识感兴趣的可以关注一下博主,我会持续更新Spring基础知识(一边学习一边记录),一起进步,有错误的地方也可以在评论区指出来喔,谢谢大家啦!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

offer冲冲冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值