Spring JdbcTemplate(使用详解)

JDBC 是 Java 提供的一种用于执行 SQL 语句的 API,可以对多种关系型数据库(例如 MySQL、Oracle 等)进行访问。

但在实际的企业级应用开发中,却很少有人直接使用原生的 JDBC API 进行开发,这是因为使用 JDBC API 对数据库进行操作十分繁琐,需要我们对每一步都做到“步步把控,处处关心”,例如我们需要手动控制数据库连接的开启,异常处理、事务处理、最后还要手动关闭连接释放资源等等。

Spring 提供了一个 Spring JDBC 模块,它对 JDBC API 进行了封装,其的主要目的降低 JDBC API 的使用难度,以一种更直接、更简洁的方式使用 JDBC API。

使用 Spring JDBC,开发人员只需要定义必要的参数、指定需要执行的 SQL 语句,即可轻松的进行 JDBC 编程,对数据库进行访问。

至于驱动的加载、数据库连接的开启与关闭、SQL 语句的创建与执行、异常处理以及事务处理等繁杂乏味的工作,则都是由 Spring JDBC 完成的。这样就可以使开发人员从繁琐的 JDBC API 中解脱出来,有更多的精力专注于业务的开发。

Spring JDBC 提供了多个实用的数据库访问工具,以简化 JDBC 的开发,其中使用最多就是 JdbcTemplate。

JdbcTemplate 的全限定命名为 org.springframework.jdbc.core.JdbcTemplate,它提供了大量的查询和更新数据库的方法,如下表所示。 

下面我们就结合实例,对使用 JdbcTemplate 进行 JDBC 编程进行讲解,步骤如下。

1.准备工作

在  数据库中创建一个 数据库实例user_db,并执创建一个表t_book。

 

2. 创建一个名为的项目,并在将以下依赖导入到工程中。

  • spring-beans-5.3.13.RELEASE.jar
  • spring-context-5.3.13.RELEASE.jar
  • spring-core-5.3.13.RELEASE.jar
  • spring-expression-5.3.13.RELEASE.jar
  • commons-logging-1.2.jar
  • spring-jdbc-5.3.13.RELEASE.jar
  • spring-tx-5.3.13.RELEASE.jar
  • spring-aop-5.3.13.jar
  • mysql-connector-java-8.0.23.jar
  • 除了 Spring 的核心依赖以及 commons-logging 日志包外,我们还需要在项目中导入以下依赖。

 2.在Spring配置文件配置数据库连接和配置JdbcTemplate对象,注入DataSource 

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
                               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<!--组件扫描-->
    <context:component-scan base-package="com.java.spring"></context:component-scan>



    <!--数据库连接池,使用德鲁伊的连接池 id和class都是固定的-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!--    数据库驱动,name是固定的-->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!--    数据库连接地址-->
        <property name="url" value="jdbc:mysql://localhost:3306/user_db?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"></property>
<!--    数据库用户名-->
        <property name="username" value="root"/>
<!--    数据库密码-->
        <property name="password" value="123456"/>

    </bean>

<!--    JdbcTemplate对象,固定值-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--        注入dataSource对象,将数据源的 Bean 注入到 JdbcTemplate 中,固定值-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

3. 在 com.java.spring.entity 包下,创建名为 Book的实体类,代码如下。

public class Book {
    private String user_Id;
    private String username;
    private String ustatus;

    public String getUser_Id() {
        return user_Id;
    }

    public String getUsername() {
        return username;
    }

    public String getUstatus() {
        return ustatus;
    }

    public void setUser_Id(String user_Id) {
        this.user_Id = user_Id;
    }

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

    public void setUstatus(String ustatus) {
        this.ustatus = ustatus;
    }

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

4.在 com.java.spring.Service 包下,创建名为 BookService 的实体类,

在 ncom.java.spring.dao 包下,创建一个名为 BookrDao 的 Dao 接口,

和实现类BookDaoImp1,SQL语句执行模块

代码如下。

使用到的方法:

1.查询使用到的

