什么是JDBCTemplate

  • spring框架对jdbc的封装,使用jdbcTemplate方便对db操作

    使用流程

  • 引入依赖 略

  • spring配置中配置数据库链接池信息

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:tx="http://www.springframework.org/schema/tx"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    11. <!-- 组件扫描 -->
    12. <context:component-scan base-package="com.addicated"></context:component-scan>
    13. <!-- 数据库连接池 -->
    14. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    15. destroy-method="close">
    16. <property name="url" value="jdbc:mysql://localhost:8889/zentao" />
    17. <property name="username" value="root" />
    18. <property name="password" value="123456" />
    19. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    20. </bean>
    21. <!-- JdbcTemplate对象注册 -->
    22. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    23. <!--注入dataSource-->
    24. <property name="dataSource" ref="dataSource"></property>
    25. </bean>
    26. <!--创建事务管理器-->
    27. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    28. <!--注入数据源-->
    29. <property name="dataSource" ref="dataSource"></property>
    30. </bean>
    31. <!--开启事务注解-->
    32. <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    33. </beans>

    简单使用代码

  • 创建service类,创建dao类,在dao中注入jdbcTemplate对象 ```java —- 创建service package com.addicated.service;

import com.addicated.dao.UserDao; import com.addicated.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import java.awt.print.Book;

@Service public class UserService {

  1. @Autowired
  2. private UserDao userDao;
  3. public void add(User user) {
  4. userDao.add(user);
  5. }
  6. // 修改
  7. public void update(User user) {
  8. userDao.update(user);
  9. }
  10. public void del(String userId) {
  11. userDao.delete(userId);
  12. }
  13. public User findOne(String id) {
  14. User one = userDao.findOne(id);
  15. return one;
  16. }

} —- 创建dao package com.addicated.dao;

import com.addicated.entity.User;

public interface UserDao {

void add(User user);


void update(User user);

void delete(String userId);

User findOne(String id);

} —- 创建dao实现类 package com.addicated.dao;

import com.addicated.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.test.context.jdbc.Sql;

import java.util.Arrays; import java.util.List;

/* */ @Repository public class UserDaoImpl implements UserDao {

// 注入 jdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;


@Override
public void add(User user) {
    String sql = "insert into t_user  values(?,?,?)";
    int update = jdbcTemplate.update(sql, user.getUserId(), user.getUsername(), user.getUstatus());
    // 细节 ,update 接收的是一个可变参数 所以直接传递数组类型数据也是可行的
    System.out.println(update);
}

@Override
public void update(User user) {
    String sql= "update xxxx  where userId = ? set  xxx=?";
}

@Override
public void delete(String userId) {
    String Sql = "阿斯顿";
}

@Override
public User findOne(String id) {
    String sql = "";
    User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
    return user;
}

public List<User> findAllUser(){
    String sql = "";
    List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
    return query;
}

// 批量添加
public  void  batchAddBook(List<Object[]> batchArgs ){
    String sql = "isnert into tabName values(?,?,?)";
    int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
    System.out.println(Arrays.toString(ints));
}

}

<a name="jN99u"></a>
## 编写service和 dao

- 在dao进行数据库添加操作
- 操作jdbcTemplate对象的update方法实现添加操作

![image.png](https://cdn.nlark.com/yuque/0/2021/png/1608527/1631843977790-a69c7afc-9340-41c0-9799-adb56a266ed6.png#clientId=uc2ddcc8f-cc58-4&from=paste&height=315&id=u524ffbeb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=629&originWidth=1036&originalType=binary&ratio=1&size=370663&status=done&style=none&taskId=ua8c289f9-8e11-46ac-94f5-39407f536bb&width=518)<br />update方法有多个重载

- 一般而言有两个参数
   - 第一参数  sql语句
   - 第二参数  可变参数(也就是不定长参数,与哦你过来设置sql语句中的值
```java
@Repository
public class UserDaoImpl implements UserDao {


    // 注入 jdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;


