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); 
  1. 数据库字段名 user_name----> 实体类对象 userName

  若数据库中字段名称有多个单词构成,通过逆向从工程生成会按照驼峰命名法则规范生成的属性名,其中:数据库中字段名称由多个单词构成的时候必须是下划线_分隔(自己组装结果集)

  • 数据库
    • userName username 不区分大小写
      user_name 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);
    }
posted @ 2020-10-01 13:31  Tony小哥  阅读(1073)  评论(0编辑  收藏  举报