 参数一:SQL语句

参数二:返回类型Class

有条件判断时使用

 查询返回集合

,没有条件判断时写两个参数也可以 

2.批量添加

public interface BookDao {
//    添加的方法
    void add(Book book);

//    修改的方法
    void update(Book book);
//    删除的方法
    void delete(String book);
//    查询记录数
    int selectCount();
//    查询返回对象
    Book findBookInfo(String id);
//    查询返回集合
    List<Book> findBAllBook();
//    p批量添加
    void beanchAddBook(List<Object[]> beanch);
}
//@Service:Spring针对Bean管理中创建对象提供注解,IOC篇有讲解
@Service
public class BookService {
//    注入dao    @Autowired:根据属性类型进行自动装配,IOC篇有讲解
    @Autowired
    private BookDao bookDao;

    public void addBook (Book book){
        bookDao.add(book);
    }
//   修改的方法
    public void updateBook(Book book){
        bookDao.update(book);
    }
//    删除的方法(根据id值删除)
    public void deleteBook(String id){
        bookDao.delete(id);
    }
//    查询
    public int findCount(){
        return bookDao.selectCount();
    }
//    查询返回对象
    public Book findOne(String id){
        return bookDao.findBookInfo(id);
    }
    //    查询返回集合
    public List<Book> findAll(){
        return bookDao.findBAllBook();
    }

//批量添加
public void beanchAdd(List<Object[]>batchArgs){
    bookDao.beanchAddBook(batchArgs);

}
}

@Repository
public class BookDaoImp1 implements BookDao{
//    注入JdbcTemplate对象
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void add(Book book) {
//        创建sql语句?表示参数因为表里表一共有三个字段所以为三个?
//JDBC有讲解?用法
        String sql = "insert into t_book value(?,?,?)";
//        调用实现方法
        Object[] args = {book.getUser_Id(),book.getUsername(),book.getUstatus()};
        int update = jdbcTemplate.update(sql, args);
        System.out.println(update);



    }

    @Override
    public void update(Book book) {
       String sql = "update t_book set username=?,ustatus=? where user_id=?";
       Object[] args = {book.getUsername(),book.getUstatus(),book.getUser_Id()};
       int update = jdbcTemplate.update(sql,args);
        System.out.println(update);
    }

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

    }

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

    @Override
    public Book findBookInfo(String id) {
        String sql = "select * from t_book where user_id=?";
//        第二个参数会自动把数据封装到Book中去
        Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
        return book;
    }

    @Override
    public List<Book> findBAllBook() {
        String sql ="select * from t_book ";
        List<Book> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
        return query;
    }

    @Override
    public void beanchAddBook(List<Object[]> beanch) {
        String sql = "insert into t_book value(?,?,?)";
        int[] ints = jdbcTemplate.batchUpdate(sql,beanch);
    }
}

测试类

public class Test1 {
    @Test
    public void teseJdbc(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
//        Book book = new Book();
//        book.setUser_Id("1");
//        book.setUsername("java");
//        book.setUstatus("a");

//        bookService.addBook(book);
//        修改
//        Book book = new Book();
//        book.setUser_Id("1");
//        book.setUsername("javaiiii");
//        book.setUstatus("A");
//
//        bookService.updateBook(book);

//删除
       // bookService.deleteBook("1");
//        查询
//        int count = bookService.findCount();
//        System.out.println(count);
//        查询返回对象
//        Book book =bookService.findOne("1");
//        System.out.println(book);
//        查询集合
//      List<Book> book = bookService.findAll();
//        System.out.println(book);
//        批量添加
        List<Object[]> batch = new ArrayList<>();
        Object[]o1 = {"3","java","a"};
        Object[]o2 = {"4","java3","b"};
        Object[]o3 = {"5","java4","c"};
        batch.add(o1);
        batch.add(o2);
        batch.add(o3);
        bookService.beanchAdd(batch);






    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值