1.项目创建
2.pom.xml 导入依赖
<properties>
<spring.version>6.1.11</spring.version>
<mybatis.version>3.5.16</mybatis.version>
<mybatis-spring.version>3.0.4</mybatis-spring.version>
<dbcp2.version>2.12.0</dbcp2.version>
<log4j2.version>2.19.0</log4j2.version>
<servlet-api.version>6.0.0</servlet-api.version>
<jst1.version>2.0.0</jst1.version>
<taglib.version>1.2.5</taglib.version>
<jackson.version>2.15.2</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- spring-context spring的ioc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-aspects spring的aop依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-jdbc 支持数据库操作 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-tx 用于事务管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
<!-- mybatis 依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- spring与mybatis 整合依赖包,Mybatis提供用于Spring和Mybatis进行整合的关键依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- commons-dbcp2数据源 能够帮我们进行数据库连接池的管理 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${dbcp2.version}</version>
</dependency>
<!-- 引入log4j的依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<!-- spring-web 使用Spring Mvc 需要的两个依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 注意:由于Spring只支持Tomcat10+,下面的是与之对应的servlet与jst1版本依赖 -->
<!-- Spring6 依赖 jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- JSTL 2.0 标签库依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>${jst1.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>${jst1.version}</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>${taglib.version}</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>${taglib.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- Jackson是一个常用的JSON处理库,Spring MVC默认使用它来进行JSON转换。 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- 日期json格式化 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.53</version>
</dependency>
</dependencies>
3.配置文件
log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn">
<Appenders>
<!-- 控制台输出配置 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 文件输出配置 -->
<File name="FileLog" fileName="logs/ktsms.log" append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<logger name="org.springframework" level="DEBUG"/>
<logger name="org.mybatis" level="INFO"/>
<Root level="all">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileLog"/>
</Root>
</Loggers>
</Configuration>
database.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名称?userUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=账号
jdbc.password=密码
# 连接池配置
pool.maxTotal=100
pool.initialSize=20
pool.maxIdle=45
pool.minIdle=15
pool.maxWaitMillis=60000
pool.removeAbandonedOnMaintenance=true
pool.removeAbandonedOnBorrow=true
pool.removeAbandonedTimeout=180
applicationContext-mybatis.xml
org.ktmall 在配置文件表示 项目路径 注意修改
applicationContext-mybatis.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:p="http://www.springframework.org/schema/p"
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">
<!-- mybatis注解扫描service层业务组件 -->
<context:component-scan base-package="org.ktmall.mapper"/>
<!-- 读取数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 数据源配置(使用dbcp2连接池)
driverClassName:数据库驱动类配置
url:数据库连接地址
username:数据库用户名
password:数据库密码
initialSize:数据库连接池在初始化连接池时,立刻创建的连接数
maxTotal:连接池最大连接数
maxIdle:连接池最大空闲连接数
minIdle:连接池最小空闲连接数
maxWaitMillis:连接池等待获取连接的最大时间,单位为毫秒,默认-1,表示无限期等待
removeAbandonedOnMaintenance:在连接池维护线程中,是否检测连接是否已经超时
removeAbandonedOnBorrow:在获取连接的时候检测,如果空闲时间大于removeAbandonedTimeout设置的值,则关闭老的连接
removeAbandonedTimeout:连接超过removeAbandonedTimeout设置的时间,则关闭老的连接
-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:initialSize="${pool.initialSize}"
p:maxTotal="${pool.maxTotal}"
p:maxIdle="${pool.maxIdle}"
p:minIdle="${pool.minIdle}"
p:maxWaitMillis="${pool.maxWaitMillis}"
p:removeAbandonedOnMaintenance="${pool.removeAbandonedOnMaintenance}"
p:removeAbandonedOnBorrow="${pool.removeAbandonedOnBorrow}"
p:removeAbandonedTimeout="${pool.removeAbandonedTimeout}"
/>
<!-- 配置SqlSessionFactoryBean
p:configLocation="classpath:applicationContext-mybatis.xml"
dataSource-ref 属性指定数据源
typeAliasesPackage:实体类别名 ,指定实体类所在包路径,使用通配符,可以指定多个路径,多个路径之间用“,”隔开
mapperLocations :指定mapper接口所在包路径,使用通配符,可以指定多个路径,多个路径之间用“,”隔开
注意:mapperLocations指定的路径,必须是mapper接口所在路径,不能是mapper实现类所在路径
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:typeAliasesPackage="org.ktmall.entity"
p:mapperLocations="classpath:mapper/**/*.xml"
p:configuration-ref="configuration"
/>
<!-- 1.设置MyBatis框架的运行时行为 -->
<bean id="configuration" class="org.apache.ibatis.session.Configuration">
<!-- 设置下划线命名转换为驼峰命名 -->
<property name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置自动映射行为 PARTIAL:嵌套不映射 FULL:嵌套映射-->
<property name="autoMappingBehavior" value="PARTIAL"/>
</bean>
<!-- Mapper扫描器。扫描指定包中所有接口,自动注册对应的MapperFactoryBean对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.ktmall.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
applicationContext-service.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
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 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">
<!-- mybatis注解扫描service层业务组件 -->
<context:component-scan base-package="org.ktmall.service"/>
<import resource="applicationContext-mybatis.xml"/>
<!-- 1.定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/>
<!-- 使用注解支持事务处理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://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/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
xmlns:p="http://www.springframework.org/schema/p"
>
<!-- 导入配置文件 -->
<import resource="applicationContext-service.xml"/>
</beans>
applicationContext-servlet.xml (或 xxxx-mvc.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://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/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"
xmlns:p="http://www.springframework.org/schema/p"
>
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven/>
<!-- 注解扫描的包 -->
<context:component-scan base-package="org.ktmall.controller"/>
<!-- controller返回值转换为json -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!-- 处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件 -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 设置spring-mvc的请求拦截 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/do/login"/>
<mvc:exclude-mapping path="/loginProcess"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="org.ktmall.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
修改项目wedapp的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 使用监听器定义Spring容器 ContextCleanupListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 定义Spring容器的上下文参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring MVC的核心是一个Servlet,称为前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring MVC 的核心配置文件由前端控制器负责加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-servlet.xml</param-value>
</init-param>
<!-- 随容器启动,初始化加载配置 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 由Spring管理拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.实现数据库操作
1.创建实体类
(根据自己的数据库创建,不过多描述)
2.创建mapper接口
import org.apache.ibatis.annotations.Param;
import org.ktmall.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
User login(@Param("loginName") String loginName, @Param("password") String password);
}
3.创建mapper.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="org.ktmall.mapper.UserMapper">
<resultMap id="BaseResultMap" type="org.ktmall.entity.User">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="roleId" column="roleId" jdbcType="INTEGER"/>
<result property="loginName" column="loginName" jdbcType="VARCHAR"/>
<result property="userName" column="userName" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="sex" column="sex" jdbcType="INTEGER"/>
<result property="identityCode" column="identityCode" jdbcType="VARCHAR"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="mobile" column="mobile" jdbcType="VARCHAR"/>
<result property="enabled" column="enabled" jdbcType="TINYINT"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="avatarImage" column="avatar_image" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,roleId,loginName,
userName,password,sex,
identityCode,email,mobile,
enabled,create_time,update_time,
avatar_image
</sql>
<select id="login" resultType="org.ktmall.entity.User">
select
<include refid="Base_Column_List" />
from t_user
where loginName = #{loginName} and password = #{password}
</select>
</mapper>
4.创建service
创建UserService接口
路径:项目名称.service.UserService
public interface UserService {
User login(String loginName, String password);
}
创建实现类UserServiceImpl6
路径:项目名称.service.impl.UserServiceImpl
@Service("UserService")
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User login(String loginName, String password) {
return userMapper.login(loginName,password);
}
}
5.创建测试类
UserServiceImplTest.java
import org.junit.Test;
import org.ktmall.KtmallStart;
import org.ktmall.entity.User;
import org.ktmall.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImplTest {
@Test
public void logon() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
User user = userService.login("admin", "123456");
System.out.println(user);
}
}
运行结果
3.请求访问
vo类:
AjaxResult.java 数据传输功能
public class AjaxResult {
private int code; // 状态码 如:200、401、403、405、500
private String msg; //提示信息
private Object result; // 返回数据(后端返回给前端的数据)
public AjaxResult(){}
public AjaxResult(int code, String msg, Object result) {
this.code = code;
this.msg = msg;
this.result =result;
}
/**
* 成功返回结果
* @param message 提示信息
*/
public static AjaxResult success(String message) {
return new AjaxResult(200, message, null);
}
/**
* 成功返回结果
* @param message 提示信息
* @param obj 返回给前端的数据
*/
public static AjaxResult success(String message, Object obj) {
return new AjaxResult(200, message, obj);
}
/**
* 失败返回结果
* @param message 提示信息
*/
public static AjaxResult error(String message) {
return new AjaxResult(500, message, null);
}
/**
* 失败返回结果
* @param message 提示信息
* @param obj 返回给前端的数据
*/
public static AjaxResult error(String message, Object obj) {
return new AjaxResult(500, message, obj);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
工具类:
Md5Utils 加密工具类
import java.security.MessageDigest;
public class Md5Utils {
public static String MD5(String str){
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
}catch (Exception e){
return str;
}
byte[] hash = md.digest(str.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
}
}
创建 Controller(控制层)
创建:UserController.java
路径:项目名称.controller,UserController.java
代码:
import jakarta.servlet.http.HttpSession;
import org.ktmall.entity.User;
import org.ktmall.service.UserService;
import org.ktmall.utils.Md5Utils;
import org.ktmall.vo.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/do")
public class UserController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping("/login")
public AjaxResult login(@RequestParam(value = "loginName") String loginName, @RequestParam(value = "password") String password, HttpSession session) {
User login = userService.login(loginName, Md5Utils.MD5(password));
if (login != null){
// 将用户信息存储到session中
session.setAttribute("user", login);
return AjaxResult.success("登录成功",login);
}
return AjaxResult.error("账号或密码错误,登录失败!");
}
}