在日常开发中,如果启动项目后,再次修改Mapper XML文件,必须重启服务才能生效,这样就大大影响了我们的开发效率。在近期接触到的项目里面,有个这个功能,趁着假期,查了些资料,将里面的用法拿出来,记录一下:

具体的源码还没来得及研究,水平有限,也看不懂源码。。。。。。。。。。

实际就是重写了mybatis的加载xml文件的方法,这个类SqlSessionFactoryBean被修改了,项目需要用修改后的这个文件,具体内容在源码里,怎么使用在文章的最后,前面是搭建maven项目的简单步骤。
项目源码地址https://github.com/linmengmeng-1314/testgit/tree/master/maven-demo1230

这里重建一个完整的maven-demo,顺便记录一下maven搭建web项目,我用idea和eclipse都是可以正常搭建maven项目的,但是公司用的都是myeclipse,刚开始我用myeclipse搭建maven项目时总是跑不起来,我也是服气,在折腾了好几天之后,总算弄好了,到现在我都不知道之前是哪里的原因。

首先是新建一个maven项目:

实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache
这里不勾选跳过骨架 快速创建:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_02
下一步中关于groupid和artifactId这两个参数的说明:

groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
  groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。

实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_mapper热部署_03
初步创建完成之后,项目结构目录为:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_其他_04
这里可以看到pom.xml文件报错了,打开可以看到错误提示:
提示Web Project Version丢失,手动添加即可,将鼠标放在project上,即可出现下图弹窗(如果不显示点击一下第一行前面的红色的叉号),然后点击提示的3.0或者3.1即可自动添加Web Project Version
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_maven_05
添加之后project上面的错误就消失了:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_mapper热部署_06
这时候可以看到项目的jre版本还是1.5,我们来将其改为1.7,在pom文件的build标签下的plugins标签里面添加:

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>
			<!-- 引入tomcat插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<uriEncoding>UTF-8</uriEncoding>
					<path>/maven-1224</path>
					<port>8088</port>
				</configuration>
			</plugin>

顺带指定maven内置的tomcat版本为tomcat7,端口改为8088,然后右键项目名–>Maven4Myeclipse–>Update Project,直接点击OK,即可看到项目的编译版本变成1.7了,也不报错了:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_07

到这里一个简单的、完整的、maven空壳项目就算完成了。

下面是Springmvc整合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.lin.demo</groupId>
  <artifactId>maven-demo1230</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  	<properties>
		<srping.version>4.0.2.RELEASE</srping.version>
		<mybatis.version>3.2.8</mybatis.version>
		<slf4j.version>1.7.12</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
		<commons-lang3.version>3.3.2</commons-lang3.version>
		<commons-io.version>2.4</commons-io.version>
		<commons-codec.version>1.9</commons-codec.version>
		<commons-fileupload.version>1.3.1</commons-fileupload.version>
	</properties>
	<!-- 用到的jar包 -->
	<dependencies>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<!-- 表示开发的时候引入,发布的时候不会加载此包 -->  
			<scope>test</scope>
		</dependency>
		<!-- java ee包 -->
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- spring框架包 start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-oxm</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-aspects</artifactId>
		    <version>${srping.version}</version>
		</dependency>
		<!-- spring框架包 end -->
		<!-- mybatis框架包 start -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
		<!-- mybatis框架包 end -->
		<!-- 数据库驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.35</version>
		</dependency>
		<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<!-- 数据库连接池、驱动 -->
		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.10</version>
		</dependency>
		<!-- jstl标签类 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- log start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</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>
		<!-- log END -->
		<!-- Json  -->
		<!-- 格式化对象,方便输出日志 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.6</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		<!-- 上传组件包 start -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>${commons-codec.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${commons-fileupload.version}</version>
		</dependency>
		<!-- 上传组件包 end -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>${commons-lang3.version}</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<version>3.0</version>
				</configuration>
			</plugin>
		    <!-- 引入tomcat插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<uriEncoding>UTF-8</uriEncoding>
					<path>/maven-demo1230</path>
					<port>8088</port>
				</configuration>
			</plugin>
			
		</plugins>

	</build>
</project>

项目源码地址https://github.com/linmengmeng-1314/testgit/tree/master/maven-demo1230

完整的项目结构如图所示:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_08
圈中的地方是mybatis热部署的必须的文件,需要原封不动的加到项目里面,才能在修改mapper文件之后,不用重启项目即可生效,如果需要迁移进自己的项目,直接将圈中的部分添加到项目中即可。
需要注意的地方有三点:ApplicationContext-dao.xml中的配置mapper的内容都在图中标出来了,其中需要用到commons-long3这个jar包,记得在自己的项目中添加此依赖:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_maven_09
运行项目:
右键项目名:Run as–>Maven build…(后面三个点的那一项)进入下图页面,输入tomcat7:run,点击Apply,运行即可,下次重新运行时,可直接选中Run as下面的Maven build即可。
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_其他_10
下图所示是正常启动项目,如果报错了,就需要检查一下是不是哪一步的疏忽造成的问题了,细心点来,就可以了。
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_其他_11

然后试着在浏览器里访问:http://localhost:8088/maven-demo1230/list?id=1 查询id为1的用户信息
浏览器显示的结果为:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_12

这时我们尝试改TbUserMapper.xml中的selectByPrimaryKey的SQL语句:
将查询的内容改为只查询id和名称
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_13
Ctrl + S 保存之后,即可看到控制台输出刷新当前修改的文件名,这时不用重启项目,就可以是刚才更改的内容生效了,是不是很方便呢~
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_mapper热部署_14

再次刷新浏览器,结果为:
实现项目启动之后,修改Mapper XML内容不用重启即可生效(mapper文件热部署)_apache_15