SpringBoot 3 和Mybatis的整合
1.准备
1.SQL
CREATE TABLE studentInfo(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
address VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL,
phone VARCHAR(20) NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO studentInfo(NAME,address,email,phone)VALUES('中国移动','长春市宽城区北环城路','mobile@qq.com','10086');
INSERT INTO studentInfo(NAME,address,email,phone)VALUES('中国联通','长春市宽城区南环城路','union@qq.com','10010');
INSERT INTO studentInfo(NAME,address,email,phone)VALUES('中国电信','长春市宽城区南环城路','telecom@qq.com','10000');
2.逆向工程
使用Mybatis提供的逆向工程生成实体bean,映射文件,Mapper接口
1.逆向工程认识
逆向工程操作容易构建失败的操作:
1.逆向工程配置文件的位置
2.mysql驱动的jar包位置
3.mysql数据库的名称、密码
4.数据库表名
2.添加逆向工程插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!--配置文件的位置-->
<!--当前配置文件和pom.xml是同级的关系-->
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
3.逆向工程配置文件
<?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>
<!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
<!--1.找到mysql驱动的绝对路径-->
<classPathEntry location="D:\wenDang\Javadevelop\maven\mavenRepository\mysql\mysql-connector-java\5.1.45\mysql-connector-java-5.1.45.jar"/>
<!-- 配置 table表信息内容体,targetRuntime 指定采用MyBatis3 的版本 -->
<context id="tables" targetRuntime="MyBatis3">
<!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 2.配置数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/crm"
userId="root" password="root"></jdbcConnection>
<!--根据数据库表(字段)生成实体类、dao、映射配置文件-->
<!-- 3.生成 model类,targetPackage指定 model 类的包名, targetProject指定 生成的model放在 eclipse的哪个工程下面-->
<javaModelGenerator targetPackage="cn.ccut.springboot.domain" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<!-- 生成 MyBatis 的Mapper.xml 文件,targetPackage 指定mapper.xml 文件的 包名, targetProject 指定生成的mapper.xml 放在eclipse 的哪个工程下面 -->
<sqlMapGenerator targetPackage="cn.ccut.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成 MyBatis 的Mapper 接口类文件,targetPackage指定 Mapper接口类的包 名, targetProject指定生成的 Mapper接口放在 eclipse 的哪个工程下面 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.ccut.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--
一个table标签,代表一个表和一个实体类的对应关系
如果想创建多个实体类,就需要使用多个table标签
数据库表名及对应的Java模型类名
根据条件查询生成的一些方法 Example 条件
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"
都是自动生成的方法和sql语句配置
操作生成的api,就相当于可以执行某些sql语句
多表自己写SQL
-->
<table tableName="user1" domainObjectName="Activity" enableCountByExample="true"
enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true"
selectByExampleQueryId="true"/>
</context>
</generatorConfiguration>
4. 生成
- 通过Maven ---> mybatis-generator 想tomcat7 插件一样
补充:
Mapper 当在GM配置文件中指定下列为 false
enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="true" enableSelectByExample="false"
selectByExampleQueryId="false"
会生成只有6个方法
int deleteByPrimaryKey(Integer id);
int insert(StuInfo record);
int insertSelective(StuInfo record);
StuInfo selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(StuInfo record);
int updateByPrimaryKey(StuInfo record);
- 数据库字段名 user_name----> 实体类对象 userName
若数据库中字段名称有多个单词构成,通过逆向从工程生成会按照驼峰命名法则规范生成的属性名,其中:数据库中字段名称由多个单词构成的时候必须是下划线_分隔(自己组装结果集)
- 数据库
- userName username 不区分大小写
user_name userName 通常时候按照这样
- userName username 不区分大小写
3. 思路
1.导入启动器依赖
2.配置数据库信息
spring.datasources.xxx
url参数设置,如果使用高版本的驱动包,必须添加一些参数
3.编写代码
controller
service
dao
domain
4.pom.xml加载映射配置文件
<resources>....
映射配置文件中,domain写全限定路径
5.在引导类中添加mapper批量扫描的注解
或者在dao接口上添加@Mapper注解
4.Mapper文件的扫描文件
1.在每一个mapper文件中加入@mapper注解(方案一)
@Mapper //扫描Mapper 接口到spring容器
// @Mapper 可以根据该接口创建代理对象,交给spring容器进行管理
public interface StuInfoMapper {
2.启动类上加入扫描@mapperScan
- 解决不能每次都在每一个类上加Mapper注解
// 开启要扫描mapper接口的包
@SpringBootApplication
// mapper批量扫描,将该包下的接口,批量创建代理对象,交spring容器去管理
@MapperScan(basePackages = "cn.ccut.springboot.mapper")
public class ZhenQkApplication {
public static void main(String[] args) {
SpringApplication.run(ReverseApplication.class, args);
}
}
- 参数说明
- MapperScan 路径要详细到包
- basePackages 可以省略
3. 把mapper映射迁移到resources目录下
- 在主配置文件application.properties指定Mybatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
# 编译之后还会合在一起
不是.java java编译器不会编译
2.整合
1.导入依赖和手动指定生成资源文件夹
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis 集成springboot起步依赖-->
<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>
</dependency>
</dependencies>
手动指定资源文件夹
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
2. 配置数据库的连接信息
# 若使用高版本的mysql 驱动,必须指定下列参数
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# mysql 输出SQL 日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3.进行增删改查
- domain,mapper,映射文件无需考虑,只需考虑业务
1. 查询所有
userInfoMapper.selectByExample(null)
2. 查询一条记录
- StuInfoController
@Controller
public class StuInfoController {
@Autowired
private StuInfoService stuInfoService;
@RequestMapping("/getOne")
public @ResponseBody StuInfo getOne(Integer id){
return stuInfoService.getOne(id);
}
}
- StuInfoServiceImpl
@Service
public class StuInfoServiceImpl implements StuInfoService {
@Autowired
private StuInfoMapper stuInfoMapper;
@Override
public StuInfo getOne(Integer id) {
return stuInfoMapper.selectByPrimaryKey(id);
}
}
3.根据条件进行查询
- Controller
@RestController
public class StuInfoController {
@Autowired
private StuInfoService stuInfoService;
// 传递的参数封装到集合中 @RequestParam
@RequestMapping("/findByExample")
public Object getEx(@RequestParam Map<String,Object> param){
return stuInfoService.findByExample(param);
}
}
- impl
@Override
public Object findByExample(Map<String, Object> param) {
//根据市场活动名称进行等值查询、模糊查询
//创建条件对象
stuInfoExample example = new stuInfoExample();
//封装条件,Criteria条件
stuInfoExample.Criteria criteria = example.createCriteria();
//条件查询,格式:and + 属性名称 + 查询条件
//根据名称进行等值查询:andNameEqualTo(String name);
// criteria.andNameEqualTo((String) param.get("name"));
criteria.andNameLike("%"+(String) param.get("name")+"%"); //模糊查询
//会在执行sql之前,将条件封装到sql中,然后再执行。
List<stuInfo> stuInfos = stuInfoMapper.selectByExample(example);
return stuInfos;
}
4.插入insert 和insertSelective
stuInfoMapper.insert(activity);
5.修改update 和updateSelective
stuInfoMapper.updateByPrimaryKey(stuInfo); //将没有赋值的属性字段给覆盖成null
stuInfoMapper.updateByPrimaryKeySelective(stuInfo);//只修改赋值的属性字段
6.删除deleteById
stuInfoMapper.deleteByPrimaryKey(id);
3.事务
- @Transactional 可以修改到类上也可以修饰到方法上
- 若没有开启事务,事务失效,手动开启
- 在引导类上添加注解 (2.0之前需要在入口类上加 @EnableTransactionManagement(可选项))
@Transactional
public StuInfo updateOne(StuInfo StuInfo) {
return stuInfoMapper.updateByPrimaryKey(StuInfo);
}
不停的思考,就会不停的进步