1.先创建一个目录src/main/resources/mybatis/,再在此目录下创建一个mybatis.cfg.xml配置文件,配置文件的内容如下
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <typeAliases><!--进行类别名的定义处理,此处设置的别名为News--> 7 <typeAlias type="com.yootk.mybatis.vo.News" alias="News"/> 8 </typeAliases> 9 <environments default="mysqlDev"> <!-- 定义数据库连接的相关配置 --> 10 <environment id="mysqlDev"> <!-- 配置MySQL数据库连接 --> 11 <transactionManager type="jdbc"/> <!-- 事务控制类型 --> 12 <dataSource type="POOLED"> <!-- 使用连接池的模式管理连接 --> 13 <property name="driver" value="org.gjt.mm.mysql.Driver" /> 14 <property name="url" value="jdbc:mysql://localhost:3306/yootk" /> 15 <property name="username" value="root" /> 16 <property name="password" value="mysqladmin" /> 17 </dataSource> 18 </environment> 19 </environments> 20 <mappers> 21 <mapper resource="com/yootk/mybatis/vo/mapper/News.xml"/> 22 </mappers> 23 </configuration>
2.再创建src/main/java/com.yootk.mybatis/vo/mapper/文件夹,再在此目录下创建New.xml配置文件,文件的配置如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <!-- 定义所有的SQL语句的映射, 对于本实体而言相关的所有的SQL代码都在此定义 --> 5 <mapper namespace="com.yootk.mapper.NewsNS"><!--这里的namespace是一个sql配置文件的唯一标识--> 6 <insert id="doCreate" parameterType="com.yootk.mybatis.vo.News"><!--这里的id是一个SQL语句的唯一标识--> 7 insert into news (title,content)values(#{title},#{content}); 8 </insert> 9 </mapper>
3.获取生成主键的方法一:
1 <!-- 1.先修改News.xml配置文件-->
<!--keyProperty="nid":描述的是当前程序VO类中对应的属性名称-->
<!--keyColumn="nid":描述的是数据表中的主键列-->
<!--useGeneratedKeys="true":进行主键的生成操作-->
2 <insert id="doCreate" parameterType="News" keyProperty="nid" keyColumn="nid" useGeneratedKeys="true"> 3 insert into news (title,content)values(#{title},#{content}); 4 </insert>
<!--在程序中通过News类对象.getNid()即可获取增长后的id内容了-->
4.获取生成主键的方法二:
1 <!--注:keyProperty="nid":表示VO类中对应的属性名称;keyColumn="nid"表示的是主键列(如果列名称和属性名称可以不写此配置);
resultType="java.lang.Long":主键查询之后的返回值类型;order="AFTER":表示的是此语句出现的位置,BEFORE是之前,AFTER是之后,在mysql中用之后,
在oracle中用之前--> 3 <insert id="doCreate" parameterType="News"> 4 insert into news (title,content)values(#{title},#{content}); 5 <selectKey keyColumn="nid" keyProperty="nid" order="AFTER" resultType="java.lang.Long"> 6 SELECT LAST_INSERT_ID() 7 </selectKey> 8 </insert>
5.当通过MyBatis传递一个参数数据的时候,这个参数的名称就可以随便写了,但是如果传递了多个参数(或VO实例,Map实例)就需要编写准确的名称。如下代码:
<delete id="doRemove" parameterType="News">
delete from news where nid=#{chjsdbvds}
</delete>
<!--如果参数名称这样写,在程序中给参数赋值的时候只能赋一个参数,不能赋成VO类对象或Map类对象-->
6.在SqlSession接口中有insert两个,delete两个,update两个,rollback,commit,还有几个查询方法,其中insert·,delete和update最终执行的都是update的方法,所以在调用的时候调用哪个方法没有实质的影响,这样写的目的只是为了我们更好的理解代码。
7.在News.xml配置文件中写findSplit()方法
<mapper namespace="com.yootk.mapper.NewsNS">
<select id="findSplit" parameterType="java.util.Map" resultType="News">
select nid,title,content from news where ${column} like #{keyword} limit #{start},#{lineSize};
</select>
</mapper>
8.关于在MySql映射文件(News.xml)中 使用"${}"和"#{}"的区别?
${属性}执行:select nid,title,content from news where title like ? limit ?,?;如果使用"${属性}",那么在生成SQL语句的时候就会自动获取里面的内容进行处理。 |
9.处理VO类属性与数据表字段名称不相同问题,采用<resultMap>标签
<!-- 在mapper标签中的首部加入resultMap标签 -->
<mapper namespace="com.yootk.mapper.NewsNS">
<resultMap id="NewsMap" type="News"> <!-- id就是以后引用的主要标记 -->
<id column="c_nid" property="nid"/> <!-- column指定列名称,property指定属性名称 -->
<id column="c_title" property="title"/> <!-- column指定列名称,property指定属性名称 -->
<id column="c_content" property="content"/> <!-- column指定列名称,property指定属性名称 -->
</resultMap>
<insert id="doCreate" parameterType="News" keyColumn="c_nid" keyProperty="nid" useGeneratedKeys="true">
INSERT INTO t_news(c_title,c_content) VALUES (#{title},#{content}) ;
</insert>
<select id="findById" parameterType="java.lang.Long" resultMap="NewsMap">
SELECT c_nid ,c_title ,c_content FROM t_news WHERE c_nid=#{wodenid} ;
</select>
</mapper>
强调:在以后的开发中还是尽量将VO类的类名称与数据表名称保持一致,VO类的属性名称与数据表的字段名称保持一致
10.为包.vo类设置别名,因为每次在设置接收参数类型或返回值类型的时候都有可能使用到包.类名称,采用别名之后会大大缩短了其长度,此配置是在mybatis.cfg.xml配置文件中设置的
<configuration><!--扫描指定包下的类,类名称自动设置为就是别名-->
<typeAliases><!--进行类别名的定义处理,写在前面-->
<package name="com.yootk.mybatis.vo"/>
</typeAliases>
</configuration>
11.一级缓存与二级缓存问题
1.一级缓存(默认开启):针对于每一个Session提供的缓存,利用SqlSession处理;同一个SqlSession接口对象实例发出两次不同的查询,但是由于查询的数据都是同一个ID内容,所以第二次查询并没有真正的向数据库里面发出查询需求,而是直接进行了一级缓存的获取。 二级缓存的说明未完待续... |
12.SSM整合第一代(Spring+SpringMVC+Mybatis)步骤:
关于框架整合的简单名词:(1).SSH:Spring+Struts1.x+Hibernate (2).SSH2:Spring+Struts2.x+Hibernate (3).SSM第一代:Spring+SpringMVC+Mybatis (4).SSM第二代:Spring+Shiro+Mybatis |
<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.yootk</groupId>
<artifactId>mybatis</artifactId>
<version>1.0</version>
<modules>
<module>mybatis-base</module>
<module>mybatis-ssm</module>
</modules>
<packaging>pom</packaging>
<properties>
<!-- 定义所有第三方依赖库的版本白拿后 -->
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<javax.servlet.jsp-api.version>2.3.3</javax.servlet.jsp-api.version>
<junit.version>4.12</junit.version>
<jstl.version>1.2</jstl.version>
<mybatis.version>3.5.1</mybatis.version>
<mysql.version>5.1.47</mysql.version>
<log4j.version>2.11.2</log4j.version>
<slf4j.version>1.7.26</slf4j.version>
<commons-pool2.version>2.6.2</commons-pool2.version>
<lettuce.version>5.1.7.RELEASE</lettuce.version>
<spring.version>5.1.7.RELEASE</spring.version>
<c3p0.version>0.9.5.4</c3p0.version>
<jackson.version>2.9.9</jackson.version>
<commons-fileupload.version>1.4</commons-fileupload.version>
<commons-io.version>2.6</commons-io.version>
<spring-data-redis.version>2.1.9.RELEASE</spring-data-redis.version>
<mybatis-spring.version>2.0.1</mybatis-spring.version>
<!-- 定义项目构建的相关环境属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-source-plugin.version>3.0.1</maven-source-plugin.version>
<maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<!-- 定义资源与profile配置 -->
<profiles.dir>src/main/profiles</profiles.dir> <!-- 定义profiles父路径 -->
<resources.dir>src/main/resources</resources.dir> <!-- 定义resources父路径 -->
<java.dir>src/main/java</java.dir> <!-- 定义java父路径 -->
</properties>
<profiles> <!-- 明确的进行具体的资源名称的配置,这个名称是在maven打包的时候使用的名称 -->
<profile> <!-- 定义具体的profile引用名称 -->
<id>dev</id> <!-- 定义profile名称为dev -->
<properties> <!-- 定义当前的profile属性名称 -->
<profile.dir>${profiles.dir}/dev</profile.dir>
</properties>
<activation> <!-- 如果在编译的时候没有设置任何的profile名字,则此配置生效 -->
<activeByDefault>true</activeByDefault> <!-- 默认打包环境 -->
</activation>
</profile>
<profile> <!-- 定义具体的profile引用名称 -->
<id>test</id> <!-- 定义profile名称为test -->
<properties>
<profile.dir>${profiles.dir}/test</profile.dir>
</properties>
</profile>
<profile> <!-- 定义具体的profile引用名称 -->
<id>product</id> <!-- 定义profile名称为product -->
<properties>
<profile.dir>${profiles.dir}/product</profile.dir>
</properties>
</profile>
</profiles>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mybatis整合spring依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!--数据库连接池依赖包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>${lettuce.version}</version>
</dependency>
<!--文件上传依赖包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!--下面三个是Json依赖包-->
<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-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!--aop依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--下面四个spring核心依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring-data-redis.version}</version>
</dependency>
<!--下面三个是日志依赖包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!---下面两个是测试依赖包->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!--下面三个是servlet的依赖包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${javax.servlet.jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!--下面两个是spring-mvc依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--数据库连接池依赖包c3p0-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>mybatis</finalName> <!-- 表示打包生成的名称 -->
<resources>
<resource>
<!-- 此处的属性是profile中统一定义的路径的名称,不同的配置文件有不同的子目录 -->
<directory>${profile.dir}</directory>
<filtering>false</filtering>
</resource>
<resource>
<directory>${java.dir}</directory>
<filtering>false</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.class</include>
</includes>
</resource>
<resource>
<directory>${resources.dir}</directory>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${maven-source-plugin.version}</version>
<executions> <!-- 进行执行配置 -->
<execution>
<id>sources</id> <!-- 设置执行的id编号 -->
<goals>
<goal>jar</goal> <!-- 打包生成的类型 -->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${maven-javadoc-plugin.version}</version>
<configuration> <!-- 配置编码 -->
<encoding>${project.build.sourceEncoding}</encoding>
<failOnError>false</failOnError> <!-- 不关心不严谨的注释 -->
</configuration>
<executions> <!-- 进行执行配置 -->
<execution>
<id>javadocs</id> <!-- 生成文件的标记 -->
<goals>
<goal>jar</goal> <!-- 生成文件的类型 -->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>true</skipTests> <!-- 跳过测试 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
(2).应该创建一个"src/main/profiles/dev/"源文件目录,并将dev文件夹设置为蓝色,并在dev文件夹下创建config包及相关配置文件,这里创建database.properties文件,下面是database.properties文件内容。
datasource.driver=org.gjt.mm.mysql.Driver
datasource.url=jdbc:mysql://localhost:3306/yootk
datasource.username=root
datasource.password=mysqladmin
datasource.maxPoolSize=1
datasource.initialPoolSize=1
datasource.minPoolSize=1
datasource.maxIdleTime=1000
(3).如果要想进行数据库连接,则一定要在"src/main/resources"(一定要将resources标记为源文件夹)源文件目录下创建有spring的配置文件目录,里面存放有spring的配置文件。
//先创建一个数据库的配置文件(spring-datasources.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${datasource.driver}"/>
<property name="jdbcUrl" value="${datasource.url}"/>
<property name="user" value="${datasource.username}"/>
<property name="password" value="${datasource.password}"/>
<property name="maxPoolSize" value="${datasource.maxPoolSize}"/> <!-- 最大连接数 -->
<property name="initialPoolSize" value="${datasource.initialPoolSize}"/> <!-- 初始化连接数 -->
<property name="minPoolSize" value="${datasource.minPoolSize}"/> <!-- 最小维持连接数 -->
<property name="maxIdleTime" value="${datasource.maxIdleTime}"/> <!-- 最大等待时间,毫秒 -->
</bean>
</beans>
(4).创建spring-transaction.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: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/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">
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 此时进行了AOP之中的切面关注点的操作配置,主要针对于事务管理生效 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes> <!-- 定义要匹配的操作业务方法 -->
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="edit*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="login*" propagation="REQUIRED"/>
<tx:method name="list*" propagation="REQUIRED" read-only="true"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 设置好事务的关注点之后,下面就需要考虑设置一个事务的横切表达式,找到业务层匹配 -->
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(public * com.yootk..service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/> <!-- 事务控制切入点 -->
</aop:config>
</beans>
(5).创建spring-base.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"
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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 进行扫描包的设置,如果要设置多个包,则可以使用“,”拆分 -->
<context:component-scan base-package="com.yootk.ssm.service,com.yootk.ssm.dao"/>
<context:property-placeholder location="classpath:config/*.properties"/>
<aop:aspectj-autoproxy/> <!-- 启用Annotation注解支持 -->
<import resource="spring-datasource.xml"/><!--将其他的spring.xml配置文件导进来(spring-mvc.xml不用导)-->
<import resource="spring-transaction.xml"/>
<import resource="spring-mybatis.xml"/><!--现在还没创建,在后面创建-->
</beans>
(6).修改web.xml配置文件,追加DispatcherServlet配置类,编码过滤器等
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 1、SpringMVC本身是运行在Spring容器之中,所以需要定义一个Spring容器的基本配置文件路径 -->
<context-param> <!-- 配置全局的初始化参数,这个参数依靠ServletContext.getInitParameter()获取 -->
<param-name>contextConfigLocation</param-name> <!-- 属性标准名称 -->
<!-- 所有的Spring配置文件只允许加载一次,不要重复加载 -->
<param-value>classpath:spring/spring-base.xml</param-value>
</context-param>
<!-- 2、通过WEB容器启动的时候实现Spring容器的启动操作 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 3、配置SpringMVC的分发处理Servlet,利用此Servlet找到所有的Action -->
<servlet>
<servlet-name>SpringMVCServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 此时配置的是SpringMVC的启动文件,该配置文件不要重复的加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVCServlet</servlet-name>
<url-pattern>*.action</url-pattern> <!-- 设置访问处理路径 -->
<url-pattern>/</url-pattern><!-- 静态资源映射 -->
</servlet-mapping>
<!-- 4、配置项目中的编码过滤器 -->
<filter>
<filter-name>EncodingFitler</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>EncodingFitler</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(7).创建spring-mvc.xml配置文件,进行springMVC的相关定义
<?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">
<context:component-scan base-package="com.yootk.ssm.action"/>
<mvc:annotation-driven/> <!-- 启用控制层的注解配置模式 -->
<mvc:default-servlet-handler/> <!-- 使用之前配置的DispatcherServlet类处理请求 -->
<!-- 定义一个页面资源解析的处理类,该类的主要功能是匹配路径的前缀与后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/> <!-- 路径前缀配置 -->
<property name="suffix" value=".jsp"/> <!-- 匹配路径后缀 -->
</bean>
<!-- 为保存在WEB-INF下所有的静态资源设置映射访问路径 -->
<mvc:resources mapping="/mvcjs/**" location="/WEB-INF/js/"/>
<mvc:resources mapping="/mvccss/**" location="/WEB-INF/css/"/>
<mvc:resources mapping="/mvcimages/**" location="/WEB-INF/images/"/>
<!-- 进行拦截器的访问路径的匹配 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/pages/**/*.action"/> <!-- 定义拦截器的匹配路径 -->
<bean class="com.yootk.ssm.interceptor.ValidationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 进行所有要加载的“*.properties”配置文件的路径定义,直接通过CLASSPATH加载 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<array> <!-- basename是只包含有包名称和文件名称的组成,不包含有后缀 -->
<value>com.yootk.message.message</value>
<value>com.yootk.message.pages</value>
<value>com.yootk.message.validation</value>
</array>
</property>
</bean>
<!-- 进行上传文件组件的相关配置,配置的是上传文件的解析处理类 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置整体上传文件的最大数据量,本次允许上传最大文件量为5M -->
<property name="maxUploadSize" value="5242880"/>
<!-- 设置单个上传文件的最大数据量,本次允许上传最大文件量为2M -->
<property name="maxUploadSizePerFile" value="253952"/>
<!-- 允许占用的最大内存量,本次设置为10M -->
<property name="maxInMemorySize" value="10485760"/>
<!-- 设置上传文件的临时保存目录,该目录的内容在每一次请求之后都需要清空 -->
<property name="uploadTempDir" value="/tmp"/>
</bean>
<!-- 定义一个全局的跳转路径配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings"> <!-- 进行异常映射的处理配置 -->
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">
plugins/errors
</prop>
</props>
</property>
</bean>
</beans>
(8).如果要进行Sping与Mybatis的整合,需要在"src/main/resources/mybatis"下创建mybatis.cfg.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>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases> <!-- 扫描指定包下的类,类名称就是别名 ,即批量定义别名-->
<package name="com.yootk.ssm.vo"/>
</typeAliases>
<mappers><!--后面会把此映射删除掉-->
<mapper resource="com/yootk/ssm/vo/mapper/News.xml"/>
</mappers>
</configuration>
(9).创建项目上所需要的VO类以及Mapping.xml(Mapping.xml文件就是那个写SQL语句的配置文件,在这里即News.xml配置文件)配置文件
说明:VO类,DAO接口和Mapping.xml配置文件在后面都可以自动生成
(10).之后就是写业务层调用数据层和以往一样了。
13.去数据层实现
(1).在将MyBatis与Spring整合的过程之中是不需要NewsDAOImpl子类的。DAO子类可以由Spring容器根据News.xml配置文件自动完成。先删除掉DAO子类。然后修改News.xml配置文件的命名空间(即namespace属性)与包.DAO接口的名称(com.yootk.ssm.dao.INewsDAO)一致,News.xml配置文件的SQL的id名称一定要与INewsDAO接口中的方法名称一一对应。
(2).创建spring-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: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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1、如果要想将MyBatis交由Spring管理,最为重要的一点就是需要配置好mybatis.cfg.xml配置文件 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 配置数据源 -->
<!-- 设置MyBatis核心配置文件的路径 -->
<property name="configLocation" value="classpath:mybatis/mybatis.cfg.xml"/>
<property name="mapperLocations" value="classpath:com/yootk/ssm/vo/mapper/*.xml"/>
</bean>
<!-- 2、追加一个映射配置转换的处理工具类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yootk.ssm.dao"/> <!-- DAO接口所在包名称 -->
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/> <!-- SessionFactory-Bean名称 -->
</bean>
</beans>
(3).既然DAO接口实现子类都依赖于配置文件,那么在mybatis.cfg.xml配置文件之中就要加载全部的DAO子类映射文件,如果一个一个加载显然非常麻烦,所以就要求利用Spring的资源加载机制,自动加载,这时删除掉前面在mybatis.cfg.xml配置的<mappers></mappers>。在"src/main/resources/spring/"下创建spring-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: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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1、如果要想将MyBatis交由Spring管理,最为重要的一点就是需要配置好mybatis.cfg.xml配置文件 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 配置数据源 -->
<!-- 设置MyBatis核心配置文件的路径 -->
<property name="configLocation" value="classpath:mybatis/mybatis.cfg.xml"/>
<!--加载所有的DAO子类映射文件,如:News.xml-->
<property name="mapperLocations" value="classpath:com/yootk/ssm/vo/mapper/*.xml"/>
</bean>
<!-- 2、追加一个映射配置转换的处理工具类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yootk.ssm.dao"/> <!-- DAO接口所在包名称 -->
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/> <!-- SessionFactory-Bean名称 -->
</bean>
</beans>
(4).进行日志设置,想要使用日志需要在"src/main/resources/"目录下导入两个文件,分别为"log4j.properties"和"log4j2.xml",在log4j.properties日志配置文件中追加"log4j.logger.com.yootk.ssm.dao=TRACE"
//这是log4j.properties文件
# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger=INFO, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
# log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.stdout.layout.ConversionPattern=%p [%c] - %m%n
#追加下面这句的意思是执行DAO方法的时候就会产生日志
log4j.logger.com.yootk.ssm.dao=TRACE
# log4j.logger.cn.mldn.amr.mapping=TRACE
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=d:/logs/mldn.
log4j.appender.logfile.DatePattern=yyyy-MM-dd-HH-mm'.log'
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
下面是log4j2.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn -->
<configuration status="warn">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
</console>
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/hpaasvc/info.log"
filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="INFO" />
<ThresholdFilter level="WARN" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/hpaasvc/warn.log"
filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" />
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<RollingFile name="RollingFileError"
fileName="${sys:user.home}/logs/hpaasvc/error.log"
filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR" />
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
</appenders>
<loggers>
<!--过滤掉spring和hibernate的一些无用的debug信息 -->
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.hibernate" level="INFO">
</logger>
<root level="all">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileInfo" />
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
</root>
</loggers>
</configuration>
14.SpringMVC整合Mybatis,在"src/main/resources/com/yootk/message/"目录下有三个文件,分别为"message.properties","pages.properties"和"validation.properties"。这三个文件都是复制粘贴,然后修改一下来的。
1.在"WEB-INF"目录下创建"/admin/pages/news"子目录,随后定义一个news_add.jsp页面,修改pages.properties资源文件,定义此页面的映射,
路径的跳转都在pages.properties资源文件中设置。
2.在validation.properties配置文件里面,追加拦截器验证规则:下面是此文件的全部信息
validation.mime.image=image/bmp;image/gif;image/jpg;image/jpeg;image/png
validation.mime.text=application/json;text/plain;text/html
com.yootk.ssm.action.NewsAction.add=title:string|content:string
3.定义NewsAction.java控制器程序类,和以往一样