一、建立一个普通spring Initializr项目
一路next,依赖我们在pom.xml中导入。
建立pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<overwrite>false</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
连接数据库
application.properties 中添加数据源:
spring.datasource.url = jdbc:mysql://localhost:3306/sakila?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
二、手动spring 整合 MyBatis
crc/main目录下建立这几个包,还是规范些好
包名:com.study.mybatis
实体类:entity
永久层:mapper
控制层:controller
com.study.mybatis.entity下建立Actor。这里建议大家去MySQL官网下载测试数据库。这里用到的是sakila数据库的actor表。sakila下载安装
数据库安装好之后,着手建立spring+mybatis工程去访问它。
首先在entity目录建立Actor类
public class Actor {
private Short actorId;
private String firstName;
private String lastName;
private Date lastUpdate;
//idea下alt+insert插入getter&setter
}
com.study.mybatis.mapper下建立userMapper接口
@Component("ActorMapper")//提示编辑器注册了这个bean,不写Controller层会有波浪线,不会报错。
@Mapper//这个不写真会报错。
public interface ActorMapper {
List<Actor> selectByPrimaryKey(Short actorId);
}
com.study.mybatis.mapper下建立suerMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mybatis.mapper.ActorMapper">
<resultMap id="BaseResultMap" type="com.study.mybatis.entity.Actor">
<!--有些博客这里用的构造器注入,那么实体类Actor下面就要有构造器-->
<result property="actorId" column="actor_id" javaType="java.lang.Short" jdbcType="SMALLINT" />
<result property="firstName" column="first_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="lastName" column="last_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="lastUpdate" column="last_update" javaType="java.util.Date" jdbcType="TIMESTAMP" />
</resultMap>
<select id="selectByPrimaryKey" parameterType="java.lang.Short" resultMap="BaseResultMap">
select * from actor where actor_id = #{actorId,jdbcType=SMALLINT}
</select>
<!--这里添加其他的增删改查-->
</mapper>
注意xml直接使用“<”,"<="这种条件语句会报错
select * from actor where actor_id < #{id} //这样不行,因为"<",">"会被误认为标签,
方法一:替代
< <= > >=
< <= > >=
方法二:使用<![[CDATA] sql语句 ]>:
<select id="selectByPrimaryKey" parameterType="java.lang.Short" resultMap="BaseResultMap">
<![CDATA[ select * from actor where actor_id <= #{actorId,jdbcType=SMALLINT} ]]>
</select>
com.study.mybatis下建立controller:
@RestController
public class userController {
@Autowired
private ActorMapper actormapper;//这里波浪线待会Mapper接口上加注解@Component("ActorMapper")
@GetMapping("/get={id}")
List<Actor> select(@PathVariable short id){
return actormapper.selectByPrimaryKey(id);
}
}
编译运行,http://localhost:8080/get=1,
三、MyBatis Generator自动生成实体类和Mapper接口
如果表格多,每个表的字段也多的话,手动配置Mapper接口和entity试下,加班的元凶找到了。java生态真不是夸出来的,MyBatis Generator这个插件就可以根据表自动生成Mapper接口和entity实体类。
pom.xml后面添加插件
plugins中也要添加mysql-connector-java不然插件没法连接数据库。(前面的pom.xml已经加了)
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<overwrite>false</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
</plugin>
</build>
resource中添加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>
<!-- context 是逆向工程的主要配置信息 -->
<!-- id:起个名字 -->
<!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
<context id="default" targetRuntime="MyBatis3">
<!--optional,指在创建class时,对注释进行控制-->
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--jdbc的数据库连接 wg_insert 为数据库名字-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/sakila?serverTimezone=Asia/Shanghai"
userId="root"></jdbcConnection>
<!--非必须,类型处理器,在数据库类型和java类型之间的转换控制-->
<javaTypeResolver>
<!-- 默认情况下数据库中的 decimal,bigInt 在 Java 对应是 sql 下的 BigDecimal 类 -->
<!-- 不是 double 和 long 类型 -->
<!-- 使用常用的基本类型代替 sql 包下的引用类型 -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- targetPackage:生成的实体类所在的包 -->
<!-- targetProject:生成的实体类所在的硬盘位置 -->
<javaModelGenerator targetPackage="com.study.mybatis.entity"
targetProject="src/main/java">
<!-- 是否允许子包 -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对modal添加构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
<property name="trimStrings" value="true"/>
<!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 -->
<sqlMapGenerator targetPackage="com.study.mybatis.mapper"
targetProject="src/main/java">
<!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.study.mybatis.mapper" targetProject="src/main/java">
<!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- tableName是数据库中的表名,domainObjectName是生成的JAVA模型名,后面的参数不用改,要生成更多的表就在下面继续加table标签 -->
<table tableName="actor" domainObjectName="Actor"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
运行maven插件
右边侧栏点maven,mybatis>plugin中可看见mybatis-generator,点第一个运行。
会自动在"src/main/java"目录下生成这几个文件。
记得在Mapper接口类上面添加@Mapper。
@Component //可以不加
@Mapper
public interface ActorMapper {
List<Actor> selectByPrimaryKey(Short actorId);
}
如果usercontraller支持范围查找,返回List,而不是Actor,记得修改自动生成的Mapper接口对应的方法。
@RestController
public class userController {
@Autowired
private ActorMapper actormapper;//前面的ActorMapper 类前面没有@Component这里会有提示不过运行没问题
@GetMapping("/get={id}")
List<Actor> select(@PathVariable Short id){
return actormapper.selectByPrimaryKey(id);
}
}