1. 程式人生 > 其它 >【Spring5】JdbcTemplate

【Spring5】JdbcTemplate

JdbcTemplate實現對資料庫增刪改查

步驟

  1. 匯入Jar包

mysql-connector-java-8.0.28.jar:mysql資料庫連線的相關依賴

spring-tx-5.2.6.RELEASE.jar:Spring對資料庫事務操作封裝的相關依賴

spring-jdbc-5.2.6.RELEASE.jar:Spring對資料庫連線操作封裝的相關依賴

spring-orm-5.2.6.RELEASE.jar:Spring整合其他框架如Mybatis、Template需要用到的依賴。

druid-1.1.9.jar:德魯伊連線池依賴

  1. 在Spring配置檔案中配置資料庫連線池
    <context:property-placeholder location="JDBC.properties"></context:property-placeholder>

    <bean id="DruidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${p.driverClassName}"></property>
        <property name="url" value="${p.url}"></property>
        <property name="username" value="${p.username}"></property>
        <property name="password" value="${p.password}"></property>
    </bean>
  1. 配置JdbcTemplate物件,並注入DataSource

xml

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${p.driverClassName}"></property>
        <property name="url" value="${p.url}"></property>
        <property name="username" value="${p.username}"></property>
        <property name="password" value="${p.password}"></property>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

BookDaoImpl

@Repository
public class BookDaoImpl implements BookDao {
    @Autowired
    @Qualifier(value = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
@Override
public int add(Book book) {
    String sql = "insert into book(book_name, book_author) values (?, ?)";
    int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor());
    return result;
}
  1. 建立service和dao類,在service注入Dao,然後在dao裡注入JdbcTemplate進行資料庫操作
@Service
public class BookService {
@Autowired
private BookDao bookDao;

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

public BookDao getBookDao() {
     return bookDao;
}

public void setBookDao(BookDao bookDao) {
     this.bookDao = bookDao;
}

BookDao

public interface BookDao {
 int add(Book book);
 }
  1. 測試
@Test
public void test() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
BookService bookService = (BookService) context.getBean("bookService");
//        System.out.println(bookService.bookDao);
           Book book = new Book();
           book.setBookName("黑貓");
           book.setAuthor("愛·倫坡");
           bookService.add(book);
}

修改和刪除

BookDaoImpl

@Repository
public class BookDaoImpl implements BookDao {
    @Autowired
    @Qualifier(value = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;


    @Override
    public int add(Book book) {
        String sql = "insert into book(book_name, book_author) values (?, ?)";
        int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor());
        return result;
    }

    @Override
    public int modify(int id, Book book) {
        String sql = "update book set book_name=?, book_author=? where book_id=?";
        int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor(), id);
        return result;
    }

    @Override
    public int delete(int id) {
        String sql = "delete from book where book_id=?";
        int result = jdbcTemplate.update(sql, id);
        return result;
    }

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

    @Override
    public Book findOne(int id) {
        String sql = "SELECT book_name bookName, book_author author FROM book WHERE book_id = ?";
        Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
        return book;
    }

    @Override
    public List<Book> findAll() {
        String sql = "select book_name bookName, book_author author from book";
        List<Book> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
        return list;
    }


}

BookDao

public interface BookDao {
 int add(Book book);
 int modify(int id, Book book);
 int delete(int id);
}

BookService

@Service
public class BookService {
    @Autowired
    private BookDao bookDao;
    public void add(Book book) {
    bookDao.add(book);

    public void modifyBook(int id, Book book) {
         bookDao.modify(id, book);
    }

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

測試

@Test
public void test() {
    ApplicationContext context =
                             new ClassPathXmlApplicationContext("bean.xml");
    BookService bookService = (BookService) context.getBean("bookService"); 
// Book book = new Book();
// book.setBookName("白夜行");
// book.setAuthor("東野圭吾");
// bookService.add(book);
    bookService.deleteBook(4);
}

@Test
public void test2() {
    ApplicationContext context =
            new ClassPathXmlApplicationContext("bean.xml");
    BookService bookService = (BookService) context.getBean("bookService");

    Book book = new Book();
    book.setBookName("ABC謀殺案");
    book.setAuthor("阿加莎·克里斯蒂");

    bookService.modifyBook(2, book);
}

返回聚合函式的某個值:public T queryForObject(String sql, Class requiredType)

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

查詢返回某個物件:public T queryForObject(String sql, RowMapper rowMapper, @Nullable Object... args)

rowMapper是一個介面,new BeanPropertyRowMapper(Book.class)為其介面實現類

@Override
public Book findOne(int id) {
    String sql = "SELECT book_name bookName, book_author author FROM book WHERE book_id = ?";
    Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
    return book;
}

這裡sql語句中對欄位加入了別名,防止資料庫欄位名與類名不一致,實際上方法實現了對屬性對映的封裝,使得能夠根據屬性名和值得到一個例項

返回集合:public List query(String sql, RowMapper rowMapper)

@Override
public List<Book> findAll() {
    String sql = "select book_name bookName, book_author author from book";
    List<Book> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
    return list;
}

JdbcTemplate實現批量新增功能:

public int[] batchAdd(List<Object[]> batchArgs),Object陣列元素為包含多個欄位的一個記錄

BookDaoImpl

    @Override
    public int[] batchAdd(List<Object[]> batchArgs) {
        String sql = "insert into book(book_name, book_author) values (?, ?)";
        int[] is = jdbcTemplate.batchUpdate(sql, batchArgs);
        return is;
    }

測試

    @Test
    public void batchAddTest() {
        List<Object[]> list = new ArrayList<>();
        Object[] o1 = {"米澤穗信", "冰菓"};
        Object[] o2 = {"有棲川有棲", "孤島之謎"};
        Object[] o3 = {"島田莊司", "斜屋犯罪"};
        list.add(o1);
        list.add(o2);
        list.add(o3);

        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        int[] is = bookService.batchAdd(list);
        System.out.println(Arrays.toString(is));
    }