01月18, 2019

MyBatis手把手跟我做(七) Maven工程问题与常用插件

MyBatis(七) Maven工程问题与MyBatis Generator

上一章将一般的Maven工程转换为了Web工程,主要是为了说明两个问题:

  1. MyBatis在DAO层中Mapper的动态代理
  2. 在Web工程中使用MyBatis

但是有反馈说从头开始创建Maven结构的Web工程,在IDEA上有很多问题,针对这个情况,这一张我们就从头开始直接创建一个Web工程

而且在后面还介绍了一个常用的MyBatis工具Generator,可以直接帮我们生成DAO层所需要的java文件

一.创建Maven结构的Web工程

2019-01-18_10-08-39

2019-01-18_10-11-36

2019-01-18_10-19-20 2019-01-18_10-23-41

再次点击 Finish 就能帮我们创建好一个基于Maven的Web工程

二.解决IDEA上Maven结构Web工程的问题

创建好工程之后会弹出下面的通知提示,建议像下面这样选择 2019-01-18_10-52-32

但是,现在我们的Maven工程还有一定的问题 2019-01-18_11-02-45

这个需要我们自己在工程结构中自己配置一下 2019-01-18_11-15-03

2019-01-18_11-13-24

然后自己手动创建Maven工程需要的文件夹,如下: 2019-01-18_11-22-28

但是并不是创建文件夹之后就完事了,每个文件夹都有对应的功能,这个主要是为了工程在编译的时候把相应的文件放在合适的位置

因此,我们还需要标识每个文件夹的功能

src/main/java :     Sources                 java源文件夹 
src/main/resources : Resources             项目资源文件夹     
src/test/java :    Tests                      项目测试文件夹
src/test/resources:         Test Resources      测试资源文件夹

2019-01-18_11-35-16 右键点击文件夹,为每个文件夹标识合适的功能,标识之后就会变成下面这个样子 2019-01-18_11-38-03

三.Tomcat的配置

这里的内容实际在上一章已经介绍过,不过这里集中再介绍一下

1.下载Tomcat

要在IDEA中配置Tomcat,当然你自己机器本地需要先下载一个Tomcat,下载过程就不再多说了,自己去下载就OK了

2.在全局配置中设置Application Server

2019-01-15_10-36-35

2019-01-15_10-38-01

3.工程配置Tomcat

打开运行配置: 2019-01-18_11-49-22 添加本地Tomcat Server: 2019-01-18_11-51-26 Tomcat添加项目资源: 2019-01-18_12-45-11

设置访问上下文: 2019-01-18_12-48-22

设置Tomcat访问路径以及热部署: 2019-01-18_12-52-42

在工程中添加Java Web相关jar包: 这里主要是Servlet,jsp的相关依赖包,这些jar包本来就在Tomcat的lib路径中,所以可以直接从Tomcat中引入.

下面是直接从Tomcat引入的IDEA配置:

2019-01-18_13-04-26

当然也可以通过Maven下载的方式找到这几个jar包.

<!-- 引入servlet的jar包 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<!-- 引入jsp的jar包 -->
<dependency> 
   <groupId>javax.servlet.jsp</groupId> 
   <artifactId>jsp-api</artifactId> 
   <version>2.1</version> 
   <scope>provided</scope>
</dependency>
<!-- 引入JSTL的jar包 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

注意1:两种方式你选择一种就可以了!不然的话会有jar包冲突

这样Tomcat与你的项目在IDEA上基本就已经部署好了,我们可以运行一下这个空项目测试一下 2019-01-18_13-24-29

2019-01-18_13-25-57

注意2:如果要在jsp页面使用EL表达式,在IDEA中默认使用maven建立的webapp工程是不支持的

如果要让jsp页面支持EL表达式,修改方式很简单,改一下web.xml中的声明就好了,因为默认生成的web.xml声明是web-app2.3版本的,而web-app2.5之后才支持EL表达式,所以,工程建立好之后,直接先将web.xml改成下面的样子就可以了,我这里是copy了一个4.0的声明,反正web-app2.5版本之后的声明其实都可以

<?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">
  <display-name>Archetype Created Web Application</display-name>
</web-app>

四.使用MyBatis Generator

现在Web工程已经建好了,但是毕竟是一个新项目,相当于Dao,Service,Controller这些我们还是得从头来,首先是Dao层,难道我们那些Mapper.xml文件还要再写一次吗?其实没必要,每张表的增删改查操作大体都差不多,所以,MyBatis官方已经帮我们写了一个代码生成工具,可以通过数据库表直接生成实体类,Mapper接口与Mapper.xml文件

