Spring框架訪問資料庫的兩種方式的小案例

Z_Z_S發表於2021-10-18

1.1 以Xml的方式訪問資料庫的案例

要以xml的方式訪問資料庫需要用到JdbcTemplate ,因為 JdbcTemplate(jdbc的模板物件)在Spring 中提供了一個可以運算元據庫的物件org.springframework.jdbc.core.JdbcTemplate。

以xml的方式訪問資料庫的案例主要是以下幾個步驟:

(1) 建立user(對應的表)表並新增資料
CREATE TABLE USER(
    id INT,
    username VARCHAR(20),
    PASSWORD VARCHAR(20)
)
    
INSERT INTO USER(id,username,PASSWORD) VALUES(1001,'jack','123');
INSERT INTO USER(id,username,PASSWORD) VALUES(1002,'rose','456');
INSERT INTO USER(id,username,PASSWORD) VALUES(1003,'tom','789');

 

(2) 建立maven工程後,在pom.xml中匯入依賴
 <dependencies>
        <!-- Spring的核心依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.10</version>
        </dependency>

        <!-- jdbc模板物件依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.10</version>
        </dependency>

        <!-- mysql資料庫的依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

        <!-- 連線池的依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!-- 註解的依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <!-- 用於測試的依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

 

(3)建立實體類
package com.qf.pojo;

import lombok.Data;

@Data
public class User {

    private Integer id;
    private String name;
    private String password;

}
 
(4)建立Mapper層的UserMapper介面及UserMapperImpl實現類
package com.qf.mapper;

import com.qf.pojo.User;

import java.util.List;

public interface UserMapper {
    //查詢所有
    public List<User> findAll();
}
package com.qf.mapper.impl;

import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper {

    //宣告jdbc模板物件(jdbcTemplate),呼叫方法
    private JdbcTemplate jdbcTemplate;

    //set方法注入
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public List<User> findAll() {

        //準備sql語句
        String sql ="select id,name,password from t_user";
        //呼叫方法,query:查詢
        // update: 修改
        // BeanPropertyRowMapper:是jdbcTemplate內封裝好的物件,儲存著由查詢所有方法及實體類屬性得到的查詢資料
        List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));

        return users;
    }
}

 

(5) 建立Service層的UserService介面以及UserServiceImpl實現類
package com.qf.service;

import com.qf.pojo.User;

import java.util.List;

public interface UserService {
    public List<User> findAll();
}
package com.qf.service.impl;

import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import com.qf.service.UserService;

import java.util.List;

public class UserServiceImpl implements UserService {

    // 宣告userMapper
    private UserMapper userMapper;

    // set注入
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }
}

 

(6)建立controller層的UserController
package com.qf.controller;

import com.qf.pojo.User;
import com.qf.service.UserService;

import java.util.List;

public class UserController {
    //宣告userService
    private UserService userService;

    //提供set方法,在配置檔案通過set方法注入
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    //建立findAll方法
    public List<User> findAll(){
        return userService.findAll();
    }
}

 

(7) 建立jdbc.properties配置檔案
db.username = root
db.password = root
db.driverClassName = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/java2109?serverTimezone=Asia/Shanghai&characterEncoding=UTF8

 

(8) 建立applicationContext.xml配置檔案
<?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"> <!-- bean definitions here -->

    <!--引入配置檔案 將db.properties載入到配置檔案用來連線資料庫 -->
    <!-- property-placeholder:引入外部配置檔案
    location:位置
    classpath:當前src下的目錄
    -->
    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>

     <!-- 引入資料來源(當前使用的資料連線池)
     property:將物件的對應屬性注入值
     -->
    <bean id="dataSoure" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
        <property name="url" value="${db.url}"></property>
        <property name="driverClassName" value="${db.driverClassName}"></property>

    </bean>

    <!-- 建立JdbcTemplate物件-->
    <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSoure"></property>
     </bean>

    <!-- Dao層-->
    <bean id="userMapper" class="com.qf.mapper.impl.UserMapperImpl">
        <property name="jdbcTemplate" ref="JdbcTemplate"></property>
    </bean>

    <!-- Service層-->
    <bean id="userService" class="com.qf.service.impl.UserServiceImpl">
        <property name="userMapper" ref="userMapper"></property>
    </bean>

    <!-- Controller層-->
    <bean id="userController" class="com.qf.controller.UserController">
        <property name="userService" ref="userService"></property>
    </bean>
