MyBatis

最近新开了个项目,记录第一次新开项目做得一些步骤,整合mybatis就是重要的一步,这里我演示了依赖的添加,逆向文件的生成。

1.整合mybatis

1.1基础配置

先添加依赖,再增加配置文件
dependencies

 <!--Spring Boot Mybatis-plus依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
        
<!--Mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.4.1</version>
</dependency>

<!--mysql驱动包-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

build

<!--处理资源目录-->
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.*</include>
         </includes>
     </resource>
</resources>

mybatis-plus常见配置详解

mybatis-plus:
  #xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath*:/mapper/*.xml
  #MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.rest.register.dao
  configuration:
    # 是否开启自动驼峰命名规则
    map-underscore-to-camel-case: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 默认id生成规则(assign_id雪花算法)
      id-type: assign_id

多环境配置

spring:
  profiles:
    active: dev
---
spring:
  config:
    activate:
      on-profile: dev
---
spring:
  config:
    activate:
      on-profile: release

1.2实现自动代码生成

可以通过GeneratorConfig.xml这个配置文件,再执行命令实现将数据库的表转换成pojo对象类,并自动生成dao、mapper、pojo。

1.2.1先装环境

其实也就是使用mybatis-generator这个插件,增加依赖和增加插件就好。

<!--反向生成代码依赖-->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>

<!--mybatis代码自动生成插件-->
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.7</version>
    <configuration>
        <!--配置文件的位置-->
        <configurationFile>${basedir}/src/main/resources/GeneratorConfig.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
</plugin>
1.2.2增加lombok依赖

默认的mybatis-generator插件没有@Data注解,都是采用get和set,并且不能为字段增加注释。这里进行扩展,先写一个lombokPlugin,然后打包编译添加到jar包里的org.mybatis.generator.plugins目录下。(注意:这里替换的jar包得是idea编译用到的)

package org.mybatis.generator.plugins;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.internal.util.StringUtility;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 类描述:lombok自定义
 *
 * @ClassName LombokPlugin
 * @Author ward
 * @Date 2022-10-28 16:21
 */
public class LombokPlugin extends PluginAdapter {

    @Override
    public boolean validate(List<String> list) {
        return true;
    }

    /**
     * 为实体添加lombok的注解
     *
     * @param topLevelClass
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        //添加domain的import
        topLevelClass.addImportedType("lombok.Data");

        //添加domain的注解
        topLevelClass.addAnnotation("@Data");

        //添加domain的注释
        topLevelClass.addJavaDocLine("/**");
        topLevelClass.addJavaDocLine("* Created by Mybatis Generator on " + date2Str(new Date()));
        topLevelClass.addJavaDocLine("*/");

        return true;
    }

    /**
     * 为实体类字段添加注释
     *
     * @param field
     * @param topLevelClass
     * @param introspectedColumn
     * @param introspectedTable
     * @param modelClassType
     * @return
     */
    @Override
    public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        field.addJavaDocLine("/**");
        String remarks = introspectedColumn.getRemarks();
        if (StringUtility.stringHasValue(remarks)) {
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" * " + remarkLine);
            }
        }
        field.addJavaDocLine(" */");
        return true;

    }

    /**
     * mapper.xml的注释
     *
     * @param interfaze
     * @param topLevelClass
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        //Mapper文件的注释
        interfaze.addJavaDocLine("/**");
        interfaze.addJavaDocLine("* Created by Mybatis Generator on " + date2Str(new Date()));
        interfaze.addJavaDocLine("*/");
        return true;
    }

    @Override
    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        //不生成getter
        return false;
    }

    @Override
    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        //不生成setter
        return false;
    }

    private String date2Str(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        return sdf.format(date);
    }
}

在这里插入图片描述

1.2.3配置文件

配置文件放在指定目录下,pom.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>

    <!-- 引入mysql-connector-java-8.0.28.jar位置 -->
    <classPathEntry
            location="D:\JavaJar\Frame\SSM\mysql-connector-java-8.0.28.jar"/>

    <!-- 是否去除自动生成的注释 true:是 : false:否 -->
    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!-- 生成的POJO实现java.io.Serializable接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!-- 生成的POJO实现lombok注解(这就是刚刚写的代码放进去) -->
        <plugin type="org.mybatis.generator.plugins.LombokPlugin">
            <property name="hasLombok" value="true"/>
        </plugin>

        <!--抑制生成注释,注解都是英文可以不让它生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 映射数据库配置-->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/test"
                userId="root"
                password=""/>

        <!-- 生成实体类对象,放在工程src/main/java层级的com.rest.register.pojo包下  targetPackage不存在会自动创建,targetProject不存在则不自动创建,所以必须指明已存在的路径 -->
        <javaModelGenerator targetPackage="com.rest.register.pojo" targetProject="src/main/java">
        </javaModelGenerator>

        <!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
        </sqlMapGenerator>

        <!-- 生成dao接口,放在com.rest.register.mapper包下-->
        <javaClientGenerator targetPackage="com.rest.register.mapper" targetProject="src/main/java"
                             type="XMLMAPPER">
        </javaClientGenerator>

        <table tableName="user_account" domainObjectName="UserAccount"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

然后找到项目里的这个插件,直接双击就会自动生成了。
在这里插入图片描述
在这里插入图片描述

1.3简单增删改查自动实现

1.3.1 实体类先继承Model方法
@TableName(value = "t_User")
@Data
public class User extends Model<User>
        implements Serializable {
1.3.2 Service类继承IService
public interface UserService extends IService<User> {
}
1.3.3 Impl类继承ServiceImpl( 如果要重写也是在这里重写)
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {
        
    @Override
    public boolean save(DbSmartOrgPost entity) {
    	//重写个save方法
        //todo:业务处理
        this.baseMapper.insert(entity);
        return true;
    }
}
1.3.4 Controller层使用
@RequestMapping("user")
public class NewsController {

    @Resource
    private UserService UserService ;

    @PostMapping("/save")
    public JsonResult<Boolean> save(@RequestBody User user) {
        return JsonResult.success(UserService.save(user));
    }
}
1.3.5 常用的方法
//插入一条记录(选择字段,策略插入)
default boolean save(T entity)

//批量插入
default boolean saveBatch(Collection<T> entityList)

//根据id删除
default boolean removeById(Serializable id)

//根据id修改
default boolean updateById(T entity)

//根据id查询
default T getById(Serializable id)

//查询(根据 columnMap 条件)
default List<T> listByMap(Map<String, Object> columnMap)

1.4mapper语句

1.4.1 select…in ()

在sql中会使用到in查询,但是在mapper下不是简单的拼接,下面我做个错误示范:


这里userNames是string通过逗号进行分割的字符串,例如"zhangsan,lisi",
select tel
from user
where ID in (#{userNames}))

这样会查不到数据,接下来我做个正确姿势,应该是使用for each,并且传递的时候用的是List《String》

select tel
from user
where ID in
 <foreach collection="userNameArr"
          item="item"
          open="("
          separator=","
          close=")">
  #{item,jdbcType=VARCHAR}
 </foreach>

踩坑

无法初始化LombokPlugin

在这里插入图片描述
因为plugin和dependency的版本不一致导致的,所以在plugin的1.3.6里根本没找到我添加的lombok方法。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值