下面是使用步骤:

1.下载

你可以到MyBatis Generator GitHub站点去下载,当前最新版本是MyBatis Generator Release 1.3.7 2019-01-18_13-53-32

2.需要用到的jar包和XML配置文件

要使用MyBatis Generator,需要下面的这些内容 (1). mybatis-generator-core-1.3.7.jar文件 (2). mysql数据库的jar文件mysql-connector-java-5.1.47.jar (3). 配置文件 (4). 存放生成文件的文件夹

最好把这些东西都放在一个统一的路径下面,注意:路径不能有中文,就像下面这个样子: 2019-01-18_14-28-35

这里最重要的就是xml文件,其实里面就定义了从数据库文件到java文件的映射

具体代码如下,下面代码都有具体的注释,其实主要不同的地方就是jar文件的位置,数据库地址和用户密码,生成表的名字和实体类名字,生成文件的位置,大家自己在用的时候,都能看懂哪里需要修改,如果你想了解每一个标签的具体意义,可以到官网 MyBatis GeneratorXML Configuration File Reference

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动包位置 -->
    <!-- oracle -->
    <!-- <classPathEntry location="C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar" />-->
    <!-- mysql -->
    <classPathEntry location="/Users/yingside/mybatis/generator/mysql-connector-java-5.1.47.jar" /> 

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库链接URL、用户名、密码 -->
        <!-- oracle -->
        <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="root" password="root"> -->
        <!-- mysql -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3307/crm" userId="root" password="123456"></jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置 -->
        <javaModelGenerator targetPackage="com.yingside.model" targetProject="/Users/yingside/mybatis/generator/src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成的映射文件包名和位置 -->
        <sqlMapGenerator targetPackage="com.yingside.mapper" targetProject="/Users/yingside/mybatis/generator/src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.yingside.dao" targetProject="/Users/yingside/mybatis/generator/src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
        <table tableName="t_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
        <table tableName="t_dept" domainObjectName="Dept" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
        <table tableName="t_emp" domainObjectName="Employee" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />    
    </context>
</generatorConfiguration>

3. 运行生成java代码

你只需要在命令行中运行java命令来生成文件就行了,当然,首先的命令行路径应该在当前jar包的路径下

java -jar mybatis-generator-core-1.3.7.jar -configfile generator.xml -overwrite

这样你的Dao层代码,以及和数据库对应的实体类代码全部都自动生成了,当然,就像官方的说明一样,这个生成工具只能帮你生成最简单的,单表的CRUD操作,如果你需要复杂的,多表级联查询的sql操作,还是只有自己写...

比如,生成的UserMapper接口就是下面的这个样子

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(User record);
    int insertSelective(User record);
    User selectByPrimaryKey(Integer id);
    int updateByPrimaryKeySelective(User record);
    int updateByPrimaryKey(User record);
}

UserMapper.xml生成的就是与接口对应的基本的增删改查操作

如果,你实在觉得这样还是麻烦,下面这个工具还不错mybatis-generator-gui

其实他就是给上面的这些操作给套了一个GUI的界面,完全傻瓜式的操作,不过确定也很明显,一次就只能针对生成一张表,有兴趣的同学可以去试试

4.IDEA直接配置generater

(1)、配置generater maven运行插件,注意是在POM.xml文件的plugins标签中配置

</plugins>
    <!--其他配置省略-->
    <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
            <configuration>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
    </plugin>
</plugins>

-w614

2、放入generatorConfig文件

注意1:文件名不能修改 注意2:需要修改生成文件存放的路径地址

-w298

3、配置maven插件运行环境

maven

5、运行

-w369 -w743

五、分页插件-pagehelper

1、POM文件导入jar包

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>

2、mybatis全局配置中设置分页拦截器

<!--配置分页的拦截器-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!--配置你所使用的数据库-->
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

3、代码

分两步:

1、设置当前页码与每页显示数量
2、当获取的数据传入到PageInfo构造器请

public PageInfo<User> getPage(int pageNo, int pageSize) throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    //注意:这句话一定要放在读取数据的前面,才能实现拦截
    PageHelper.startPage(pageNo,pageSize);
    List<User> users = userMapper.getAll();
    //将集合对象放入到PageInfo中
    PageInfo<User> page = new PageInfo<User>(users);
    sqlSession.close();
    return page;
}

本文链接:http://www.yanhongzhi.com/post/mybatis-generator.html

-- EOF --

Comments