SpringBoot整合Mybatis3 Dynamic Sql(IDEA)

SpringBoot整合Mybatis3 Dynamic Sql(IDEA)

Mybatis Dynamic Sql与以前TargetRuntime相比较:

  1. 移除了XXXExamle类和xml文件,代价是不兼容其他的TargetRuntime
  2. java版本限制,生成器将需要运行Java 8,低版本可能会出现错误
  3. 代码逻辑相对以前,使用了 lambda表达式,是的较容易理解
  4. 移除了iBatis2代码生成的支持

引入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!--web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.dynamic-sql</groupId>
        <artifactId>mybatis-dynamic-sql</artifactId>
        <version>1.1.4</version>
    </dependency>
    <!-- MyBatis 生成器 -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.4.0</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!--druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

创建generatorConfig.xml配置文件

在resources/mybatis下创建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>
    <!--Mybatis Generator目前有5种运行模式,分别为:MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3、MyBatis3Simple、MyBatis3DynamicSqlV1。-->
    <context id="springboot-base" targetRuntime="MyBatis3DynamicSql">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection
                        connectionURL="jdbc:mysql://127.0.0.1:3306/student?tinyInt1isBit=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                        driverClass="com.mysql.jdbc.Driver"
                        userId="root"
                        password="91597489"/>

        <javaTypeResolver>
            <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer, 为 true时把JDBC DECIMAL
            和 NUMERIC 类型解析为java.math.BigDecimal -->
            <property name="forceBigDecimals" value="false" />
            <!--是否试用jdk8时间类-->
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator
                            targetPackage="com.my.entity"
                            targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="mybatis.mapping"
                         targetProject="src/main/resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator
                             targetPackage="com.my.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--生成全部表tableName设为%-->
        <table tableName="%"/>

        <!-- 指定数据库表 
  schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
  domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
  -->
        <!--<table schema="" tableName="" domainObjectName=""/>-->
    </context>
</generatorConfiguration>

在java下新建util包和MybatisGenerator.java文件

