最近在用spring boot做了一个管理端项目,用到了很多技术。学习入门一个框架不难,难得是对这个框架运用非常熟练,并且一些常见的业务场景都能解决。接下来我们先来搭建这样一个框架,同样的这个框架能根据数据库表自动生成代码。后面会在该框架上添加很多东西。

数据库准备

我们准备一个student表

表结构如下图:

表数据如下:

开始搭建

先创建一个基础框架

在idea中新建spring boot项目,项目名称为springboot-mybatis-demo。

要选的3个关键基础依赖如下:-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

直接在新建项目时就添加上,如下图:

注意:在连接数据时我们一般需要添加 spring-boot-starter-jdbc依赖,这次demo用的持久层是mybatis,引入了mybatis-spring-boot-starter依赖,这个依赖中包含 spring-boot-starter-jdbc依赖,所以再不用去添加spring-boot-starter-jdbc了

修改springboot版本为2.0.3,在appliation.yml文件中配置数据库连接

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring-frame-db?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC
    username: root
    password: root
    
#mybatis配置
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: mybatis/mapper/*

在resource下新建一个mybatis文件夹,该文夹下再新建一个mybatis-config.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="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

测试下是否能正常启动。

添加自动生成代码模块

上面我们已经搭建了一个springboot + mybatis框架了,接下来添加根据数据库表自动生成dao层,实体类等代码的部分。

添加依赖

<!-- mybatis生成 jar包 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
</dependency>
<!--工具包-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8</version>
</dependency>

添加自动生成代码的配置

resource下新建一个generator目录,在该目录下新建一个generator.properties文件,用于配置自动生成代码时连接的数据库,如下:

#数据库驱动jar包地址
jdbc.driverLocation=C:\\project\\maven\\MavenRepository\\mysql\\mysql-connector-java\\5.1.45\\mysql-connector-java-5.1.45.jar
jdbc.driverClass=com.mysql.jdbc.Driver
#数据库名及账号密码
jdbc.connectionURL=jdbc:mysql://localhost:3306/spring-frame-db
jdbc.userName=root
jdbc.password=root

在generator目录目录下再新建一个generatorConfig.xml文件,用于配置生成的一些代码文件要存放的路径等,如下:

<?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="generator/generator.properties"></properties>
    <!--指定特定数据库的jdbc驱动jar包的位置-->
    <classPathEntry location="${jdbc.driverLocation}"/>
    <context id="default" targetRuntime="MyBatis3">
        <!-- 生成的pojo,将implements Serializable-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" /><!-- 是否取消注释 -->
            <!-- <property name="suppressDate" value="true" />  是否生成注释代时间戳 -->
        </commentGenerator>
        <!--jdbc的数据库连接 -->
        <jdbcConnection
                driverClass="${jdbc.driverClass}"
                connectionURL="${jdbc.connectionURL}"
                userId="${jdbc.userName}"
                password="${jdbc.password}">
        </jdbcConnection>
        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
            targetPackage     指定生成的model生成所在的包名
            targetProject     指定在该项目下所在的路径
        -->
        <javaModelGenerator targetPackage="com.example.springbootmybatisdemo.model" targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="false"/>
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>
        <!--在resources目录下的mapper文件,生成数据库的表对应的xml文件 -->
        <sqlMapGenerator targetPackage="mybatis/mapper"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成dao层的java代码
                type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
        -->
        <javaClientGenerator targetPackage="com.example.springbootmybatisdemo.dao"
                             targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 数据表名及实体类名称  -->
        <table tableName="student" domainObjectName="Student"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false">
            <generatedKey column="id" sqlStatement="mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

添加自动生成代码工具类

public class GeneratorUtil {
    public static void main(String[] args) {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        String genCfg = "/generator/generatorConfig.xml";
        File configFile = new File(GeneratorUtil.class.getResource(genCfg).getFile());
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = null;
        try {
            config = cp.parseConfiguration(configFile);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = null;
        try {
            myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        }
        try {
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行刚才添加的工具类,会生成一些代码文件,如下图:

添MapperScan注解

最后别忘了给启动类上加上@MapperScan注解,如下:

@MapperScan(basePackages = "com.example.springbootmybatisdemo.dao")

测试

我们这里直接编写一个StudentController类,代码如下:

@RestController
public class StudentController {
    @Resource
    StudentMapper studentMapper;
    @GetMapping("/test")
    public Object test(){
        return studentMapper.selectByPrimaryKey(1L);
    }
}

启动项目成功后,用idea自带的工具发请求测试,请求路径为:localhost:8080/test