最近在用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