一、mybatis代码生成器

maven项目
maven参考2
gradle项目
驱动下载地址 进去点击no,thanks just start download

1.自己做代码生成器

1.正常创建一个springboot的maven项目
2.pom加插件
            <!--mabatis生成器-->
<build>
  <plugins>
       <plugin>
           <groupId>org.mybatis.generator</groupId>
           <artifactId>mybatis-generator-maven-plugin</artifactId>
           <version>1.3.2</version>
           <configuration>
               <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
               <verbose>true</verbose>
               <overwrite>true</overwrite>
           </configuration>
           <executions>
               <execution>
                   <id>Generate MyBatis Artifacts</id>
                   <goals>
                       <goal>generate</goal>
                   </goals>
               </execution>
           </executions>
           <dependencies>
               <dependency>
                   <groupId>org.mybatis.generator</groupId>
                   <artifactId>mybatis-generator-core</artifactId>
                   <version>1.3.2</version>
               </dependency>
           </dependencies>
       </plugin>
   </plugins>
</build>
      

3.generatorConfig.xml 位置见pom里面的configurationFile  内容见最下面
4.点击maven——mybatis——plugins——mybatis-generator

2.星云

1.配置文件在resource下的 generator.xml
2.如何生成见下面截图

在这里插入图片描述

二、SpringBoot项目集成mybatis

1.pom依赖

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
<!--mysql驱动包-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>

2.配置文件

spring:
  # mysql数据库
  datasource:
      url: jdbc:mysql://192.168.0.161:3306/newpn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
      data-password: root
      data-username: password
      driver-class-name: com.mysql.jdbc.Driver

