在日常开发中,如果启动项目后,再次修改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项目:
这里不勾选跳过骨架 快速创建:
下一步中关于groupid和artifactId这两个参数的说明:
groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。
初步创建完成之后,项目结构目录为:
这里可以看到pom.xml文件报错了,打开可以看到错误提示:
提示Web Project Version丢失,手动添加即可,将鼠标放在project上,即可出现下图弹窗(如果不显示点击一下第一行前面的红色的叉号),然后点击提示的3.0或者3.1即可自动添加Web Project Version
添加之后project上面的错误就消失了:
这时候可以看到项目的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了,也不报错了:
到这里一个简单的、完整的、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
完整的项目结构如图所示:
圈中的地方是mybatis热部署的必须的文件,需要原封不动的加到项目里面,才能在修改mapper文件之后,不用重启项目即可生效,如果需要迁移进自己的项目,直接将圈中的部分添加到项目中即可。
需要注意的地方有三点:ApplicationContext-dao.xml中的配置mapper的内容都在图中标出来了,其中需要用到commons-long3
这个jar包,记得在自己的项目中添加此依赖:
运行项目:
右键项目名:Run as–>Maven build…(后面三个点的那一项)进入下图页面,输入tomcat7:run,点击Apply,运行即可,下次重新运行时,可直接选中Run as下面的Maven build即可。
下图所示是正常启动项目,如果报错了,就需要检查一下是不是哪一步的疏忽造成的问题了,细心点来,就可以了。
然后试着在浏览器里访问:http://localhost:8088/maven-demo1230/list?id=1 查询id为1的用户信息
浏览器显示的结果为:
这时我们尝试改TbUserMapper.xml中的selectByPrimaryKey的SQL语句:
将查询的内容改为只查询id和名称
Ctrl + S 保存之后,即可看到控制台输出刷新当前修改的文件名,这时不用重启项目,就可以是刚才更改的内容生效了,是不是很方便呢~
再次刷新浏览器,结果为: