Spring JdbcTemplate配置實現CRUD


回顧:
JdbcTemplate實現CRUD操作


Spring配置JdbcTemplate的兩種方式

  1. 在dao中定義JdbcTemplate的方式:可用xml配置也可以註解配置
  2. dao繼承JdbcDaoSupport的方式:只能用XML配置,註解不了。

在dao中定義JdbcTemplate的方式的方式,在持久層每個實現類中要重複寫注入JdbcTemplate的代碼。而dao繼承JdbcDaoSupport的方式,JdbcDaoSupport類已經提供了set注入的方法,就可以不用寫注入JdbcTemplate的set方法了。
在這裏插入圖片描述


(一).在dao中定義JdbcTemplate的方式

1.xml配置實現

在這裏插入圖片描述

引入依賴

    <!--Spring包的依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <!--Spring對JDBC數據訪問進行封裝的包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <!--聲明式事務所需包
        爲JDBC、Hibernate、JDO、JPA、Beans等提供的一致的聲明式和編程式事務管理支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--數據庫驅動包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

		<!--這裏使用spring內置數據源,不用C3P0或者Druid
			spring內置數據源在spring-jdbc-5.0.2.REEASE.jar包,已引入
		-->

        <!--測試包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>

用戶持久層接口與實現類

//用戶持久層接口
public interface UserDao {
    //增加數據
    void add(User user);

    //根據id查詢用戶
    User getById(Integer id);
}

//用戶持久層接口實現類
public class UserDaoImpl implements UserDao {

    private JdbcTemplate jdbcTemplate;
	//類中提供需要注入成員的set方法
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void add(User user) {
            jdbcTemplate.update("insert into user(id,username,birthday,sex,address) values (?,?,?,?,?)", user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
    }

    public User getById(Integer id) {
        return jdbcTemplate.queryForObject("select * from user where id=?", new BeanPropertyRowMapper<User>(User.class), id);

    }
}

用戶業務層接口與實現類

//用戶業務層接口
public interface UserService {
   //增加數據
   void add(User user);
   //根據id查詢用戶
   User getById(Integer id);
}

//用戶業務層接口實現類
public class UserServiceImpl implements UserService {
    private UserDao userDao;
    //提供set注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    public void add(User user) {
        userDao.add(user);
    }
    
    public User getById(Integer id) {
        User user = userDao.getById(id);
        return user;
    }
}

Spring配置文件中配置

Spring配置文件中配置加載配置文件的三種方式

將數據庫連接的信息配置到屬性配置文件中

  • jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/spring
uname=root
pwd=root
①創建Bean對象加載解析配置文件
  • Spring配置文件
        <!--配置UserServiceImpl  讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
        <bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
            <!-- 通過配置文件給bean中的屬性傳值:set注入-->
            <property name="userDao" ref="userDao"></property>
        </bean>

        <bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
            <!--set注入-->
            <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        </bean>

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <!--set注入-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>

        <!--【 創建Bean對象加載解析配置文件 】-->
         <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <!--指定要加載的配置配置文件-->
            <property name="location" value="classpath:jdbc.properties" />
         </bean>

        <!--配置spring內置數據源,如使用C3P0或者Druid則配置對應數據源   引入外部屬性配置文件後,才能用${}-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <!--set注入-->
            <property name="driverClassName" value="${driver}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${uname}"></property>
            <property name="password" value="${pwd}"></property>
        </bean>
②配置文件解析器
  • Spring配置文件
        <!--配置UserServiceImpl  讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
        <bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
            <!-- 通過配置文件給bean中的屬性傳值:set注入-->
            <property name="userDao" ref="userDao"></property>
        </bean>

        <bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
            <!--set注入-->
            <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        </bean>

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <!--set注入-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>

        <!--【配置文件解析器】 如果是多個文件,用逗號隔開。
            ①注意: (弊端)如果配置了多個解析器,只能識別第一個解析器的數據。
            所以多個配置屬性配置文件的情況下可與  <context:property-override location="jdbc_config.properties" />  搭配使用

           ② 與<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                    <property name="location" value="classpath:jdbc.properties" />
               </bean> 作用相同
        -->
         <context:property-placeholder location="classpath:jdbc.properties" />

        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
             <property name="driverClassName" value="${driver}"></property>
             <property name="url" value="${url}"></property>
             <property name="username" value="${uname}"></property>
             <property name="password" value="${pwd}"></property>
        </bean>