    @Override
    public void add(User user) {
        Object[] args = {book.getUserId(), book.getUsername(),book.getUstatus()};
        String sql = "insert into t_user  values(?,?,?)";
        int update = jdbcTemplate.update(sql, args);
        // 细节 ,update 接收的是一个可变参数 所以直接传递数组类型数据也是可行的
        System.out.println(update);
    }

    -- 测试类
 @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.setUstatus("a"); bookService.addBook(book);
    }

jdbcTemplate 操作数据库 修改与删除

  • 使用流程相似,这里只贴出来部分jdbc使用的代码

    ------- 修改  与插入不同的只是sql语句
    public void updateBook(Book book) {
          String sql = "update t_book set username=?,ustatus=? where user_id=?"; Object[] args = {book.getUsername(), book.getUstatus(),book.getUserId()}; int update = jdbcTemplate.update(sql, args);
          System.out.println(update);
      }
    ------ 删除操作  注意入参变化
     public void delete(String id) {
         String sql = "delete from t_book where user_id=?";
         int update = jdbcTemplate.update(sql, id);
         System.out.println(update);
     }
    

    jdbcTemplate 操作数据库 查询返回某个值

  • 查询表里有多少跳记录,返回是个int

  • 方法为 queryForObject
    • 常用2参数
      • 第一参数,sql语句
      • 第二参数,返回类型class

image.png

    @Override
    public int selectCount() {

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

jdbcTemplate 操作数据库 查询返回对象

  • 同样使用 queryForObject方法,这次使用的为重载方法其一,

    • 参数有三
      • 1 sql语句
      • 2 RowMapper 是接口,针对返回的不同数据类型,使用这个接口的实现类完成数据封装返回对象数据类型
      • sql语句的拼接值
        @Override
        public User findOne(String id) {
        String sql = "select * from t_book where user_id=?";
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
        return user;
        }
        

        jdbcTemplate 操作数据库 查询返回集合

  • 同上

    • 参数有三

      • 1 sql语句
      • 2 RowMapper
      • 3 sql 拼接语句值 ```java

      @Override public List findAllBook() { String sql = “select * from t_book”; //调用方法 List bookList = jdbcTemplate.query(sql, new

             BeanPropertyRowMapper<Book>(Book.class));
      

      return bookList; } ```

      jdbcTemplate 操作数据库 批量添加操作

  • 批量操作表中多条记录

  • jdbcTemplate 实现批量添加操作

    • 两个参数

      • 1 sql语句
      • 2 list集合,添加多条记数据 ```java @Override public void batchAddBook(List batchArgs) { String sql = “insert into t_book values(?,?,?)”; int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints)); }

      //批量添加测试 List batchArgs = new ArrayList<>(); Object[] o1 = {“3”, “java”, “a”}; Object[] o2 = {“4”, “c++”, “b”}; Object[] o3 = {“5”, “MySQL”, “c”}; batchArgs.add(o1); batchArgs.add(o2); batchArgs.add(o3); //调用批量添加 bookService.batchAdd(batchArgs);

      <a name="rMizF"></a>
      # jdbcTemplate 操作数据库 批量修改操作
      ```java
      @Override
      public void batchUpdateBook(List<Object[]> batchArgs) {
      String sql = "update t_book set username=?,ustatus=? where user_id=?";             int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints));
      }
      //批量修改
         List<Object[]> batchArgs = new ArrayList<>(); Object[] o1 = {"java0909","a3","3"}; Object[] o2 = {"c++1010","b4","4"};
         Object[] o3 = {"MySQL1111","c5","5"}; 
      batchArgs.add(o1);
      batchArgs.add(o2);
      batchArgs.add(o3);
      //调用方法实现批量修改
      bookService.batchUpdate(batchArgs);
      

      jdbcTemplate 操作数据库 批量删除

      ```java @Override public void batchDeleteBook(List batchArgs) { String sql = “delete from t_book where user_id=?”; int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); System.out.println(Arrays.toString(ints)); } //批量删除

List batchArgs = new ArrayList<>();

Object[] o1 = {“3”}; Object[] o2 = {“4”}; batchArgs.add(o1); batchArgs.add(o2); //调用方法实现批量删除 bookService.batchDelete(batchArgs); ```