SSM整合之 XML + 注解(已整合)
概述: 本文的SSM專案搭建整合Spring、SpringMVC、MyBatis是完整模式
1. SSM整合專案環境
- 開發環境: Jdk1.8_261, Windows10, Maven3.63, Idea2020.1
2. 整體目錄結構
1) 專案結構
- src.main
- java.com.xxx
- resource
- com.xxx.dao
- userDao.xml
- applicationContext.xml
- jdbc.properties
- spring-mvc.xml
- com.xxx.dao
- webapp
- WEB-INF
- web.xml
- index.jsp
- WEB-INF
- src.test
- java
- com.xxx.service
- resource
- applicationContext.xml
- jdbc.properties
- spring-mvc.xml
- java
- target
- pom.xml
2) 包結構
- com.xxx.controller
- interceptor
- ProjectExceptionAdvice.java
- results
- Code.java
- Result.java
- UserController.java
- interceptor
- com.xxx.dao
- UserDao.java
- com.xxx.domain
- User.java
- com.xxx.service
- impl
- UserService.java
- UserService.java
- impl
- system.exception
- BusinessException.java
- SystemException.java

3) ssm_db 之 user表
CREATE TABLE `user` (
`uuid` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`realName` varchar(100) DEFAULT NULL,
`gender` int(1) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8
3. 匯入專案所需 jar 包坐標 - pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>stu-ssm-base02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<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>
<!--spring環境-->
<!--spring環境-->
<!--spring環境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--mybatis環境-->
<!--mybatis環境-->
<!--mybatis環境-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--mysql環境-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring整合jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring整合mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--分頁插件坐標-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<!--springMVC環境-->
<!--springMVC環境-->
<!--springMVC環境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--jackson相關坐標3個-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!--servlet環境-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--其他組件-->
<!--其他組件-->
<!--其他組件-->
<!--junit單元測驗-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring整合junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
<build>
<!--設定插件-->
<plugins>
<!--具體的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<uriEncoding>utf-8</uriEncoding>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
4. 相關組態檔
1) MyBatis的mapper映射組態檔 - UserDao.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.xxx.dao.UserDao">
<!--添加-->
<insert id="save" parameterType="user">
insert into user(userName,password,realName,gender,birthday)values(#{userName},#{password},#{realName},#{gender},#{birthday})
</insert>
<!--洗掉-->
<delete id="delete" parameterType="int">
delete from user where uuid = #{uuid}
</delete>
<!--修改-->
<update id="update" parameterType="user">
update user set userName=#{userName},password=#{password},realName=#{realName},gender=#{gender},birthday=#{birthday} where uuid=#{uuid}
</update>
<!--查詢單個-->
<select id="get" resultType="user" parameterType="int">
select * from user where uuid = #{uuid}
</select>
<!--分頁查詢-->
<select id="getAll" resultType="user">
select * from user
</select>
<!--登錄-->
<select id="getByUserNameAndPassword" resultType="user" >
select * from user where userName=#{userName} and password=#{password}
</select>
</mapper>
2) Spring組態檔(整合MyBatis和SpringMvc) - applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!--開啟bean注解掃描-->
<context:component-scan base-package="com.xxx"/>
<!--Spring整合MyBatis-->
<!--Spring整合MyBatis-->
<!--Spring整合MyBatis-->
<!--開啟注解式事務驅動-->
<tx:annotation-driven transaction-manager="txManager"/>
<!--加載jdbc組態檔-->
<context:property-placeholder location="classpath*:jdbc.properties"/>
<!--加載資料源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value=https://www.cnblogs.com/bklcj/p/"${jdbc.driver}"/>
mysql
true
3) SpringMVC組態檔 - spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--開啟SpringMVC注解驅動-->
<mvc:annotation-driven/>
<!--配置SpringMVC注解掃描包路徑-->
<context:component-scan base-package="com.xxx.controller"/>
</beans>
4) JDBC組態檔 - jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
5. 整體專案環境搭建(已整合)
1) domain 層 - User.java
package com.xxx.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 用戶物體類
*
* @author : lcj
* @date : Created in 2020/8/30 8:58
*/
public class User {
private Integer uuid;
private String userName;
private String password;
private String realName;
private Integer gender;
@DateTimeFormat(pattern = "yyyy/MM/dd")
@JsonFormat(pattern = "yyyy/MM/dd")
private Date birthday;
public User() {
}
public User(Integer uuid, String userName, String password, String realName, Integer gender, Date birthday) {
this.uuid = uuid;
this.userName = userName;
this.password = password;
this.realName = realName;
this.gender = gender;
this.birthday = birthday;
}
public Integer getUuid() {
return uuid;
}
public void setUuid(Integer uuid) {
this.uuid = uuid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"uuid=" + uuid +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", realName='" + realName + '\'' +
", gender=" + gender +
", birthday=" + birthday +
'}';
}
}
2) dao 層 - UserDao.java
package com.xxx.dao;
import com.xxx.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 用戶資料持久層
*
* @author : lcj
* @date : Created in 2020/8/30 8:58
*/
public interface UserDao {
/**
* 保存用戶
*
* @param user 用戶物件
* @return 回傳保存結果, true-保存成功, false-保存失敗
*/
boolean save(User user);
/**
* 修改用戶
*
* @param user 用戶物件
* @return 回傳修改結果, true-修改成功, false-修改失敗
*/
boolean update(User user);
/**
* 洗掉用戶
*
* @param id 用戶id
* @return 回傳洗掉結果, true-保存成功, false-洗掉失敗
*/
boolean delete(Integer id);
/**
* 根據id查詢用戶
*
* @param id 用戶id'
* @return 回傳查詢的用戶資訊
*/
User get(Integer id);
/**
* 查詢所有的用戶
*
* @return 回傳查詢的用戶集合資訊
*/
List<User> getAll();
/**
* 用戶登錄查詢
* @param userName 用戶登錄名
* @param password 用戶登錄密碼
* @return 用戶資訊
*/
User getByUserNameAndPassword(@Param("userName") String userName, @Param("password") String password);
}
3) service 層 - UserService.java
package com.xxx.service;
import com.github.pagehelper.PageInfo;
import com.xxx.domain.User;
/**
* 用戶邏輯層
*
* @author : lcj
* @date : Created in 2020/8/30 8:59
*/
@Transactional(rollbackFor = Exception.class)
public interface UserService {
/**
* 保存用戶
*
* @param user 用戶物件
* @return 回傳保存結果, true-保存成功, false-保存失敗
*/
boolean save(User user);
/**
* 修改用戶
*
* @param user 用戶物件
* @return 回傳修改結果, true-修改成功, false-修改失敗
*/
boolean update(User user);
/**
* 洗掉用戶
*
* @param id 用戶id
* @return 回傳洗掉結果, true-保存成功, false-洗掉失敗
*/
boolean delete(Integer id);
/**
* 根據id查詢用戶
*
* @param id 用戶id'
* @return 回傳查詢的用戶資訊
*/
User get(Integer id);
/**
* 分頁查詢所有的用戶
*
* @param page 查詢第幾頁
* @param size 每頁顯示的條數
* @return 回傳查詢的用戶集合資訊
*/
PageInfo<User> getAll(int page, int size);
/**
* 用戶登錄
* @param userName 用戶登錄名
* @param password 用戶登錄密碼
* @return 用戶資訊
*/
User login(String userName, String password);
}
4) service 實作類 - UserServiceImpl.java
package com.xxx.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxx.dao.UserDao;
import com.xxx.domain.User;
import com.xxx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : lcj
* @date : Created in 2020/8/30 8:59
*/
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
/**
* 保存用戶
*
* @param user 用戶物件
* @return 回傳保存結果, true-保存成功, false-保存失敗
*/
@Override
public boolean save(User user) {
return userDao.save(user);
}
/**
* 修改用戶
*
* @param user 用戶物件
* @return 回傳修改結果, true-修改成功, false-修改失敗
*/
@Override
public boolean update(User user) {
return userDao.update(user);
}
/**
* 洗掉用戶
*
* @param id 用戶id
* @return 回傳洗掉結果, true-保存成功, false-洗掉失敗
*/
@Override
public boolean delete(Integer id) {
return userDao.delete(id);
}
/**
* 根據id查詢用戶
*
* @param id 用戶id'
* @return 回傳查詢的用戶資訊
*/
@Override
public User get(Integer id) {
return userDao.get(id);
}
/**
* 分頁查詢所有的用戶
*
* @param page 查詢第幾頁
* @param size 每頁顯示的條數
* @return 回傳查詢的用戶集合資訊
*/
@Override
public PageInfo<User> getAll(int page, int size) {
PageHelper.startPage(page, size);
List<User> all = userDao.getAll();
return new PageInfo<>(all);
}
/**
* 用戶登錄
*
* @param userName 用戶登錄名
* @param password 用戶登錄密碼
* @return 用戶資訊
*/
@Override
public User login(String userName, String password) {
return userDao.getByUserNameAndPassword(userName, password);
}
}
5) controller 層 - UserController.java
package com.xxx.controller;
import com.github.pagehelper.PageInfo;
import com.xxx.controller.results.Code;
import com.xxx.controller.results.Result;
import com.xxx.domain.User;
import com.xxx.service.UserService;
import com.xxx.system.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 用戶表現層
*
* @author : lcj
* @date : Created in 2020/8/30 8:59
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 保存用戶資訊
*/
@PostMapping
public Result save(User user) {
boolean saveFlag = userService.save(user);
return new Result(saveFlag ? Code.SAVE_OK : Code.SAVE_ERROR, saveFlag);
}
/**
* 修改用戶資訊
*/
@PutMapping("/f")
public Result updateForm(User user) {
System.out.println(user);
boolean updateFlag = userService.update(user);
return new Result(updateFlag ? Code.UPDATE_OK : Code.UPDATE_ERROR, updateFlag);
}
@PutMapping("/j")
public Result updateJson(@RequestBody User user) {
System.out.println("異步請求" + user);
boolean updateFlag = userService.update(user);
return new Result(updateFlag ? Code.UPDATE_OK : Code.UPDATE_ERROR, updateFlag);
}
/**
* 根據id洗掉用戶資訊
*/
@DeleteMapping("/{uuid}")
public Result delete(@PathVariable int uuid) {
boolean deleteFlag = userService.delete(uuid);
return new Result(deleteFlag ? Code.DELETE_OK : Code.DELETE_ERROR, deleteFlag);
}
/**
* 用戶登錄
*/
@GetMapping("/login")
public Result login(String userName, String password) {
User login = userService.login(userName, password);
return new Result(login != null ? Code.GET_OK : Code.GET_ERROR, login != null, login);
}
/**
* 根據id查詢用戶資訊
*/
@GetMapping("/{uuid}")
public Result get(@PathVariable Integer uuid) {
User user = userService.get(uuid);
//模擬出現例外,使用條件控制,便于測驗結果
if (uuid == 10) {
throw new BusinessException("查詢出錯啦,請重試!", Code.GET_ERROR);
}
return new Result(user == null ? Code.GET_OK : Code.GET_ERROR, user == null, user);
}
/**
* 分頁查詢所有用戶資訊
*/
@GetMapping("/{page}/{size}")
public Result getAll(@PathVariable int page, @PathVariable int size) {
PageInfo<User> all = userService.getAll(page, size);
return new Result(all.getList() != null ? Code.GET_OK : Code.GET_ERROR, all.getList() != null, all);
}
}
6) 資料封裝與資料回應編碼
(1) Result.java
package com.xxx.controller.results;
/**
* 表現層資料封裝類
*
* @author : lcj
* @date : Created in 2020/8/30 15:42
*/
public class Result {
/**
* 操作結果編碼
*/
private Integer code;
/**
* 操作結果成功標志
*/
private boolean flag;
/**
* 操作資料結果
*/
private Object data;
/**
* 訊息 -回傳結果資訊, 主要用于頁面提示資訊
*/
private String message;
public Result(Integer code, boolean flag) {
this.code = code;
this.flag = flag;
}
public Result(Integer code, boolean flag, Object data) {
this.code = code;
this.flag = flag;
this.data = https://www.cnblogs.com/bklcj/p/data;
}
public Result(Integer code, boolean flag, String message) {
this.code = code;
this.flag = flag;
this.message = message;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", data=" + data +
", message='" + message + '\'' +
'}';
}
}
(2) Code.java
package com.xxx.controller.results;
/**
* 表現層資料封裝編碼類 - 狀態碼常量可以根據自己的業務需求設定
*
* @author : lcj
* @date : Created in 2020/8/30 15:43
*/
public class Code {
// 操作結果編碼
/**
* 保存成功
*/
public static final Integer SAVE_OK = 20011;
/**
* 修改成功
*/
public static final Integer UPDATE_OK = 20021;
/**
* 洗掉成功
*/
public static final Integer DELETE_OK = 20031;
/**
* 獲取成功
*/
public static final Integer GET_OK = 20041;
/**
* 保存失敗
*/
public static final Integer SAVE_ERROR = 20010;
/**
* 修改失敗
*/
public static final Integer UPDATE_ERROR = 20020;
/**
* 洗掉失敗
*/
public static final Integer DELETE_ERROR = 20030;
/**
* 獲取失敗
*/
public static final Integer GET_ERROR = 20040;
// 系統錯誤編碼
// 操作權限編碼
// 校驗結果編碼
}
7) 自定義例外類
(1) 業務例外處理類 - BusinessException.java
package com.xxx.system.exception;
/**
* 業務例外類
*
* @author : lcj
* @date : Created in 2020/8/30 16:18
*/
public class BusinessException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code) {
super();
this.code = code;
}
public BusinessException(String message, Integer code) {
super(message);
this.code = code;
}
public BusinessException(String message, Throwable cause, Integer code) {
super(message, cause);
this.code = code;
}
public BusinessException(Throwable cause, Integer code) {
super(cause);
this.code = code;
}
protected BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) {
super(message, cause, enableSuppression, writableStackTrace);
this.code = code;
}
}
(2) 系統例外處理類(未實作 - 同業務例外) - SystemException.java
package com.xxx.system.exception;
/**
* @author : lcj
* @date : Created in 2020/8/30 16:18
*/
public class SystemException {
}
8) 攔截器
(1) 專案例外攔截類 - ProjectExceptionAdvice.java
package com.xxx.controller.interceptor;
import com.xxx.controller.results.Result;
import com.xxx.system.exception.BusinessException;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 專案例外攔截器類
*
* @author : lcj
* @date : Created in 2020/8/30 16:18
*/
@Component
@ControllerAdvice
public class ProjectExceptionAdvice {
/**
* 對出現例外的情況進行攔截,并將其處理成統一的頁面資料結果格式
*
* @param e 業務例外物件
* @return 資料封裝例外資訊
*/
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result doBusinessException(BusinessException e) {
return new Result(e.getCode(), false, e.getMessage());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/30801.html
標籤:Java
上一篇:這個怎么改,急
