学习完了Spring、SpringMVC、MyBatis的大部分相关内容后,我们来整合一个SSM框架来强化这段时间的学习认知,除了主线任务,还涉及到事务实现、日志AOP实现、MyBatis日志实现、并且在主线任务中创建各个层的实体类,当然因为比较简单,实体类的属性其实都一样,但是为了项目的完整性,一个都不能少。最后我们知道框架都有注解+配置的实现方式,我们会在适合的模块用适合的方式,例如MyBatis就使用配置好一些,Spring的AOP日志实现使用配置好一些,其它的都是使用注解好些,也就是我们会使用注解+配置的混合开发模式。
创建一个新项目
首先我们创建一个新的项目,名称是ssm-frame:
1 项目结构规划
项目整体结构如下:
2 Maven坐标导入
我们统一导入所有需要的Maven坐标,每个需要的模块我会用注释标识:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>ssm-frame</artifactId> <version>1.0-SNAPSHOT</version> <name>ssm-frame</name> <packaging>war</packaging> <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <junit.version>5.7.1</junit.version> </properties> <dependencies> <!-- Spring相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!-- Mybatis相关 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> <!-- Mybatis-Spring相关 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency> <!--Spring MVC框架依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <!--JSP-Servlet相关依赖--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <!-- 单元测试相关 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 日志相关 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.32</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </build> </project>
3 数据库关系表创建
创建person表,并插入几条数据:
MyBatis框架实现
接下来我们实现下MyBatis框架,按照如下的步骤实现:
1 domain实体类创建(PO)
首先我们需要创建一个持久化实体
Person
package com.example.ssm_frame.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /* * person表对应对象 * */ @Data @AllArgsConstructor @NoArgsConstructor public class Person { private int id; private String username; private String password; private int age; private int phone; private String email; private String hobby; }
2 PersonDao接口创建
然后创建两个接口方法,用来操作person表数据
PersonDao
package com.example.ssm_frame.dao; import com.example.ssm_frame.model.Person; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface PersonDao { List<Person> getPersonList(); int addPerson(Person person); }
3 personMapper.xml映射文件编写
绑定personMapper.xml文件如下:
personMapper.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"> <!--namespace=绑定一个指定的Dao/Mapper接口--> <mapper namespace="com.example.ssm_frame.dao.PersonDao"> <select id="getPersonList" resultType="com.example.ssm_frame.model.Person"> select * from person </select> <insert id="addPerson" parameterType="com.example.ssm_frame.model.Person" > insert into person (id,username,password,age,phone,email,hobby) values (#{id},#{username},#{password},#{age},#{phone},#{email},#{hobby}) </insert> </mapper>
4 db.properties及日志配置编写
我们需要给数据库绑定访问属性:
db.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/test?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username=root password=root
然后我们需要配置相关日志:
log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 # 设置日志输出级别以及输出目的地,可以设置多个输出目的地,开发环境下,日志级别要设置成DEBUG或者ERROR # 前面写日志级别,逗号后面写输出目的地 # log4j.rootLogger = [level],appenderName1,appenderName2,… log4j.rootLogger=Debug,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender # 输出到控制台 log4j.appender.console.Target = System.out # 指定控制台输出日志级别 log4j.appender.console.Threshold=DEBUG # 默认值是 true, 表示是否立即输出 log4j.appender.console.ImmediateFlush = true # 设置编码方式 log4j.appender.console.Encoding = UTF-8 # 日志输出布局 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式 log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender # 指定输出文件路径 log4j.appender.file.File=./log/tml.log # 指定单个日志文件最大值 log4j.appender.file.MaxFileSize=10mb # 指定输出日志级别 log4j.appender.file.Threshold=DEBUG # 默认值是 true, 表示是否立即输出 log4j.appender.file.ImmediateFlush = true # 设置编码方式 log4j.appender.file.Encoding = UTF-8 # 日志输出布局 log4j.appender.file.layout=org.apache.log4j.PatternLayout # 如果日志输出布局为PatternLayout 自定义级别,需要使用ConversionPattern指定输出格式 log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sq1.PreparedStatement=DEBUG
5 mybatis-config.xml核心配置编写
我们需要配置核心的mybatis配置文件:
mybatis-config.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核心配置文件--> <configuration> <!--导入properties文件--> <properties resource="properties/db.properties"/> <settings> <setting name="logImpl" value="log4j"/> <setting name="cacheEnabled" value="true"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/personMapper.xml"/> </mappers> </configuration>