mybatis:
    mapper-locations: classpath*:mapper/*.xml

3.map文件写在resource里面,resource里面可以有子文件夹

<mapper namespace="com.module.web.mapper.RoleMenuMapper">

   <select id="selectRoleMenuList" resultType="string">
      select * from sys_menu
   </select>
</mapper>

4.接口文件 发现要这两个注解

@Mapper
@Repository
public interface RoleMenuMapper {

    public String selectRoleMenuList();
}

5.使用的时候用注解 @Resource 或 @autowired 都可以

@Autowired
private OrgOperationUserMapper orgOperationUserMapper;

@Resource
private OrgDeptMapper orgDeptMapper;

6.如果提示找不到mapper的方法或者ivalidstatement的

在主启动类加注解@MapperScan("com.jw.mva.repository")

三、SpringBoot项目集成tkmybatis

1.pom依赖

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper</artifactId>
        <version>3.4.2</version>
    </dependency>
    <!--mapper-->
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
     </dependency>
</dependencies>

2.创建实体对象

@Data
@Table(name = "user_car")
public class UserCar {
    @Id
    @Column(name = "uc_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "uc_user_id")
    private String userId;

3.创建DAO继承tk.mybatis.mapper.common.Mapper即可


public interface UserCarRepository extends BaseMapper<OrgDeptDO>, Mapper<T>,InsertListMapper<OrgDeptDO> {
}

                   
public interface MyMapper<T> extends Mapper<T>, InsertListMapper<T> {
             //mapper是       tk.mybatis:mapper-base:1.1.5
         //InsertListMapper是 tk.mybatis:mapper-extra:1.1.5
}

4.如果提示找不到mapper的方法

在主启动类加注解@MapperScan("com.jw.mva.repository")

四、集成Mybatis-plus

1.pom依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.0</version>
</dependency>

2.创建实体类包com.test.web.entity和mapper接口文件包com.test.web.mapper

3.主启动类加注解 @MapperScan

@SpringBootApplication
@MapperScan("com.test.web.mapper")
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication .class, args);
    }
}

4.yml配置文件配置数据库和日志输出类

#mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

#mybatis-plus
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
  mapper-locations: mapper1/**.xml,mapper2/**.xml

5.创建实体类和mapper接口 以及扩展IService

@TableName("tbl_employee")
@Data
public class Employee {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @TableField(value = "last_name")
    private String lastName;
    @TableField(value = "email")
    private String email;
    @TableField(value = "gender")
    private Integer gender;
    @TableField(value = "age")
    private Integer age;
}

@Repository
public interface EmployeeMapper extends BaseMapper<Employee> {

}


public interface OpLocationImageRepository extends IService<OpLocationImageEntity> {

}
@Service
public class OpLocationImageRepositoryImpl extends ServiceImpl<OpLocationImageMapper, OpLocationImageEntity> implements OpLocationImageRepository {

}



6.使用

查询:
	a.直接调用方法查询:
			Employee employee = employeeMapper.selectById(1);

	b.QueryWrapper构造器查询
			QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
			  queryWrapper.select("name", "age")   //指定列
			queryWrapper.eq("operation_type", opLocationQueryDTO.getOperationType());
		    queryWrapper
		            .like("last_name","B")
		            .eq("gender",1)
		            .in("location_evse_id", evseIds);
		            .gt("age",24);
		    List<Employee> employees = employeeMapper.selectList(queryWrapper);
			
	
	
	c.lambdaQueryWrapper查询 和 LambdaUpdateWrapper更新
	  LambdaQueryWrapper<AppConfig> lambdaQueryWrapper = Wrappers.lambdaQuery(AppConfig.class)
	 	 .select(ChargePileLocalGroup::getMainSn,ChargePileLocalGroup::getId)  //指定列
                .in(AppConfig::getCode, codes)
                .eq(AppConfig::getLanguage, language)
                .orderByAsc(AppConfig::getCode);

	LambdaUpdateWrapper<ChargePile> chargePileLambdaUpdateWrapper = Wrappers.lambdaUpdate(ChargePile.class)
                .set(ChargePile::getApnInfo, updateAPNDto.getApnInfo())
                .eq(ChargePile::getSn, updateAPNDto.getSn());
        this.update(chargePileLambdaUpdateWrapper);
	
	
	d,分页查询
		Page<OpLocationEvaluationEntity> searchPage = new Page<>(pageIndex, pageSize);
        Page<OpLocationEvaluationEntity> opLocationEvaluationEntityPage = opLocationEvaluationMapper.selectPage(searchPage, opLocationEvaluationEntityQueryWrapper);
   
    e.and和or结合查询
		 LambdaQueryWrapper<BillEntity> queryWrapper = Wrappers.lambdaQuery(BillEntity.class);
            queryWrapper.eq(BillEntity::getEvseId, evseId);
            queryWrapper.eq(BillEntity::getOrderStatus, status);
            queryWrapper.and(
                    childQueryWrapper -> childQueryWrapper
                            .eq(BillEntity::getUserId, userId)
                            .or()
                            .eq(BillEntity::getOperatorId, userId)
                );
            queryWrapper.orderByDesc(BillEntity::getId);
            queryWrapper.last(LIMIT_1);
			
			
			LambdaQueryWrapper<UserSharePile> userSharePileLambdaQueryWrapper = Wrappers.lambdaQuery(UserSharePile.class)
                .eq(UserSharePile::getSn, sn)
                .eq(UserSharePile::getPileOwnerUserId, currentUserId)
                .and(childQueryWrapper -> childQueryWrapper
                        .eq(UserSharePile::getStatus, UserSharePileStatusEnum.JOINED.getCode())
                        .or()
                        .eq(UserSharePile::getStatus, UserSharePileStatusEnum.INVITED.getCode()));
        List<UserSharePile> userSharePiles = userSharePileMapper.selectList(userSharePileLambdaQueryWrapper);
            queryWrapper.select(BillEntity::getEvseSn,BillEntity::getOrderStatus,BillEntity::getDelayTime,BillEntity::getDelayTimeLeft,
                    BillEntity::getId,BillEntity::getUserId,BillEntity::getCdrId,BillEntity::getOrderSeq);// 非常重要 后面需要查询什么
            BillEntity billEntity = billMapper.selectOne(queryWrapper);
排序:
	b.opLocationPileEvseEntityQueryWrapper.orderByDesc("created_at");
	c.lambda
		lambdaQueryWrapper.orderByDesc(InvoiceEntity::getCreateTime);

7.插件(乐观锁插件和分页插件)

@EnableTransactionManagement //事务处理
@Configuration
@MapperScan("com.autel.cloud.app.pile.base.infrastructure.mapper")
public class MyBatisPlusConfig {

    /**
     * 乐观锁插件
     * @return
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }


    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

五、源码分析

官网介绍
mybatis源码下载地址

在这里插入图片描述

1。连接数据源

总结:去解析XML文件内容给到java对象Configuration setEviroment
在这里插入图片描述
在这里插入图片描述

2。执行语句
 
 
3。操作


下面是mybatis代码生成器的配置文件:generatorConfig.xml

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>

    <!--classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 可选 -->
    <classPathEntry location="E:\mysql-connector-java-8.0.21.jar"/>

    <!-- 一个数据库一个context,defaultModelType="flat" 大数据字段,不分表 -->
    <context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">

        <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
        <property name="autoDelimitKeywords" value="true"/>

        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="utf-8"/>

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>

        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="false"/> <!-- 是否生成注释代时间戳-->
        </commentGenerator>

        <!-- jdbc连接-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://192.168.1.15:3306/boss_project_ccw_module_yypt_back_210?serverTimezone=UTC" userId="newenergy"
                        password="cvFFxF@N"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成实体类地址 -->
        <javaModelGenerator targetPackage="com.nebula.microservice.web.entity" targetProject="src/main/java">
            <!-- 是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值去掉前后空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成map.xml文件存放地址 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 生成接口dao -->
        <javaClientGenerator targetPackage="com.nebula.microservice.web.dao" targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 enableSelectByPrimaryKey相应的配置表示是否生成相应的接口 -->
        <table tableName="auth_user" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"
               enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"
               enableDeleteByPrimaryKey="true">
            <property name="useActualColumnNames" value="true"/>
        </table>

    </context>
</generatorConfiguration>

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