1. 程式人生 > 其它 >Spring JdbcTemplate 學習筆記

Spring JdbcTemplate 學習筆記

基本概念

  • Spring框架對JDBC進行封裝,使用JdbcTemplate方便實現對資料庫操作

準備工作

  • 匯入依賴
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </
    dependency
    >
    <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</
    artifactId
    >
    <version>5.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.2.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> </dependencies>
  • 名稱空間
    <?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
    ">
    
  • spring配置檔案配置資料庫連線池
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url">
            <value> <![CDATA[jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&rewriteBatchedStatements=true]]></value>
        </property>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    
  • 配置JdbcTemplate物件,注入DataSource
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
  • 開啟元件掃描
    <context:component-scan base-package="com.du.spring"/>
    
  • 檔案結構
    在這裡插入圖片描述
  • pojo/bean
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
      private int id;
      private String username;
      private String phone;
    }
    
  • 編寫Dao和Service
    public interface UserDao {
      int addUser(User user);
    }
    
    // 一般用於持久層(DAO)
    @Repository
    public class UserDaoImpl implements UserDao {
      @Autowired
      JdbcTemplate jdbcTemplate;   // 自動裝配
    
      @Override
      public int addUser(User user) {
        String sql = "insert into user_info(username, phone) values(?,?);";
        return jdbcTemplate.update(sql, user.getUsername(), user.getPhone());
      }
    }
    
    public interface UserService {
      int addUser(User user);
    }
    
    // 一般用Service建立物件
    @Service
    public class UserServiceImpl implements UserService {
      @Autowired
      private UserDao userDaoImpl;
    
      @Override
      public int addUser(User user) {
        return userDaoImpl.addUser(user);
      }
    }
    
  • 測試類
    public class Demo {
      private static final Logger logger = Logger.getLogger(Demo.class);
      @Test
      public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class);
        int res = userServiceImpl.addUser(new User("jhon", "1434314"));
        if (res > 0)
          logger.info("新增成功");
        else
          logger.info("新增失敗");
      }
    }
    

CRUD

  • 查詢返回某個值
    @Override
      public int countUser() {
        String sql = "select count(*) from user_info";
        Integer res = jdbcTemplate.queryForObject(sql, Integer.class);
        if (res != null) return res;
        throw new RuntimeException("查不到");
      }
    
  • 查詢某個物件
      @Override
      public User selectUserById(int id) {
        String sql = "select * from user_info where id = ?";
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
        if (user != null) return user;
        throw new RuntimeException("查不到");
      }
    

    RowMapper 是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝

  • 查詢一個集合包含多個物件
    @Override
      public List<User> selectUsers() {
        String sql = "select id, username, phone from user_info";
        // RowMapper 是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
      }
    

    RowMapper 是介面,針對返回不同型別資料,使用這個接口裡面實現類完成資料封裝

  • 刪除
      @Override
      public int deleteUserById(int id) {
        String sql = "delete from user_info where id = ?";
        return jdbcTemplate.update(sql, id);
      }
    
  • 更新
      @Override
      public int updateUser(User user) {
        String sql = "update user_info set username = ?, phone = ? where id = ?;";
        return jdbcTemplate.update(sql, user.getUsername(), user.getPhone(), user.getId());
      }
    

批量操作

  • 批量操作:操作表裡面多條記錄
  • 批量增加
    @Override
      public void batchAddUsers(List<Object[]> batchArgs) {
        String sql = "insert into user_info(username, phone) values(?,?);";
        // 批量執行sql,並傳入多個數組組成的引數
        int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(ints));
      }
    
      @Test
      public void batchAddUsersTest() {
        List<Object[]> batchArgs = new ArrayList<>();
        Object[] o1 = {"nihao", "458785"};
        Object[] o2 = {"shijie", "458785"};
        batchArgs.add(o1);
        batchArgs.add(o2);
        userServiceImpl.batchAddUsers(batchArgs);
      }
    
  • 批量更新
      @Override
      public void batchUpdateUsers(List<Object[]> batchArgs) {
        String sql = "update user_info set username = ?, phone = ? where id = ?;";
        // 批量執行sql,並傳入多個數組組成的引數
        int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(ints));
      }
    
      @Test
      public void batchUpdateUsersTest() {
        List<Object[]> batchArgs = new ArrayList<>();
        Object[] o1 = {"nihao", "458785", 5};
        Object[] o2 = {"shijie", "458785", 6};
        batchArgs.add(o1);
        batchArgs.add(o2);
        userServiceImpl.batchUpdateUsers(batchArgs);
      }
    
  • 批量刪除
      @Override
      public void batchDeleteUsers(List<Object[]> batchArgs) {
        String sql = "delete from user_info where id = ?";
        // 批量執行sql,並傳入多個數組組成的引數
        int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(ints));
      }
    
      @Test
      public void batchDeleteUsersTest() {
        List<Object[]> batchArgs = new ArrayList<>();
        Object[] o1 = {5};
        Object[] o2 = {6};
        batchArgs.add(o1);
        batchArgs.add(o2);
        userServiceImpl.batchDeleteUsers(batchArgs);
      }