</beans>

 

(9)建立測試類SpringTest
package com.qf.test;

import com.qf.controller.UserController;
import com.qf.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class SpringTest {
    @Test

    public void testFindAll() {
        //載入配置檔案,建立applicationContext物件
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取Bean物件(即userController)
        UserController userController =(UserController) applicationContext.getBean("userController");
        //呼叫findAll方法
        List<User> userList = userController.findAll();
        System.out.println(userList);
    }
}

 

(10) 測試結果
[User(id=1, name=jack, password=123), User(id=2, name=tom, password=456), User(id=3, name=rose, password=789)]

Process finished with exit code 0

 

2 以註解的方式訪問資料庫

(1)Spring中的註解
@Configuration
​    作用:指定當前類是一個配置類
​    細節:當配置類作為AnnotationConfigApplicationContext物件建立的引數時,該註解可以不寫。

@ComponentScan
作用:用於通過註解指定spring在建立容器時要掃描的包
屬性:value:它和basePackages的作用是一樣的,都是用於指定建立容器時要掃描的包。
等同於xml中:  <context:component-scan base-package="com.qf"/>

@PropertySource
作用:用於指定properties檔案的位置
屬性:value:指定檔案的名稱和路徑。
關鍵字:classpath,表示類路徑下

等同於xml中:  <context:property-placeholder location="classpath:jdbc.properties"/>

@Bean
​    作用:用於把當前方法的返回值作為bean物件存入spring的ioc容器中
​    屬性:name:用於指定bean的id。當不寫時,預設值是當前方法的名稱
​    細節:當我們使用註解配置方法時,如果方法有引數,在引數前加:
@Qualifier("@Bean註解中name的值"),spring框架會去容器中查詢有沒有可用的bean物件查詢的方式和Autowired註解的作用是一樣的。
@Import
​    作用:用於匯入其他的配置類
​    屬性:value:用於指定其他配置類的位元組碼。
​    當我們使用Import的註解之後,有Import註解的類就父配置類,而匯入的都是子配置類
​    等同於xml中:  <import resource="xxx.xml"></import>

 

(2) 建立user(對應的表)表並新增資料
CREATE TABLE USER(
    id INT,
    username VARCHAR(20),
    PASSWORD VARCHAR(20)
)
    
INSERT INTO USER(id,username,PASSWORD) VALUES(1001,'jack','123');
INSERT INTO USER(id,username,PASSWORD) VALUES(1002,'rose','456');
INSERT INTO USER(id,username,PASSWORD) VALUES(1003,'tom','789');

 

(3) 建立maven工程後,在pom.xml中匯入依賴
 <dependencies>
        <!-- Spring的核心依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.10</version>
        </dependency><!-- jdbc模板物件依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.10</version>
        </dependency><!-- mysql資料庫的依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency><!-- 連線池的依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency><!-- 註解的依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency><!-- 用於測試的依賴-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
     
        <!-- 整合junit包
        為了解決純註解時找不到配置檔案不好測試問題
        -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.10</version>
        </dependency>
    </dependencies>

 

(4) 建立jdbc.properties配置檔案
db.username = root
db.password = root
db.driverClassName = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/java2109?serverTimezone=Asia/Shanghai&characterEncoding=UTF8

 

(5)建立SpringConfiguration.java作為註解配置類(==bean.xml)
package com.qf.config;
​
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
​
import javax.sql.DataSource;
import java.util.Properties;
//指定當前類為配置類,優於其他類先執行,替換applicationContext.xml檔案
@Configuration
​
//@PropertySource用於指定properties檔案的位置
//引入配置檔案,連線資料庫
@PropertySource(value = "classpath:db.properties")
​
@ComponentScan("com.qf")//掃描對應包下的註解
public class SpringConfiguration {
​
    //引入配置檔案db.properties的屬性、值
    @Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.url}")
    private String url;
    @Value("${db.driverClassName}")
    private String driverClassName;
