天天看點

Spring之路(30)–使用JdbcTemplate完成資料庫操作(xml+注解配置)

1. 背景

上一篇講述了資料源DataSource,本篇使用的JdbcTemplate完成對資料庫增删改查操作,話不多少,開整…

2. 建立spring.xml

建立spring.xml,這個沒啥好說的,注意開啟對包的掃描,以便于後續自動注冊包内定義的bean:

<?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:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

<context:component-scan

 base-package="org.maoge.jdbctemplatedemo" />

</beans>

3. 配置資料源

在xml配置資料源,上一篇我們使用JavaConfig配置了資料源,使用xml就是形式不一樣,直接翻譯過來就行。

   <!-- 資料源 -->

<bean id="dataSource"

 class="com.alibaba.druid.pool.DruidDataSource">

 <property name="driverClassName"

  value="com.mysql.jdbc.Driver"></property>

 <!-- 注意xml中使用&amp;替代& -->

 <property name="url"

  value="jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&amp;characterEncoding=utf-8"></property>

 <property name="username" value="root"></property>

 <property name="password" value="XXX"></property>

</bean>

4. 配置jdbcTemplate元件,并注入dataSource

同樣使用xml配置jdbcTemplate,顯示指定注入dataSource。

<!--注冊jdbcTemplate元件 -->

<bean id="jdbcTemplate"

 class="org.springframework.jdbc.core.JdbcTemplate">

 <property name="dataSource" ref="dataSource"></property>

5. 定義資料對象

此處我們還是對部落格blog表進行操作,是以定義BlogDo資料對象。

package org.maoge.jdbctemplatedemo;

/**

* @theme 資料對象--部落格

* @author maoge

* @date 2020-01-27

*/

public class BlogDo {

private Long id;

private String title;

private String author;

private String content;

// 省略get get

}

6. 實作資料庫操作元件

此處正常操作是先定義一個接口,然後将實作接口的類注冊為bean,我個人是感覺沒啥意義,咱們直接實作資料庫操作元件。

一般對資料庫進行操作對象稱為DAO,此處我們也按這個命名來實作:

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.stereotype.Repository;

* @theme DAO--部落格

* @date 2020-01-29

@Repository // 注冊為元件(此處也可以使用@Component)

public class BlogDao {

@Autowired // 自動注入xml中定義的jdbcTemplate

private JdbcTemplate jdbcTemplate;

/**

 * 新增

 */

public void insert(BlogDo blog) {

 jdbcTemplate.update("insert into blog(author,content,title)values(?,?,?)", blog.getAuthor(), blog.getContent(),

   blog.getTitle());

}

 * 删除

public void delete(Long id) {

 jdbcTemplate.update("delete from blog where id =?", id);

 * 更新

public void update(BlogDo blog) {

 jdbcTemplate.update("update blog set author=?,content=?,title=? where id=?", blog.getAuthor(),

   blog.getContent(), blog.getTitle(), blog.getId());

 * 按id查詢

public BlogDo getById(Long id) {

 return jdbcTemplate.queryForObject("select * from blog where id=?", new RowMapper<BlogDo>() {

  @Override

  public BlogDo mapRow(ResultSet rs, int rowNum) throws SQLException {

   BlogDo blog = new BlogDo();

   blog.setAuthor(rs.getString("author"));

   blog.setContent(rs.getString("content"));

   blog.setId(rs.getLong("id"));

   blog.setTitle(rs.getString("title"));

   return blog;

  }

 }, id);

 * 查詢清單

public List<BlogDo> getList() {

 return jdbcTemplate.query("select * from blog", new RowMapper<BlogDo>() {

 });

可以看到,除了最後兩個查詢方法稍微有點不好了解,其他的都簡單了。最後兩個用到了匿名類相關知識,可以去了解下,當然就算不了解直接寫類似的代碼也是可以的,已經足夠簡單了。

7. bean分析

注意本文其實我們使用xml定義了dataSource、jdbcTemplate兩個bean,而BlogDao是使用注解定義的。為何不都使用注解或都使用注解呢?

因為dataSource和jdbcTemplate是Spring定義好的類,我們沒法在上面添加注解了。是以可以使用xml注冊它或者使用JavaConfig。

而BlogDao我們既可以使用注解,也可以使用xml注冊它,由于直接代碼量更少,是以此處為了簡單就使用了注解。

8. 測試

我們擷取容器中的BlogDao元件,然後調用其方法進行測試即可,測試代碼如下:

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

 // 擷取容器

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(

   "/org/maoge/jdbctemplatedemo/spring.xml");

 // 擷取blogDao元件

 BlogDao blogDao = context.getBean("blogDao", BlogDao.class);

 BlogDo blog = new BlogDo();

 blog.setAuthor("貓哥");

 blog.setTitle("測試部落格");

 blog.setContent("非常完美吭");

 // 測試插入

 blogDao.insert(blog);

 // 測試擷取1個

 System.out.println(blogDao.getById(2L));

 // 測試擷取清單

 System.out.println(blogDao.getList().size());

 blog.setId(3L);

 blog.setContent("非常完美吭XX");

 // 修改

 blogDao.update(blog);

 // 删除

 blogDao.delete(4L);

9. 總結

使用JdbcTemplate之後,确實将重複的模闆代碼基本都消滅了,我們可以關心真正的業務邏輯。