1. 程式人生 > >java伺服器開發(三)

java伺服器開發(三)

springMVC的使用

spring是基於servlet封裝的網路框架,在開發中可以更輕鬆的完成各項功能。
學習過程中參考了相關部落格:http://www.cnblogs.com/ysocean/p/7282639.html
http://www.cnblogs.com/hellokitty1/p/5216025.html

1、springMVC的結構

springMVC是用於完成後端服務功能的框架。分為M層-model(資料模型),V層-view(檢視),C-層(控制器)。

  1. M層。資料模型類,需於資料庫表結構對應,用於在資料庫與V、C層之間傳遞資料。一般根據表名建立對應的java類並實現get和set方法。
  2. V層。檢視層,可將M、C層的相關內容和資料以視覺化呈現給使用者。使用時需要在xml中配置檢視解析器,並以 ${內容} 的形式傳送至頁面(其他方法暫未學到)。其中介面開發不需要太多V層配置。而更復雜的介面是由HTML,jsp等前端技術實現。
  3. C層。Controller層,主要完成業務處理、資料操作及相關功能,是M與V層的中介,MV層的互動由C層來完成。C層一般分為宣告與定義層。定義層負責具體的函式實現。

2、springMVC與資料庫互動

springMVC可直接操作資料庫,但是存在一定的不便捷性,開發過程中如果將SQL語句寫在java檔案中,不利於之後的修改與維護。所以在C層需要操作資料庫時,引入新的框架mybatis。

mybatis-資料庫操作框架

mybatis可分為xml配置和@*()註解式。
其中註解式也是在java中寫入SQL語句,雖然檔案結構簡單,但是同樣存在不利於修改和維護的問題。
兩種方法都需要配置mybatis配置檔案 mybatis-configuration.xml,檔案用於配置資料庫地址及賬戶等,並配置對應註解或xml的操作方式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 注意:environments標籤,當mybatis和spring整合之後,這個標籤是不用配置的 --> <!-- 可以配置多個執行環境,但是每個 SqlSessionFactory 例項只能選擇一個執行環境 一、development:開發模式 二、work:工作模式--> <environments default="development"> <!--id屬性必須和上面的default一樣 --> <environment id="development"> <!--事務管理器 一、JDBC:這個配置直接簡單使用了 JDBC 的提交和回滾設定。它依賴於從資料來源得到的連線來管理事務範圍 二、MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線。而它會讓容器來管理事務的整個生命週期 比如 spring 或 JEE 應用伺服器的上下文,預設情況下,它會關閉連線。然而一些容器並不希望這樣, 因此如果你需要從連線中停止它,就可以將 closeConnection 屬性設定為 false,比如: <transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager> --> <transactionManager type="JDBC"/> <!--dataSource 元素使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo"/> <property name="username" value="root"/> <property name="password" value="root1"/> </dataSource> </environment> </environments> <mappers> <!-- 1、註冊userMapper.xml檔案,UserMapper.xml位於com.user.mapper包下 所以resource寫成/com/uesr/mapper/UserMapper.xml,區別於註解方法。--> <mapper resource="com/user/mapper/UserMapper.xml"/> </mappers> <!-- 2、註冊userMapper.java檔案,和基於註解的sql操作方法對應。區別於基於xml的配置方式--> <!-- <mappers> <mapper class="com.user.mapper.UserMapper"/> </mappers> --> </configuration>

其中基於註解是由UserMapper類來實現相應的SQL操作的。建立package:com.user.mapper,並實現類UserMapper.java,例如:

public interface UserMapper {
    //根據 id 查詢 user 表資料
    @Select("select * from user where id = #{id}")
    public User selectUserById(int id) throws Exception;
}

其中@Delete已經寫死,和傳統方法比較只是結構相對簡單。呼叫方法也較為簡單。

public class zujieTest {

        //定義 SqlSession
        SqlSession session =null;

        @Before
        public void init(){
            //定義mybatis全域性配置檔案
            String resource = "mybatis-configuration.xml";
            //載入 mybatis 全域性配置檔案
            InputStream inputStream = xmlTest.class.getClassLoader()
                                        .getResourceAsStream(resource);
            //構建sqlSession的工廠
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //根據 sqlSessionFactory 產生 session
            session = sessionFactory.openSession();
        }

        //註解的增刪改查方法測試
        @Test
        public void testAnncationCRUD() throws Exception{
            //根據session獲取 UserMapper介面
            UserMapper userMapper = session.getMapper(UserMapper.class);
            //呼叫selectUserById()方法
            User user = userMapper.selectUserById(1);
            System.out.println(user);

            session.commit();
            session.close();
        }
    }