​
    @Bean//把當前方法的返回值放在Spring容器中,相當於<bean id = "" class = "">
    //為了不再單獨寫一個資料來源,將資料來源(連線池)封裝到JdbcTemplate,返回JdbcTemplate獲得資料來源
    public JdbcTemplate getJdbcTemplate(){
        //建立properties物件,為了獲取資料來源
        Properties properties = new Properties();
        //設定對應引數,獲得對應資料來源的值
        properties.setProperty("username",username);
        properties.setProperty("password",password);
        properties.setProperty("url",url);
        properties.setProperty("driverClassName",driverClassName);
​
        try {
            //獲取資料來源
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            //返回Jdbc模版物件
            return new JdbcTemplate(dataSource);
​
        } catch (Exception e) {
            e.printStackTrace();
        }
​
        throw new RuntimeException("連線資料庫異常");
    }
​
}
 
(6)建立實體類
package com.qf.pojo;
​
import lombok.Data;
​
@Data
public class User {
​
    private Integer id;
    private String name;
    private String password;
​
}

 

(7)建立controller層的UserController
package com.qf.controller;
​
import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
​
@Controller//把當前類物件存入spring容器中
public class UserController {
​
    @Autowired//按照型別自動注入
    private UserService userService;
​
    public User findById(Integer id){
        return userService.findById(id);
    }
}
 
(8)建立Mapper層的UserMapper介面及UserMapperImpl實現類
package com.qf.mapper;
​
import com.qf.pojo.User;
​
public interface UserMapper {
    
    User findById(Integer id);
}
​
package com.qf.mapper.impl;
​
import com.qf.mapper.UserMapper;
import com.qf.pojo.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;
​
@Repository//把當前類物件存入spring容器中
public class UserMapperImpl implements UserMapper {
​
    @Autowired//按照型別自動注入
    //引入jdbcTemplate,呼叫方法
    private JdbcTemplate jdbcTemplate;
​
    @Override
    public User findById(Integer id) {
        //準備sql語句
        String sql = "select id,name,password from t_user where id = ?";
​
        //呼叫方法,並返回查詢資料
        // query:查詢
        // update: 修改
        // BeanPropertyRowMapper:是jdbcTemplate內封裝好的物件,儲存著由查詢所有方法及實體類屬性得到的查詢資料
        // 返回值是一個集合,加get(0)表示獲取集合的第一個物件返回
        return jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(User.class),id).get(0);
    }
}
​

 

(9) 建立Service層的UserService介面以及UserServiceImpl實現類
package com.qf.service;
​
import com.qf.pojo.User;
​
public interface UserService {
    
    User findById(Integer id);
}
​
package com.qf.service.impl;
​
import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
@Service////把當前類物件存入spring容器中
public class UserServiceImpl implements UserService {
​
    @Autowired//按照型別自動注入
    //引入userMapper,呼叫方法
    private UserMapper userMapper;
​
    @Override
    public User findById(Integer id) {
        return userMapper.findById(id);
    }
}

 

(10) 建立測試類SpringTast
package com.qf.test;
​
import com.qf.config.SpringConfig;
import com.qf.config.SpringConfiguration;
import com.qf.controller.UserController;
import com.qf.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
​
@RunWith(SpringJUnit4ClassRunner.class)//整合Juint,測試純註解訪問資料庫
//@ContextConfiguration(classes= SpringConfiguration.class)//引入配置類
@ContextConfiguration(classes= SpringConfig.class)//引入配置類
public class SpringTest {
​
    //按照型別自動注入
    @Autowired
    //引入userController,呼叫方法
    private UserController userController;
​
    @Test
    public void testFindById(){
​
        User user = userController.findById(3);
        System.out.println(user);
    }
}
​

 

(11) 測試結果
[User(id=1, name=jack, password=123), User(id=2, name=tom, password=456), User(id=3, name=rose, password=789)]
​
Process finished with exit code 0

 

 

相關文章