搭建SpringBoot-MyBatis-MyBatisGenerator项目

搭建SpringBoot-MyBatis-MyBatisGenerator web 项目

以往使用tomcat下部署SSM项目, 习惯了老套路. 费尽一番周折终于把项目起来了, 当然这只是第一步…闲话少说进入正题:

问题1:相关jar包引入

jar包引入出错, 很可能会报各种class not found

pom.xml

<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>io.banjuer</groupId>
    <artifactId>kindle-note</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <start-class>com.practice.App</start-class>
        <java.version>1.8</java.version>
        <lombok.version>1.14.8</lombok.version>
        <log4jdbc.log4j2.version>1.16</log4jdbc.log4j2.version>
        <rest.assured.version>2.3.3</rest.assured.version>
    </properties>

    <dependencies>
        <!--MG依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.3</version>
            <scope>test</scope>
        </dependency>
        <!--druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.26</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--springboot依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
            <version>${log4jdbc.log4j2.version}</version>
        </dependency>
        <!--springboottest依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Springboot 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>${rest.assured.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.21</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- mybatis 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!--MG的插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.3</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java 配置这个依赖主要是为了等下在配置MG的时候可以不用配置classPathEntry这样的一个属性,避免 
                        代码的耦合度太高 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                </dependencies>
            </plugin>
            <!--springboot的插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>${spring-loaded.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

</project>

MBG配置

<?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>
    <!-- 配置文件路径 -->
    <properties resource="generatorConfig.properties" />

    <context id="iokindle" targetRuntime="MyBatis3">
        <!-- 生成的Java文件的编码-->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码-->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码-->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />

        <!-- <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin> -->
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@10.100.1.20:1521:db1" 
            userId="rams_test" password="bangsun"> </jdbcConnection> -->
        <jdbcConnection driverClass="${driver}" connectionURL="${url}"
            userId="${username}" password="${password}">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="io.kindle.dao.po"
            targetProject="src/main/java">
            <property name="constructorBased" value="true" />
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="io.kindle.dao.sqlmap"
            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER"
            targetPackage="io.kindle.dao.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- 映射实体 -->
        <table tableName="account" domainObjectName="Account" alias="ac">
            <!-- 枚举替换 -->
            <columnOverride column="type" 
                javaType="io.kindle.utils.em.AccountType" typeHandler="io.kindle.utils.handler.UniversalEnumHandler" /> 
        </table>
        <table tableName="account_user" domainObjectName="AccountUser" alias="au">
        </table>
        <table tableName="book" domainObjectName="Book" alias="bk">
        </table>
        <table tableName="friend_msg" domainObjectName="FriendMsg" alias="fm">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />   
        </table>
        <table tableName="login_log" domainObjectName="LoginLog" alias="ll">
            <columnOverride column="client_type" 
                javaType="io.kindle.utils.em.ClientType" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />   
        </table>
        <table tableName="msg_log" domainObjectName="MsgLog" alias="ml">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="account_type" 
                javaType="io.kindle.utils.em.AccountType" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="msg_type" 
                javaType="io.kindle.utils.em.SendMsgType" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />   
        </table>
        <table tableName="note" domainObjectName="Note" alias="no">
            <columnOverride column="share_state" 
                javaType="io.kindle.utils.em.ShareState" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />   
        </table>
        <table tableName="sys_code" domainObjectName="SysCode" alias="sc">
        </table>
        <table tableName="tag" domainObjectName="Tag" alias="tg">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />   
        </table>
        <table tableName="user" domainObjectName="User" alias="ur">
        </table>
        <table tableName="user_book" domainObjectName="UserBook" alias="ub">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="source" 
                javaType="io.kindle.utils.em.NoteSource" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="user_comment" domainObjectName="UserComment" alias="uc">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="user_friend" domainObjectName="UserFriend" alias="uf">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="user_info" domainObjectName="UserInfo" alias="ui">
            <columnOverride column="gender" 
                javaType="io.kindle.utils.em.Gender" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="education" 
                javaType="io.kindle.utils.em.Education" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="id_type" 
                javaType="io.kindle.utils.em.IdType" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="user_log" domainObjectName="UserLog" alias="ul">
        </table>
        <table tableName="user_tag" domainObjectName="UserTag" alias="ut">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="user_note" domainObjectName="UserNote" alias="un">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
            <columnOverride column="source" 
                javaType="io.kindle.utils.em.NoteSource" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
        <table tableName="note_model" domainObjectName="NoteModel" alias="nm">
            <columnOverride column="state" 
                javaType="io.kindle.utils.em.State" 
                typeHandler="io.kindle.utils.handler.UniversalEnumHandler" />
        </table>
    </context>
</generatorConfiguration>

附上我的枚举handler类(资料来自网络, 记不清哪里看得了,感谢大神)

/** 
 *@Project:K2N(Kindle笔记转存)
 *@FileName: BaseEnum.java
 *@Date: 2017年3月16日  
 *@Attention:本内容仅属于banjuer个人所属,禁止外泄以及用于其他的商业目的 
 */
package io.kindle.utils.handler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;  
import org.apache.ibatis.type.JdbcType;

import io.kindle.utils.em.parent.BaseEnum;

/**
 * @ClassName: UniversalEnumHandler
 * @Description: 枚举万能转换器
 * @author banjuer
 * @date 2017年3月16日 下午11:03:42
 */
public class UniversalEnumHandler<E extends BaseEnum> extends BaseTypeHandler<E> {

    private Class<E> type;
    private E[] enums;

    /** 
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现 
     * @param type 配置文件中设置的转换类 
     */  
    public UniversalEnumHandler(Class<E> type) {  
        if (type == null)  
            throw new IllegalArgumentException("Type argument cannot be null");  
        this.type = type;  
        this.enums = type.getEnumConstants();  
        if (this.enums == null)  
            throw new IllegalArgumentException(type.getSimpleName()  
                    + " does not represent an enum type.");  
    }  

    @Override  
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter,  
            JdbcType jdbcType) throws SQLException {  
        //BaseTypeHandler已经帮我们做了parameter的null判断  
        ps.setObject(i,(String)parameter.getValue(), jdbcType.TYPE_CODE);   
    }  

    @Override  
    public E getNullableResult(ResultSet rs, String columnName)  
            throws SQLException {  
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型  
        String i = rs.getString(columnName);  
        if (rs.wasNull()) {  
            return null;  
        } else {  
            // 根据数据库中的value值,定位State子类  
            return locateEnumStatus(i);  
        }  
    }  

    @Override  
    public E getNullableResult(ResultSet rs, int columnIndex)  
            throws SQLException {  
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型  
        String i = rs.getString(columnIndex);  
        if (rs.wasNull()) {  
            return null;  
        } else {  
            // 根据数据库中的value值,定位State子类  
            return locateEnumStatus(i);  
        }  
    }  

    @Override  
    public E getNullableResult(CallableStatement cs, int columnIndex)  
            throws SQLException {  
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型  
        String i = cs.getString(columnIndex);  
        if (cs.wasNull()) {  
            return null;  
        } else {  
            // 根据数据库中的value值,定位State子类  
            return locateEnumStatus(i);  
        }  
    }  

     /** 
     * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷 
     * @param value 数据库中存储的自定义value属性 
     * @return value对应的枚举类 
     */  
    private E locateEnumStatus(String value) {  
        for(E e : enums) {  
            if(e.getValue().equals(value)) {  
                return e;  
            }  
        }  
        throw new IllegalArgumentException("未知的枚举类型:" + value + ",请核对" + type.getSimpleName());  
    }  

}

问题2:generator工具的使用

对于generator插件的使用, 正确用法是(不是generator-source):
主意不是generator-source

备注:用mybatis-generator时发现一个小的问题, 当修改generator.xml生成文件位置后, 最好删除原来已生成的相关文件, 有可能resultMap标签所指向的type文件位置并未改变, 此时会报**PO class not found

到此,可以生成dao层相关文件, 进行service层开发

问题3:启动一个spring boot工程

由于是ssm出身, 在使用的时候, 习惯性启动tomcat n次, 可是死活就是进不去controller, 输入url全是404.
痛定思痛仔细读相关资料, 这货类似纯java工程而非web项目, 启动的时候使用main方法, 同理debug…

/** 
 *@Project:K2N(Kindle笔记转存)
 *@FileName: Application.java
 *@Date: 2017年3月18日  
 *@Attention:本内容仅属于banjuer个人所属,禁止外泄以及用于其他的商业目的 
 */
package io.kindle;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/** 
 * @ClassName: Application 
 * @Description: SpringBoot启动器
 * @author banjuer
 * @date 2017年3月18日 下午11:57:47 
 */
@SpringBootApplication 
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args); 
    }

}

怎么debug这货, 也是废了一番周折,在stackoverflow上找到答案, 瞬间感觉自己智商为0…
这里写图片描述
因为我以前debug的习惯是启动tomcat啊!!而这货不需要单独服务器部署..

以后开发继续跟进吧…

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值