而xml方式則更便捷,可在部署好的伺服器中直接更改,伺服器使用時再讀取,即修改及維護更靈活。xml方式對應mybatis-configuration.xml中的xml操作方式。需建立檔案UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.po.userMapper">

<!-- 基於xml配置式sql操作,區別於基於註解 -->

    <!-- 根據 id 查詢 user 表中的資料
       id:唯一識別符號,此檔案中的id值不能重複
       resultType:返回值型別,一條資料庫記錄也就對應實體類的一個物件
       parameterType:引數型別,也就是查詢條件的型別
    -->
    <select id="selectUserById"
            resultType="com.user.po.User" parameterType="int">
        <!-- 這裡和普通的sql 查詢語句差不多,對於只有一個引數,後面的 #{id}表示佔位符,裡面不一定要寫id,寫啥都可以,但是不要空著,如果有多個引數則必須寫pojo類裡面的屬性 -->
        select * from user where id = #{id}
    </select>


    <!-- 查詢 user 表的所有資料
        注意:因為是查詢所有資料,所以返回的應該是一個集合,這個集合裡面每個元素都是User型別
     -->
    <select id="selectUserAll" resultType="com.user.po.User">
        select * from user
    </select>

    <!-- 模糊查詢:根據 user 表的username欄位
            下面兩種寫法都可以,但是要注意
            1、${value}裡面必須要寫value,不然會報錯
            2、${}表示拼接 sql 字串,將接收到的引數不加任何修飾拼接在sql語句中
            3、使用${}會造成 sql 注入
     -->
    <select id="selectLikeUserName" resultType="com.user.po.User" parameterType="String">
        select * from user where username like '%${value}%'
        <!-- select * from user where username like #{username} -->
    </select>

    <!-- 向 user 表插入一條資料 -->
    <insert id="insertUser" parameterType="com.user.po.User">
        <!-- 將插入的資料主鍵返回到 user 物件中
                 keyProperty:將查詢到的主鍵設定到parameterType 指定到物件的那個屬性
                 select LAST_INSERT_ID():查詢上一次執行insert 操作返回的主鍵id值,只適用於自增主鍵
                 resultType:指定 select LAST_INSERT_ID() 的結果型別
                 order:AFTER,相對於 select LAST_INSERT_ID()操作的順序
             -->
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(id,username,sex,birthday,address)
            value(#{id},#{username},#{sex},#{birthday},#{address})
    </insert> 

    <!-- 根據 id 更新 user 表的資料 -->
    <update id="updateUserById" parameterType="com.user.po.User">
        update user set username=#{username} where id=#{id}
    </update>

    <!-- 根據 id 刪除 user 表的資料 -->
    <delete id="deleteUserById" parameterType="int">
        delete from user where id=#{id}
    </delete>
</mapper>

可以看到是由xml標籤形式完成配置,其呼叫方式也和UserMapper.java類有所區別,類呼叫和傳統類一樣,建立類物件並呼叫方法即可,而xml標籤形式需要讀取配置並使用SqlSession。


public class xmlTest {
    //定義 SqlSession
    SqlSession session =null;

    @Before
    public void init(){
        //定義mybatis全域性配置檔案
        String resource = "mybatis-configuration.xml";
        //載入 mybatis 全域性配置檔案
        InputStream inputStream = xmlTest.class.getClassLoader()
                                    .getResourceAsStream(resource);
        //構建sqlSession的工廠
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //根據 sqlSessionFactory 產生 session
        session = sessionFactory.openSession();
    }

    //根據id查詢user表資料
    @Test
    public void testSelectUserById(){
        /*這個字串由 userMapper.xml 檔案中 兩個部分構成
            <mapper namespace="com.user.po.userMapper"> 的 namespace 的值
            <select id="selectUserById" > id 值*/
        String statement = "com.user.po.userMapper.selectUserById";
        User user = session.selectOne(statement, 1);
        System.out.println(user);
        session.close();
    }
}

其中注意單元測試時需要引入junit及hamcrest-core的jar包,我這裡使用junit-4.12.jar和hamcrest-core-1.3.jar。遇到initializationerror時檢查jar包是否缺失:https://blog.csdn.net/learner_lps/article/details/76921228
其中單元測試的相關規則見:https://blog.csdn.net/baidu_37107022/article/details/73658343
根據以上方法基本可順利執行單元測試。