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-層(控制器)。
- M層。資料模型類,需於資料庫表結構對應,用於在資料庫與V、C層之間傳遞資料。一般根據表名建立對應的java類並實現get和set方法。
- V層。檢視層,可將M、C層的相關內容和資料以視覺化呈現給使用者。使用時需要在xml中配置檢視解析器,並以 ${內容} 的形式傳送至頁面(其他方法暫未學到)。其中介面開發不需要太多V層配置。而更復雜的介面是由HTML,jsp等前端技術實現。
- 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
根據以上方法基本可順利執行單元測試。