③加載解析配置文件,並將配置文件數據自動注入到指定的Bean中

多個配置屬性配置文件的情況下可與配置文件解析器方式搭配使用

在類路徑下添加一個屬性配置文件jdbc_config.properties
在這裏插入圖片描述

  • jdbc_config.properties
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/spring
dataSource.username=root
dataSource.password=root
#前綴 dataSource 是指定Bean的id,給該Bean注入指定屬性信息
  • Spring配置文件
        <!--配置UserServiceImpl  讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
        <bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
            <!-- 通過配置文件給bean中的屬性傳值:set注入-->
            <property name="userDao" ref="userDao"></property>
        </bean>

        <bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
            <!--set注入-->
            <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        </bean>



     <!--【配置文件解析器】,與  <context:property-override location="jdbc_config.properties" />搭配使用 供JdbcTemplate選擇引用-->
        <context:property-placeholder location="classpath:jdbc.properties" />
        <!--配置數據源-->
        <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${driver}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${uname}"></property>
            <property name="password" value="${pwd}"></property>
        </bean>


    <!--【解析配置文件,並自動注入數據到指定Bean中】    dataSource-->
      <context:property-override location="jdbc_config.properties" />
        <!--配置數據源
			屬性配置文件(jdbc_config.properties)中前綴 dataSource 是指定Bean的id,給該Bean注入指定屬性信息。
		-->
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" />


    <!--配置JdbcTemplate-->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--set注入數據源  引用dataSource1數據源-->
        <property name="dataSource" ref="dataSource1"></property>
     </bean>

使用Spring測試框架 測試

  • SpringJdbcTemplateTest
@RunWith(SpringJUnit4ClassRunner.class)////1.使用@RunWith註解替換原有運行器
@ContextConfiguration(locations= {"classpath:beans.xml"})//2.使用@ContextConfiguration指定spring配置文件的位置
public class SpringJdbcTemplateTest {
    @Autowired//3.使用@Autowired給測試類中的變量注入數據
    private UserService userService;
    
    @Test
    public void getByIdTest(){
        User user = userService.getById(3);
        System.out.println(user);
    }
}

在這裏插入圖片描述


2.註解配置實現

參考: Spring純註解配置,使用配置類,替換xml配置

(二).dao繼承JdbcDaoSupport的方式,避免重複編碼

  • 持久層接口實現類繼承JdbcDaoSupport
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
    public void add(User user) {
            getJdbcTemplate().update("insert into user(id,username,birthday,sex,address) values (?,?,?,?,?)", user.getId(),user.getUsername(),user.getBirthday(),user.getSex(),user.getAddress());
    }

    public User getById(Integer id) {
        return getJdbcTemplate().queryForObject("select * from user where id=?", new BeanPropertyRowMapper<User>(User.class), id);
    }
}

JdbcDaoSupport 類
在這裏插入圖片描述

  • Spring配置文件
      <!--配置UserServiceImpl  讓spring創建對象,並存入SpringIOC容器中,給SpringIOC容器管理-->
    <bean id="userService" class="com.mycode.service.impl.UserServiceImpl">
         <!--通過配置文件給bean中的屬性傳值:set注入-->
        <property name="userDao" ref="userDao"></property>
    </bean>

    <!--解析配置文件,並自動注入數據到指定Bean(數據源)中   -->
      <context:property-override location="jdbc_config.properties" />
        <!--配置數據源-->
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" />

    <!--配置UserDaoImpl  繼承JdbcDaoSupport的方式這裏需要注入數據源 -->
    <bean id="userDao" class="com.mycode.dao.impl.UserDaoImpl">
           <!--set注入數據源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章