1 準備
IntelliJ IDEA
Tomcat
JDK
Maven
mysql
spring、springmvc、mybatis 瞭解
現在假設如上條件你都具備,那麼通過我這篇部落格 你一定可以整合出 SSM 框架,完成如下效果
整個部落格共分為三部分:
- 建立 基於 Maven 的 WEB 專案,啟動 Tomcat ,專案啟動
- 整合 Mybatis+Spring ,進行單元測試 可以完成從資料庫查詢出資料功能
- 整合 Mybaits+Spring+SpringMVC,輸入Url 完成整個 MVC 的流程
2 步驟
因為說的比較細,所以前面第一部分都瞭解可以跳過。
2.1 第一部分
1.新建基於 Maven 的Web工程
2.填寫 GroupId 和 ArtifactId,參考
groupId一般分為多個段,這裡我只說兩段,第一段為域,第二段為公司名稱。域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織。舉個apache公司的tomcat專案例子:這個專案的groupId是org.apache,它的域是org(因為tomcat是非營利專案),公司名稱是apache,artigactId是tomcat。
3.填寫 Maven 配置。
圖片中1、2、3分別:
1:首先你要先配置好 Maven,如果配置好了,去 CMD DOSS 介面下輸入mvn --version
命令,如果有顯示,則代表已經配置好了,如果沒,下載maven,配置環境變數。
maven下載地址
2:選擇我們的 maven 資料夾下的 setting,這裡特別要注意,可能因為 “牆”的原因,下載 maven jar 包 很容易卡住,所以建議在 setting.xml
配置國內映象,比如阿里雲。
<!-- 複製如上一段映象程式碼配置,新增阿里雲映象 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
複製程式碼
在相應位置填上如上程式碼即可。
3.這裡為了從頭開始,我新建了個倉庫地址。這裡大家隨意,也可以和我一樣。
4.填寫工程名,module名,前者是 workspace 後者代表一個專案
5.建立架構包
如果這裡彈出此對話方塊,記得點選 auto。新建資料夾,利用Sources
Resources
兩個標籤分別轉化 Java 和 Resources 資料夾
6.新建tomcat並且配置
7.啟動專案
2.2 第二部分
**1.新增 maven 依賴。**因為 pom.xml 裡面 jar 包太多,太佔內容,所以從原始碼中複製吧。
2.因為SSM三者整合全部放在一個 .xml 中太雜。所以這裡拆成三個
spring-mybaits.xml
,spring-service
,spring-web
配置 spring-mybatis.xml
,包含如下內容:
- 資料庫配置檔案
jdbc.properties
。包含資料庫地址 密碼 庫名等等。
<!-- 1.配置資料庫相關引數properties的屬性:${url} -->
<context:property-placeholder location="classpath:jdbc.properties" />
複製程式碼
- 連線池。這裡使用 c3p0。
<!-- 2.資料庫連線池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置連線池屬性 -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- c3p0連線池的私有屬性 -->
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<!-- 關閉連線後不自動commit -->
<property name="autoCommitOnClose" value="false" />
<!-- 獲取連線超時時間 -->
<property name="checkoutTimeout" value="10000" />
<!-- 當獲取連線失敗重試次數 -->
<property name="acquireRetryAttempts" value="2" />
</bean>
複製程式碼
- 配置SqlSessionFactory物件。專用來獲取 sqlSession。
<!-- 3.配置SqlSessionFactory物件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入資料庫連線池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全域性配置檔案:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 掃描entity包 使用別名 -->
<property name="typeAliasesPackage" value="ssm.entity" />
<!-- 掃描sql配置檔案:mapper需要的xml檔案 -->
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>
複製程式碼
在 resources
下新建 mybatis-config.xml
,此檔案也稱作 mybatis 的核心配置檔案。裡面內容為空 暫時
<?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>
</configuration>
複製程式碼
新建 entity 包,用來放實體類,也就是 pojo。同時在 sqlSession 工廠中掃描整個實體類包。這樣在 mapper 中就可以用 類名做別名,不用寫整個類的相對位置路徑了。
<select id="queryUserListByUsername" parameterType="String" resultType="User">
SELECT
*
FROM
USER
WHERE
username = #{username}
</select>
複製程式碼
比如其中的 User。不然就要寫成
ssm.entity.User
複製程式碼
對於 sql 配置檔案,我這裡放在 resources-->mapper--> 下。
對於 *mapper.xml 的位置處理有很多中方式。有的放在 mapper
包下。然後在 mapper
下建立兩個包,分別放 dao
和 mapper
還有分別根據功能建包,一個功能建一個包,其中包含一組 功能檔案,分別是 *Dao *Mapper.xml
具體怎樣做根據實際專案情況來,如果專案系統功能複雜還是建議後面兩種,不然到時候會很痛苦(專案多,檔案就多,如果第一種方法,則跨度大,螢幕佔滿 :) )
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
根據自己實際情況填寫
- mapper 動態代理開發,掃描 dao 介面。
<!-- 4.配置掃描Dao介面包,動態實現Dao介面,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 給出需要掃描Dao介面包 -->
<property name="basePackage" value="ssm.dao" />
</bean>
複製程式碼
<property name="basePackage" value="ssm.dao" />
根據自己實際情況填寫
ok!到這裡位置,我們的 spring-mybatis 就配置好了。已經可以通過 mybatis 運算元據庫了,現在我們來測試下 這一步出問題沒。 先往資料庫插入一些資料。這裡我提供一份我的 sql 檔案,如果各位有需要, 直接執行就可以了。
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL COMMENT '商品名稱',
`price` float(10,1) NOT NULL COMMENT '商品定價',
`detail` text COMMENT '商品描述',
`pic` varchar(64) DEFAULT NULL COMMENT '商品圖片',
`createtime` datetime NOT NULL COMMENT '生產日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of items
-- ----------------------------
INSERT INTO `items` VALUES ('1', '桌上型電腦', '3000.0', '該電腦質量非常好!!!!', null, '2016-02-03 13:22:53');
INSERT INTO `items` VALUES ('2', '筆記本', '6000.0', '筆記本效能好,質量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '揹包', '200.0', '名牌揹包,容量大質量好!!!!', null, '2015-02-06 13:23:02');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '使用者名稱稱',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性別',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('24', '張三丰', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
複製程式碼
這是整個專案的結構。
在 entity
下建立 User
實體類,注意欄位對齊。
在 dao
下建立 UserDao
import org.apache.ibatis.annotations.Param;
import ssm.entity.User;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/7
* Description:
*/
public interface UserDao {
public List<User> queryUserListByUsername(String username);
public List<User> queryUserListByUsername2Sex(@Param("username")String username, @Param("sex") int sex);
}
複製程式碼
在 mapper
下新建 UserMappper.xml
用來寫 sql 語句。因為測試,所以這裡寫一個簡單的 sql 查詢。
<?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="ssm.mapper.UserDao">
<!-- 目的:為dao介面方法提供sql語句配置 -->
<select id="queryUserListByUsername" parameterType="String" resultType="User">
SELECT
*
FROM
USER
WHERE
username = #{username}
</select>
<select id="queryUserListByUsername2Sex" resultType="User">
SELECT
*
FROM
USER
WHERE
username = #{username}
AND sex = #{sex}
</select>
</mapper>
複製程式碼
其中有一個地方要注意 <mapper namespace="ssm.mapper.UserDao">
對映位置 換成自己的,可能我們兩不一樣。
這裡有個小技巧特別要注意,一般開發中,我們都是先在把 sql 寫完執行正確才放到這裡面來,比如下圖中,並且為了美觀,複製 sql 語句前都會規範下 sql 語句,避免太亂。
ok! 寫一個測試類 測試下。
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ssm.dao.UserDao;
import ssm.entity.User;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/7
* Description:
*/
public class TestPratice {
@Test
public void A(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
UserDao userDao = ac.getBean(UserDao.class);
List<User> userList = userDao.queryUserListByUsername2Sex("王五",1);
// List<User> userList = userDao.queryUserListByUsername("王五");
System.out.println(userList.toString());
}
}
複製程式碼
好的,到這一步,說明我們的 mybatis 和 spring 整合沒問題。
2.3 第三部分
現在來寫 spring-service.xml
,比較簡單,就是掃描下 service
類包和配置事務。
<?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:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 掃描service包下所有使用註解的型別 -->
<context:component-scan base-package="ssm.service" />
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入資料庫連線池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基於註解的宣告式事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
複製程式碼
spring + springmvc 整合 建立 spring-web
,裡面內容比較少,只是掃描了 controller
用來保證前端控制器 DispatcherServlet
能夠找到並進入相關方法中。
同時還配置了試圖解析器 ViewResolve
, 這樣我們跳轉檢視時直接寫 檢視名稱即可,不用寫相對地址路徑了。
<!-- 3.配置jsp 顯示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.掃描web相關的 controller -->
<context:component-scan base-package="ssm.controller" />
複製程式碼
最後就是配置 web.xml。主要作用是 配置 前端控制器 DispatcherServlet
重點是攔截規則處理。這裡我們是所有都攔截。其次是 剛才我們 書寫的 三個 spring-*.xml
檔案在這裡配置啟動。
<!-- spring mvc servlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此處也可以配置成 *.do *.action形式 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
複製程式碼
然後就是日誌和編碼,對於當前的測試沒啥作用,但是還是配置好吧
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- 編碼過濾器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
複製程式碼
好的 終於搞完了,現在可以安心的寫程式碼了。現在準備一個這樣的 jsp 檔案。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/items/queryitem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查詢"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td>${item.createtime}</td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
複製程式碼
我們需要查詢所有的 item 資料顯示在上面。
首先寫 ItemsDao
import org.springframework.stereotype.Repository;
import ssm.entity.Items;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/8
* Description:
*/
@Repository
public interface ItemsDao {
public List<Items> queryAllItemsList();
}
複製程式碼
對應的 ImtesMapper.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="ssm.dao.ItemsDao">
<!-- 目的:為dao介面方法提供sql語句配置 -->
<select id="queryAllItemsList" resultType="Items">
SELECT
*
FROM
items;
</select>
</mapper>
複製程式碼
書寫 ItemsService
介面和 其實現類
import ssm.entity.Items;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/8
* Description:
*/
public interface ItemsService {
List<Items> queryAllItemsList();
}
複製程式碼
package ssm.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ssm.dao.ItemsDao;
import ssm.entity.Items;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/8
* Description:
*/
@Service
public class ItemsServiceImpl implements ItemsService {
// 注入Service依賴
@Autowired
private ItemsDao itemsdao;
@Override
public List<Items> queryAllItemsList() {
return itemsdao.queryAllItemsList();
}
}
複製程式碼
最後寫 ItemsController
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import ssm.entity.Items;
import ssm.service.ItemsServiceImpl;
import java.util.List;
/**
* Created by guozhaohui628@gmail.com on 2018/5/8
* Description:
*/
@Controller
public class ItemsController {
// 注入Service依賴
@Autowired
private ItemsServiceImpl itemsService;
@RequestMapping(value = "items/queryitem.action")
public ModelAndView itemsList(){
ModelAndView mav = new ModelAndView();
List<Items> itemsList = itemsService.queryAllItemsList();
System.out.println(itemsList.toString());
mav.addObject("itemList", itemsList);
mav.setViewName("itemList");
return mav;
}
}
複製程式碼
.jsp中的程式碼已經寫好了,直接用就可以了。 我們要測試 要麼直接點選這個地址,要麼點選查詢
好的 大功告成,寫的比較細 所以比較長。希望能拿幫到你!
3 留步
整合框架期間報錯如下幾個錯誤。如果有同樣的情況可以參考一二
.JSP 中 EL 表示式不起作用 無效
Cause: java.lang.NoSuchMethodException
還有幾個錯誤,沒有記錄下來,比如 spring註解方式 idea報could not autowire
等等。
整合期間參考:
這裡寫連結內容
如果幫到你,歡迎Star支援。原始碼地址 這裡寫連結內容