項目介紹+SSM環境搭建 1.項目功能/界面 SSM整合項目界面:使用Vue完成 技術棧:前後端分離開發,前端框架Vue3+後端框架SSM 前端框架-Vue3 後端框架-SSM(SpringMVC+Spring+MyBatis) 資料庫-MySQL 項目依賴管理-Maven 分頁-pagehelpe ...
項目介紹+SSM環境搭建
1.項目功能/界面
- SSM整合項目界面:使用Vue完成
- 技術棧:前後端分離開發,前端框架Vue3+後端框架SSM
- 前端框架-Vue3
- 後端框架-SSM(SpringMVC+Spring+MyBatis)
- 資料庫-MySQL
- 項目依賴管理-Maven
- 分頁-pagehelper
- 逆向工程-MyBatis Generator
- 其他...
2.項目基礎環境搭建
2.1創建項目
(1)創建maven項目(註意配置maven的倉庫鏡像,不然創建的時候會很慢),File--New--Project--Maven
(2)手動創建java和test相關目錄
(3)pom.xml文件中引入項目基本的jar包
<!--部分-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--引入SpringMVC,也會自動導入spring的庫-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!--引入spring-jdbc,支持事務相關-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
<!--引入spring aspect-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.8</version>
</dependency>
<!--引入mybatis庫-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--引入druid資料庫連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<!--mysql的驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
(4)給項目配置Tomcat
(5)啟動tomcat,測試成功
2.2項目全局配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--(1)配置啟動Spring容器:主要配置和業務邏輯相關的,比如數據源,事務控制等-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--指定文件位置-->
<param-value>classpath:applictionContext.xml</param-value>
</context-param>
<!--(2)ContextLoaderListener 監聽器,它的作用:
1.當啟動web容器時,自動裝配 applictionContext的配置信息
2.它實現了ServletContextListener 介面,
啟動容器時,ContextLoaderListener自動會讀取名為“contextConfigLocation”的參數配置
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--(3)配置SpringMVC的前端控制器,攔截所有的請求
因為這裡沒有指定SpringMVC的配置文件,這裡就會按照servlet-name-servlet.xml的方式來獲取
-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--3.1如果我們沒有配置contextConfigLocation,
就預設按照預設機制/WEB-INF/springDispatcherServlet-servlet.xml去找-->
<!--3.2在web項目啟動時,就自動地載入DispatcherServlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--(4)配置spring提供的字元編碼過濾器,解決中文編碼問題-->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<!--過濾器會執行request.setCharacterEncoding(encoding)-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!--過濾器會執行response.setCharacterEncoding(encoding)-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--(5)配置HiddenHttpMethodFilter,使用rest風格的url,
作用是把以post請求提交的delete和put請求進行轉換-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
如果web.xml的<web-app>
報紅,選擇只是高亮syntax即可,本身是沒有問題的,只是DTD本身的約束
2.3SpringMVC配置
WEB-INF 目錄下創建SpringMVC的配置文件 springDispatcherServlet-servlet.xml
文件的命名要根據上面web.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--(1)配置自動掃描com.li.furn包-->
<context:component-scan base-package="com.li.furn">
<!--springmvc只掃描Controller-->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--(2)配置預設視圖解析器,指定頁面返回-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置屬性 suffix(尾碼) 和 prefix(首碼)-->
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".html"/>
<property name="order" value="10"/>
</bean>
<!--(3)加入兩個常規配置-->
<!--支持SpringMVC的高級功能,比如:JSR303校驗,映射動態請求-->
<mvc:annotation-driven/>
<!--將SpringMVC不能處理的請求,交給tomcat處理,比如css,js-->
<mvc:default-servlet-handler/>
</beans>
2.4配置Spring和MyBatis,並完成整合
(1)在resource目錄下創建jdbc.properties,配置連接mysql的信息
# The key value is arbitrary
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=123456
(2)在pom.xml文件引入mybatis整合spring的適配包
<!--引入mybatis整合spring的適配包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
(3)在resource目錄下創建 Spring 的配置文件 applicationContext.xml
右鍵-->New-->XML Configuration-->Spring Config
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--spring的配置文件:主要配置和業務邏輯有關的,比如數據源,事務控制等-->
<!--(1)配置掃描com.li.furn包(控制器除外,它由springmvc管理)-->
<context:component-scan base-package="com.li.furn">
<!--排除掃描 @Controller註解-->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--(2)配置數據源-->
<!--2.1引入外部的屬性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--2.2配置數據源對象-DataSource-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="pooledDataSource">
<!--給數據源對象配置屬性值-->
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
<!--!!(3)配置spring和mybatis的整合
3.1在項目中要引入mybatis整合到spring的適配庫 mybatis-spring-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<!--指定mybatis的全局配置文件mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--指定數據源-->
<property name="dataSource" ref="pooledDataSource"/>
<!--指定mybatis的 mapper.xml文件的位置
我們在開發中通常把 mapper.xml放在類路徑下 resource/mapper
所以這裡指定的value是 classpath:mapper/*.xml-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--(4)配置掃描器,將mybatis介面的實現加入到ioc容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--掃描所有的dao介面的實現,將入到ioc容器中,這裡的dao介面就是mapper介面
(mapper介面放在com.li.furn.dao下,因為mybatis處於DAO層,用於操作資料庫)-->
<property name="basePackage" value="com.li.furn.dao"/>
</bean>
<!--(5)配置事務管理器對象-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
id="transactionManager">
<property name="dataSource" ref="pooledDataSource"/>
</bean>
<!--(6)配置開啟基於註解的事務(這裡使用xml+切入表達式),並指定切入點-->
<!--6.1指定事務規則,即指定事務如何切入-->
<tx:advice id="txAdvice">
<tx:attributes>
<!--*代表所有方法都是事務方法-->
<tx:method name="*"/>
<!--以get開頭的所有方法,我們認為是只讀的,進行調優-->
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--6.2配置切入表表達式,引用上面的事務規則,即在匹配切入表達的方法中使用上述的事務規則-->
<aop:config>
<!--切入表達式-->
<aop:pointcut id="txPoint" expression="execution(* com.li.furn.service..*(..))"/>
<!--配置事務規則,使用上面的txAdvice,指定規則對txPoint進行切入-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
</beans>
(4)在resource目錄下創建mapper目錄,存放xxxMapper.xml文件
(5)在resource目錄下創建mybatis的配置文件 mybatis-config.xml(原因和上面一致,因為在spring配置文件中指定了路徑)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--暫時為空-->
</configuration>
2.5創建表,使用逆向工程生成Bean、XxMapper和XxMapper.xml
(1)創建資料庫和表
-- 創建資料庫
CREATE DATABASE furn_ssm;
USE furn_ssm;
-- 創建家居表
CREATE TABLE furn(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT, #id
`name` VARCHAR(64) NOT NULL, #家居名
`maker` VARCHAR(64) NOT NULL, #廠商
`price` DECIMAL(11,2) NOT NULL, #價格
`sales` INT(11) NOT NULL, #銷量
`stock` INT(11) NOT NULL, #庫存
`img_path` VARCHAR(256) NOT NULL #照片路徑
);
-- 初始化家居數據
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '北歐風格小桌子' , '熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '簡約風格小椅子' , '熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '典雅風格小臺燈' , '螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '溫馨風格盆景架' , '螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg');
SELECT * FROM furn;
(2)使用MyBatis Generator 逆向生成bean mapper介面和mapper.xml
如果逆向工程生成的代碼不能滿足需求,再自己編寫
2.1)修改Mybatis-config.xml,增加typeAliases別名配置,配置日誌輸出
<configuration>
<!--配置mybatis自帶的日誌輸出,查看原生的sql-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!--直接引入包,包下麵的所有類名都可以作為別名使用-->
<package name="com.li.furn.bean"/>
</typeAliases>
</configuration>
2.2)在pom.xml引入MyBatis Generator包
<!--引入mybatis逆向工程的依賴包-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
2.3)在項目目錄下創建mbg.xml(mybatis generator),並參考文檔進行配置
文檔和模板:MyBatis Generator Core – MyBatis Generator XML Configuration File Reference
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--生成沒有註釋的 bean-->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--配置資料庫連接信息,按照你的實際情況配置-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/furn_ssm?characterEncoding=utf8"
userId="root"
password="123456">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--指定Javabean生成的位置
targetPackage 是包名,targetProject是包所在的路徑-->
<javaModelGenerator targetPackage="com.li.furn.bean"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--指定sql映射文件(xml文件)生成的位置-->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--指定dao介面生成的位置,也就是mapper介面-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.li.furn.dao"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--指定要逆向生成的表和生成策略
tableName是資料庫的表名,domainObjectName是生成的Javabean的類名-->
<table tableName="furn" domainObjectName="Furn"/>
</context>
</generatorConfiguration>
2.4)在test目錄下創建一個MBGTest.java,該文件可以生成相關bean、mapper介面和mapper.xml
文件模板:MyBatis Generator Core – Running MyBatis Generator With Java
package com.li.furn.test;
import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author 李
* @version 1.0
*/
public class MBGTest {
@Test
public void generator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//這裡根據自己的情況指定配置的 mbg.xml文件
//如果下麵這樣訪問,需要將文件放在項目目錄下
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator =
new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
運行上述方法後,可以看到成功生成了指定的文件:這樣我們就可以直接使用逆向工程成功的方法操作資料庫,而不必在介面和映射文件來回編寫代碼。
(3)使用Junit測試Spring和MyBatis是否整合成功,能否通過MyBatis添加furn到資料庫
3.1)修改bean:Furn.java,分別添加全參和無參構造器(略)
3.2)在test目錄下增加測試文件,測試逆向工程生成的方法是否可用。
@Test
public void insertSelective() {
//初始化spring容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
//獲取到 FurnMapper的代理對象(類型=class com.sun.proxy.$Proxy17)
FurnMapper furnMapper = ioc.getBean(FurnMapper.class);
//添加數據
Furn furn = new Furn(null, "小電燈", "一等家居",
new BigDecimal(66), 123, 45,
"/assets/images/product-image/1.jpg");
int affected = furnMapper.insertSelective(furn);
System.out.println("操作影響行數=" + affected + ",操作成功!");
}
測試成功:
2.6註意事項和細節說明
關於逆向生成的方法中,insertSelective() 和 insert() 方法的區別:
- insertSelective-選擇性保存數據
比如User中有三個欄位:id,name,age,但是在插入數據時只設置了name欄位:
User u = new User();
u.setName("張三")
insertSelective(u);
它在底層發出的sql語句為:insert into db_user (id,name) value (null,"張三");
,也就是說生成的sql的欄位是有選擇性的,會根據你設置的值來生成(ps:這裡的id是自增長的)
- insert 則是無論設置多少個欄位,統一都要添加一遍,即使是一個。如:
User u = new User();
u.setName("張三")
insert(u);
底層生成的sql語句為:insert into db_user (id,name,age) value (null,'張三',null,null)
因此在使用insert方法時要註意,如果表的欄位不允許為null,調用方法時又沒有設置值,就會出錯。通常情況下推薦使用 insertSelective() 方法。