package com.my.util;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MybatisGenerator {
    public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<>();
        //读取我们的 MBG 配置文件
        InputStream is = MybatisGenerator.class.getResourceAsStream("/mybatis/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        //当生成的代码重复时,不要覆盖原代码
        DefaultShellCallback callback = new DefaultShellCallback(false);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

直接运行此程序,就会生成对应的entity,mapper文件,例如:

package com.my.entity;

import java.time.LocalDate;
import javax.annotation.Generated;

public class Student {
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private Integer id;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private Integer studentId;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private String name;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private Integer age;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private String sex;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private LocalDate birthday;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public Integer getId() {
        return id;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setId(Integer id) {
        this.id = id;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public Integer getStudentId() {
        return studentId;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setStudentId(Integer studentId) {
        this.studentId = studentId;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public String getName() {
        return name;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public Integer getAge() {
        return age;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setAge(Integer age) {
        this.age = age;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public String getSex() {
        return sex;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setSex(String sex) {
        this.sex = sex == null ? null : sex.trim();
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public LocalDate getBirthday() {
        return birthday;
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setBirthday(LocalDate birthday) {
        this.birthday = birthday;
    }
}
package com.my.mapper;

import static com.my.mapper.StudentDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.*;

import com.my.entity.Student;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import javax.annotation.Generated;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.BasicColumn;
import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider;
import org.mybatis.dynamic.sql.select.CountDSLCompleter;
import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.UpdateDSLCompleter;
import org.mybatis.dynamic.sql.update.UpdateModel;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;

@Mapper
public interface StudentMapper {
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    BasicColumn[] selectList = BasicColumn.columnList(id, studentId, name, age, sex, birthday);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    long count(SelectStatementProvider selectStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @DeleteProvider(type=SqlProviderAdapter.class, method="delete")
    int delete(DeleteStatementProvider deleteStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @InsertProvider(type=SqlProviderAdapter.class, method="insert")
    int insert(InsertStatementProvider<Student> insertStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple")
    int insertMultiple(MultiRowInsertStatementProvider<Student> multipleInsertStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    @ResultMap("StudentResult")
    Optional<Student> selectOne(SelectStatementProvider selectStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    @Results(id="StudentResult", value = {
        @Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
        @Result(column="student_id", property="studentId", jdbcType=JdbcType.INTEGER),
        @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
        @Result(column="age", property="age", jdbcType=JdbcType.INTEGER),
        @Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
        @Result(column="birthday", property="birthday", jdbcType=JdbcType.DATE)
    })
    List<Student> selectMany(SelectStatementProvider selectStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @UpdateProvider(type=SqlProviderAdapter.class, method="update")
    int update(UpdateStatementProvider updateStatement);

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default long count(CountDSLCompleter completer) {
        return MyBatis3Utils.countFrom(this::count, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int delete(DeleteDSLCompleter completer) {
        return MyBatis3Utils.deleteFrom(this::delete, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int deleteByPrimaryKey(Integer id_) {
        return delete(c -> 
            c.where(id, isEqualTo(id_))
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insert(Student record) {
        return MyBatis3Utils.insert(this::insert, record, student, c ->
            c.map(id).toProperty("id")
            .map(studentId).toProperty("studentId")
            .map(name).toProperty("name")
            .map(age).toProperty("age")
            .map(sex).toProperty("sex")
            .map(birthday).toProperty("birthday")
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insertMultiple(Collection<Student> records) {
        return MyBatis3Utils.insertMultiple(this::insertMultiple, records, student, c ->
            c.map(id).toProperty("id")
            .map(studentId).toProperty("studentId")
            .map(name).toProperty("name")
            .map(age).toProperty("age")
            .map(sex).toProperty("sex")
            .map(birthday).toProperty("birthday")
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insertSelective(Student record) {
        return MyBatis3Utils.insert(this::insert, record, student, c ->
            c.map(id).toPropertyWhenPresent("id", record::getId)
            .map(studentId).toPropertyWhenPresent("studentId", record::getStudentId)
            .map(name).toPropertyWhenPresent("name", record::getName)
            .map(age).toPropertyWhenPresent("age", record::getAge)
            .map(sex).toPropertyWhenPresent("sex", record::getSex)
            .map(birthday).toPropertyWhenPresent("birthday", record::getBirthday)
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default Optional<Student> selectOne(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectOne(this::selectOne, selectList, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default List<Student> select(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectList(this::selectMany, selectList, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default List<Student> selectDistinct(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectDistinct(this::selectMany, selectList, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default Optional<Student> selectByPrimaryKey(Integer id_) {
        return selectOne(c ->
            c.where(id, isEqualTo(id_))
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int update(UpdateDSLCompleter completer) {
        return MyBatis3Utils.update(this::update, student, completer);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    static UpdateDSL<UpdateModel> updateAllColumns(Student record, UpdateDSL<UpdateModel> dsl) {
        return dsl.set(id).equalTo(record::getId)
                .set(studentId).equalTo(record::getStudentId)
                .set(name).equalTo(record::getName)
                .set(age).equalTo(record::getAge)
                .set(sex).equalTo(record::getSex)
                .set(birthday).equalTo(record::getBirthday);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    static UpdateDSL<UpdateModel> updateSelectiveColumns(Student record, UpdateDSL<UpdateModel> dsl) {
        return dsl.set(id).equalToWhenPresent(record::getId)
                .set(studentId).equalToWhenPresent(record::getStudentId)
                .set(name).equalToWhenPresent(record::getName)
                .set(age).equalToWhenPresent(record::getAge)
                .set(sex).equalToWhenPresent(record::getSex)
                .set(birthday).equalToWhenPresent(record::getBirthday);
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int updateByPrimaryKey(Student record) {
        return update(c ->
            c.set(studentId).equalTo(record::getStudentId)
            .set(name).equalTo(record::getName)
            .set(age).equalTo(record::getAge)
            .set(sex).equalTo(record::getSex)
            .set(birthday).equalTo(record::getBirthday)
            .where(id, isEqualTo(record::getId))
        );
    }

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int updateByPrimaryKeySelective(Student record) {
        return update(c ->
            c.set(studentId).equalToWhenPresent(record::getStudentId)
            .set(name).equalToWhenPresent(record::getName)
            .set(age).equalToWhenPresent(record::getAge)
            .set(sex).equalToWhenPresent(record::getSex)
            .set(birthday).equalToWhenPresent(record::getBirthday)
            .where(id, isEqualTo(record::getId))
        );
    }
}
package com.my.mapper;

import java.sql.JDBCType;
import java.time.LocalDate;
import javax.annotation.Generated;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;

public final class StudentDynamicSqlSupport {
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final Student student = new Student();

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<Integer> id = student.id;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<Integer> studentId = student.studentId;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<String> name = student.name;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<Integer> age = student.age;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<String> sex = student.sex;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<LocalDate> birthday = student.birthday;

    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final class Student extends SqlTable {
        public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);

        public final SqlColumn<Integer> studentId = column("student_id", JDBCType.INTEGER);

        public final SqlColumn<String> name = column("name", JDBCType.VARCHAR);

        public final SqlColumn<Integer> age = column("age", JDBCType.INTEGER);

        public final SqlColumn<String> sex = column("sex", JDBCType.VARCHAR);

        public final SqlColumn<LocalDate> birthday = column("birthday", JDBCType.DATE);

        public Student() {
            super("student");
        }
    }
}

实践

需要在impl文件前面引入包,静态引入

import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static com.my.mapper.StudentDynamicSqlSupport.*;
查询
查询指定列
public List<Student> list1() {
    SelectStatementProvider select = SqlBuilder.select(name, age, sex)
        .from(student)
        .build()
        .render(RenderingStrategies.MYBATIS3);
    return studentMapper.selectMany(select);
}
查询所有列
public List<Student> list2() {
    SelectStatementProvider select = SqlBuilder.select(StudentMapper.selectList)
        .from(student)
        .build()
        .render(RenderingStrategies.MYBATIS3);
    return studentMapper.selectMany(select);
}
条件查询
public List<Student> list3(Student stu) {
    SelectStatementProvider select = SqlBuilder.select(StudentMapper.selectList)
        .from(student)
        .where(name, isLike("%" + stu.getName() + "%"))
        .and(sex, isIn("男", "女"))
        //.and(sex, isEqualTo("男"))
        //.or(sex, isEqualTo("女"))
        .orderBy(age)
        .build()
        .render(RenderingStrategies.MYBATIS3);
    return studentMapper.selectMany(select);
}

排序:

  • 升序:默认MySQL可以不加ASC即为升序排序,DynamicSql也是如此,指定列即可;
  • 降序:调用descending()即可,以上方例子为例,原orderBy(age)改为orderBy(age.descending())即可。
where条件查询对照表
ConditionExampleResult
Betweenwhere(foo, isBetween(x).and(y))where foo between ? and ?
Equalswhere(foo, isEqualTo(x))where foo = ?
Greater Thanwhere(foo, isGreaterThan(x))where foo > ?
Greater Than or Equalswhere(foo, isGreaterThanOrEqualTo(x))where foo >= ?
Inwhere(foo, isIn(x, y))where foo in (?,?)
In (case insensitive)where(foo, isInCaseInsensitive(x, y))where upper(foo) in (?,?)(框架会将x和y的值转换为大写)
Less Thanwhere(foo, isLessThan(x))where foo < ?
Less Than or Equalswhere(foo, isLessThanOrEqualTo(x))where foo <= ?
Likewhere(foo, isLike(x))where foo like ?(框架不会将SQL通配符添加到值中-您需要自己进行操作)
Like (case insensitive)where(foo, isLikeCaseInsensitive(x))where upper(foo) like ?(框架不会在值中添加SQL通配符-您需要自己执行,框架会将x的值转换为大写)
Not Betweenwhere(foo, isNotBetween(x).and(y))where foo not between ? and ?
Not Equalswhere(foo, isNotEqualTo(x))where foo <> ?
Not Inwhere(foo, isNotIn(x, y))where foo not in (?,?)
Not In (case insensitive)where(foo, isNotInCaseInsensitive(x, y))where upper(foo) not in (?,?)(框架会将x和y的值转换为大写)
Not Likewhere(foo, isLike(x))where foo not like ?(框架不会将SQL通配符添加到值中-您需要自己进行操作)
Not Like (case insensitive)where(foo, isNotLikeCaseInsensitive(x))where upper(foo) not like ?(框架不会在值中添加SQL通配符-您需要自己执行,框架会将x的值转换为大写)
Not Nullwhere(foo, isNotNull())where foo is not null
Nullwhere(foo, isNull())where foo is null
子查询
public List<Student> list4(int agevo) {
    SelectStatementProvider select = SqlBuilder.select(StudentMapper.selectList)
        .from(student)
        .where(id, isIn(select(id)
                        .from(student)
                        .where(age, isGreaterThanOrEqualTo(agevo))))
        .build()
        .render(RenderingStrategies.MYBATIS3);
    return studentMapper.selectMany(select);
}
子查询对照表
ConditionExampleResult
Equalswhere(foo, isEqualTo(select(bar).from(table2).where(bar, isEqualTo(x)))where foo = (select bar from table2 where bar = ?)
Greater Thanwhere(foo, isGreaterThan(select(bar).from(table2).where(bar, isEqualTo(x)))where foo > (select bar from table2 where bar = ?)
Greater Than or Equalswhere(foo, isGreaterThanOrEqualTo(select(bar).from(table2).where(bar, isEqualTo(x)))where foo >= (select bar from table2 where bar = ?)
Inwhere(foo, isIn(select(bar).from(table2).where(bar, isLessThan(x)))where foo in (select bar from table2 where bar < ?)
Less Thanwhere(foo, isLessThan(select(bar).from(table2).where(bar, isEqualTo(x)))where foo < (select bar from table2 where bar = ?)
Less Than or Equalswhere(foo, isLessThanOrEqualTo(select(bar).from(table2).where(bar, isEqualTo(x)))where foo <= (select bar from table2 where bar = ?)
Not Equalswhere(foo, isNotEqualTo(select(bar).from(table2).where(bar, isEqualTo(x)))where foo <> (select bar from table2 where bar = ?)
Not Inwhere(foo, isNotIn(select(bar).from(table2).where(bar, isLessThan(x)))where foo not in (select bar from table2 where bar < ?)
根据业务添加条件
public List<Student> list5(String name) {
    QueryExpressionDSL<org.mybatis.dynamic.sql.select.SelectModel>.QueryExpressionWhereBuilder builder = select(StudentMapper.selectList)
        .from(student)
        .where();
    if (name != null && !"".equals(name)) {
        builder.where(StudentDynamicSqlSupport.name, isLike("%" + name + "%"));
    } else {
        builder.where(age, isLessThan(25));
    }
    SelectStatementProvider select = builder.build().render(RenderingStrategies.MYBATIS3);
    return studentMapper.selectMany(select);
}
连接查询

有前面的基础,连接查询其实异曲同工,我这里直接贴上官方示例代码:

SelectStatementProvider selectStatement = select(orderMaster.orderId, orderDate, orderDetail.lineNumber, orderDetail.description, orderDetail.quantity)
    .from(orderMaster, "om")
    .join(orderDetail, "od").on(orderMaster.orderId, equalTo(orderDetail.orderId))
    .build()
    .render(RenderingStrategies.MYBATIS3);

目前支持四种连接类型:

  1. .join(...) 内连接
  2. .leftJoin(...) 左外连接
  3. .rightJoin(...) 右外连接
  4. .fullJoin(...) 全连接
添加
单个添加
stu = new Student();
stu.setStudentId(45);
stu.setName("杨间");
stu.setAge(20);
stu.setSex("男");
return studentMapper.insert(stu);
批量添加

要使用注释掉的这段代码需要引用一下包

import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider;
import org.mybatis.dynamic.sql.insert.*;
List<Student> stus = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    Student stu = new Student();
    stu.setStudentId(45);
    stu.setName("杨间");
    stu.setAge(20);
    stu.setSex("男");
    stus.add(stu);
}
return studentMapper.insertMultiple(stus);
/*MultiRowInsertStatementProvider<Student> render = insertMultiple(stus)
    .into(student)
    .map(id).toProperty("id")
    .map(studentId).toProperty("studentId")
    .map(name).toProperty("name")
    .map(age).toProperty("age")
    .map(sex).toProperty("sex")
    .map(birthday).toProperty("birthday")
    .build()
    .render(RenderingStrategies.MYBATIS3);
return studentMapper.insertMultiple(render);*/

批量新增这里需要注意的是map的添加,也可以不加,但我在使用过程中出现过不加map导致批量新增出现某些必填字段明明赋值了数据库却报没有不能为空,猜测应该是转换成sql语句时into与value没有一一对应,加上map就没问题了。

删除
主键删除
return studentMapper.deleteByPrimaryKey(stu.getId());
条件删除
DeleteStatementProvider del = deleteFrom(student)
    .where(name, isEqualTo("杨间"))
    .build()
    .render(RenderingStrategies.MYBATIS3);
return studentMapper.delete(del);
跟新
主键更新

对所有属性进行更新

stu.setId(6);
stu.setStudentId(99);
stu.setName("陆辛");
stu.setAge(20);
stu.setSex("男");
return studentMapper.updateByPrimaryKey(stu);

对不为null的属性进行更新

stu.setId(7);
stu.setName("顾楠");
stu.setSex("女");
return studentMapper.updateByPrimaryKeySelective(stu);
复杂的更新
UpdateStatementProvider updat = SqlBuilder.update(student)
    .set(name).equalTo("白小纯")
    .set(sex).equalTo("男")
    .where(id, isEqualTo(5))
    .build()
    .render(RenderingStrategies.MYBATIS3);
return studentMapper.update(updat);

注意set方法,常用的方法有以下:

  1. set(column).equalToNull() 将对应列更新为null;
  2. set(column).equalTo(T value)将对应列更新为value;
  3. set(column).equalToWhenPresent(T value)如果value不能null的话更新列;
  4. set(column).equalTo(BasicColumn rightColumn)将一列的值设置为另一列的值,还可以对其加,减等操作。
### RAG 模型索引优化的方法及其性能提升 #### 1. 嵌入优化策略 嵌入优化是提高 RAG 模型性能的关键之一。RA-DIT 方法是一种有效的嵌入优化策略,主要涉及两个方面的更新: - **更新 LLM**:通过调整参数以最大化在给定检索增强指令下生成正确答案的概率[^2]。这使得模型不仅依赖于检索到的信息块,还能结合自身的知识库进行推理预测。 - **更新检索器**:减少文档与查询之间的语义差距,从而提高检索的相关性准确性。 这种方法的优势在于增强了模型对背景知识的利用能力,并使其能够在面对不完全或错误信息时依然保持较高的预测精度。 #### 2. 查询转换(Query Transformations) 为了进一步改善检索效果,可以采用查询转换技术。该方法的核心思想是利用大型语言模型的强大能力,将用户的原始查询转化为更适合检索的形式。具体实现方式包括但不限于: - 使用特定提示词引导模型理解用户意图; - 对模糊或复杂的查询进行拆解重组; 这种转化过程显著提高了从文档集合中提取相关信息的能力,进而提升了整体系统的性能。 #### 3. 提高检索召回率 针对 RAG 模型可能出现的检索召回率较低问题,有如下几种解决方案: - 调整向量数据库中的相似度计算算法,比如引入更先进的距离度量标准或者增加负样本学习机制; - 扩展候选集规模,在初步筛选阶段保留更多潜在匹配项再经过后续精排处理得到最终结果。 以上措施均有助于缓解因数据分布特性等原因造成的漏检现象,确保重要上下文不会被忽略掉。 ```python def optimize_rag_model(model, queries): """ A function to demonstrate the optimization process of a RAG model. Args: model (object): The pre-trained RAG model instance. queries (list): List of user input queries. Returns: optimized_results (dict): Optimized results after applying strategies like query transformation and embedding updates. """ transformed_queries = [] for q in queries: # Apply Query Transformation using an advanced prompt engineering technique new_q = apply_query_transformation(q) transformed_queries.append(new_q) updated_embeddings = update_retriever_and_llm_embeddings(transformed_queries) # Perform retrieval with enhanced embeddings retrieved_docs = retrieve_documents(updated_embeddings) final_outputs = generate_answers(retrieved_docs) return {"optimized_results": final_outputs} def apply_query_transformation(query): """Simulates transforming original query into more effective form.""" pass def update_retriever_and_llm_embeddings(queries): """Updates both retriever's and LLM's internal representations based on improved inputs.""" pass def retrieve_documents(embeddings): """Retrieves relevant documents given refined embeddings.""" pass def generate_answers(documents): """Generates coherent responses leveraging better context understanding.""" pass ``` 上述代码片段展示了如何通过应用查询转换、更新嵌入等方式来优化整个 RAG 流程的具体逻辑框架示意。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值