首页 文章 精选 留言 我的

精选列表

搜索[beta],共3847篇文章
优秀的个人博客,低调大师

基于 Java 的 LLM 应用开发及编排框架,Agents-Flex beta.12 发布

Agents-Flex: 一个基于 Java 的 LLM(大语言模型)应用开发框架。 基本能力 LLM 的访问能力 Prompt、Prompt Template 定义加载的能力 Function Calling 定义、调用和执行等能力 记忆的能力(Memory) Embedding Vector Store 文档处理 加载器(Loader) Http FileSystem 分割器(Splitter) 解析器(Parser) PoiParser PdfBoxParser Agent LLM Agent IOAgent Chain 执行链 SequentialChain 顺序执行链 ParallelChain 并发(并行)执行链 LoopChain 循环执行连 ChainNode AgentNode Agent 执行节点 EndNode 终点节点 RouterNode 路由节点 GroovyRouterNode Groovy 规则路由 QLExpressRouterNode QLExpress 规则路由 LLMRouterNode LLM 路由(由 AI 自行判断路由规则) 简单对话 使用 OpenAi 大语言模型: @Test public void testChat() { OpenAiLlmConfig config = new OpenAiLlmConfig(); config.setApiKey("sk-rts5NF6n*******"); Llm llm = new OpenAiLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 使用 “通义千问” 大语言模型: @Test public void testChat() { QwenLlmConfig config = new QwenLlmConfig(); config.setApiKey("sk-28a6be3236****"); config.setModel("qwen-turbo"); Llm llm = new QwenLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 使用 “讯飞星火” 大语言模型: @Test public void testChat() { SparkLlmConfig config = new SparkLlmConfig(); config.setAppId("****"); config.setApiKey("****"); config.setApiSecret("****"); Llm llm = new SparkLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 历史对话示例 public static void main(String[] args) { SparkLlmConfig config = new SparkLlmConfig(); config.setAppId("****"); config.setApiKey("****"); config.setApiSecret("****"); Llm llm = new SparkLlm(config); HistoriesPrompt prompt = new HistoriesPrompt(); System.out.println("您想问什么?"); Scanner scanner = new Scanner(System.in); String userInput = scanner.nextLine(); while (userInput != null) { prompt.addMessage(new HumanMessage(userInput)); llm.chatStream(prompt, (context, response) -> { System.out.println(">>>> " + response.getMessage().getContent()); }); userInput = scanner.nextLine(); } } Function Calling 第一步:通过注解定义本地方法 public class WeatherUtil { @FunctionDef(name = "get_the_weather_info", description = "get the weather info") public static String getWeatherInfo( @FunctionParam(name = "city", description = "the city name") String name ) { //在这里,我们应该通过第三方接口调用 api 信息 return name + "的天气是阴转多云。 "; } } 第二步:通过 Prompt、Functions 传入给大模型,然后得到结果 public static void main(String[] args) { OpenAiLlmConfig config = new OpenAiLlmConfig(); config.setApiKey("sk-rts5NF6n*******"); OpenAiLlm llm = new OpenAiLlm(config); FunctionPrompt prompt = new FunctionPrompt("今天北京的天气怎么样", WeatherUtil.class); FunctionResultResponse response = llm.chat(prompt); Object result = response.getFunctionResult(); System.out.println(result); //"北京的天气是阴转多云。 " } 生态支持 大语言模型 大语言模型名称 支持情况 描述 ChatGPT ✅ 已支持 - Ollama 部署模型 ✅ 已支持 - 星火大模型 ✅ 已支持 - 通义千问 ✅ 已支持 - 智普 ChatGLM ✅ 已支持 - 月之暗面 Moonshot ✅ 已支持 - 扣子 Coze ✅ 已支持 - GiteeAI - Qwen2-7B-Instruct ✅ 已支持 - GiteeAI - Qwen2-72B-Instruct ✅ 已支持 - GiteeAI - Yi-1.5-34B-Chat ✅ 已支持 - GiteeAI - glm-4-9b-chat ✅ 已支持 - 文心一言 计划中... 期待 PR 图片生成模型 大语言模型名称 支持情况 描述 Openai ✅ 已支持 - Stability ✅ 已支持 - GiteeAI - stable-diffusion-3-medium ✅ 已支持 - GiteeAI - FLUX.1-schnell ✅ 已支持 - GiteeAI - stable-diffusion-xl-base-1.0 ✅ 已支持 - GiteeAI - Kolors ✅ 已支持 - 更多 计划中... 期待 PR 向量化模型 大语言模型名称 支持情况 描述 Openai ✅ 已支持 - 星火大模型 ✅ 已支持 - 智普 ChatGLM ✅ 已支持 - Ollama ✅ 已支持 - 通义千问 ✅ 已支持 - GiteeAI - bge-small-zh-v1.5 ✅ 已支持 - GiteeAI - bge-large-zh-v1.5 ✅ 已支持 - GiteeAI - bge-m3 ✅ 已支持 - 更多 计划中... 期待 PR 向量存储(向量数据库) 向量数据库名称 支持情况 描述 Milvus ✅ 已支持 - 阿里云向量数据存储服务 ✅ 已支持 - 腾讯云向量数据存储服务 ✅ 已支持 - OpenSearch ✅ 已支持 - ElasticSearch ✅ 已支持 - Redis ✅ 已支持 - Chroma 计划中... 期待 PR Cassandra 计划中... 期待 PR Gemfire 计划中... 期待 PR Weaviate 计划中... 期待 PR 文档解析器 向量数据库名称 支持情况 描述 PDFBox ✅ 已支持 用于解析 PDF 文档 POI ✅ 已支持 用于解析 Word 文档 OmniParse ✅ 已支持 更丰富的解析能力 更多 计划中... 期待 PR 模块构成 更新记录: - 新增:GenerateImageRequest 添加反向提示词相关属性 - 新增:Maps 工具类添加 putOrDefault 方法 - 新增:添加 siliconFlow 的图片模型的支持 - 新增: ChatOptions 添加 "seed" 属性 - 新增:Maps 可以 put 一个子 map 的功能 - 新增:新增 Ollama 的函数调用(Function Calling)的支持 - 新增:添加 StringUtil.isJsonObject 方法 - 优化:重构 BaseImageRequest 类,添加 options 属性 - 优化:重构 ImagePrompt 使之继承于 HumanMessage - 优化:重构 ImageResponse 类,添加 error 和 errorMessage 属性 - 优化:修改 Image.writeBytesToFile 方法为 writeToFile - 优化:重命名 "giteesd3" 为 "gitee" - 优化:重构 VectorData.toString 方法 - 优化:添加 DocumentStoreConfig,向量数据库的配置都实现 DocumentStoreConfig - 优化:重构优化 HistoriesPrompt,使其支持更多的属性配置 - 优化:更新 agents-flex-bom 的 pom.xml - 优化:升级 jedis 版本为 "5.2.0" - 优化:重构 RedisVectorStore 的错误信息,使之错误信息更加友好 - 修复:修复 jdk17 下出现 NoSuchMethodError 问题,感谢 @songyinyin #I9AELG

优秀的个人博客,低调大师

Java 的 AI 大模型开发及编排框架,Agents-Flex beta.10 发布

Agents-Flex: 一个基于 Java 的 LLM(大语言模型)应用开发框架。 基本能力 LLM 的访问能力 Prompt、Prompt Template 定义加载的能力 Function Calling 定义、调用和执行等能力 记忆的能力(Memory) Embedding Vector Store 文档处理 加载器(Loader) Http FileSystem 分割器(Splitter) 解析器(Parser) PoiParser PdfBoxParser Agent LLM Agent IOAgent Chain 执行链 SequentialChain 顺序执行链 ParallelChain 并发(并行)执行链 LoopChain 循环执行连 ChainNode AgentNode Agent 执行节点 EndNode 终点节点 RouterNode 路由节点 GroovyRouterNode Groovy 规则路由 QLExpressRouterNode QLExpress 规则路由 LLMRouterNode LLM路由(由 AI 自行判断路由规则) 简单对话 使用 OpenAi 大语言模型: @Test public void testChat() { OpenAiLlmConfig config = new OpenAiLlmConfig(); config.setApiKey("sk-rts5NF6n*******"); Llm llm = new OpenAiLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 使用 “通义千问” 大语言模型: @Test public void testChat() { QwenLlmConfig config = new QwenLlmConfig(); config.setApiKey("sk-28a6be3236****"); config.setModel("qwen-turbo"); Llm llm = new QwenLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 使用 “讯飞星火” 大语言模型: @Test public void testChat() { SparkLlmConfig config = new SparkLlmConfig(); config.setAppId("****"); config.setApiKey("****"); config.setApiSecret("****"); Llm llm = new SparkLlm(config); String response = llm.chat("请问你叫什么名字"); System.out.println(response); } 历史对话示例 public static void main(String[] args) { SparkLlmConfig config = new SparkLlmConfig(); config.setAppId("****"); config.setApiKey("****"); config.setApiSecret("****"); Llm llm = new SparkLlm(config); HistoriesPrompt prompt = new HistoriesPrompt(); System.out.println("您想问什么?"); Scanner scanner = new Scanner(System.in); String userInput = scanner.nextLine(); while (userInput != null) { prompt.addMessage(new HumanMessage(userInput)); llm.chatStream(prompt, (context, response) -> { System.out.println(">>>> " + response.getMessage().getContent()); }); userInput = scanner.nextLine(); } } Function Calling 第一步: 通过注解定义本地方法 public class WeatherUtil { @FunctionDef(name = "get_the_weather_info", description = "get the weather info") public static String getWeatherInfo( @FunctionParam(name = "city", description = "the city name") String name ) { //在这里,我们应该通过第三方接口调用 api 信息 return name + "的天气是阴转多云。 "; } } 第二步: 通过 Prompt、Functions 传入给大模型,然后得到结果 public static void main(String[] args) { OpenAiLlmConfig config = new OpenAiLlmConfig(); config.setApiKey("sk-rts5NF6n*******"); OpenAiLlm llm = new OpenAiLlm(config); FunctionPrompt prompt = new FunctionPrompt("今天北京的天气怎么样", WeatherUtil.class); FunctionResultResponse response = llm.chat(prompt); Object result = response.getFunctionResult(); System.out.println(result); //"北京的天气是阴转多云。 " } 生态支持 大语言模型 大语言模型名称 支持情况 描述 ChatGPT ✅ 已支持 - Ollama 部署模型 ✅ 已支持 - 星火大模型 ✅ 已支持 - 通义千问 ✅ 已支持 - 智普 ChatGLM ✅ 已支持 - 月之暗面 Moonshot ✅ 已支持 - 扣子 Coze ✅ 已支持 - GiteeAI - Qwen2-7B-Instruct ✅ 已支持 - GiteeAI - Qwen2-72B-Instruct ✅ 已支持 - GiteeAI - Yi-1.5-34B-Chat ✅ 已支持 - GiteeAI - glm-4-9b-chat ✅ 已支持 - 文心一言 计划中... 期待 PR 图片生成模型 大语言模型名称 支持情况 描述 Openai ✅ 已支持 - Stability ✅ 已支持 - GiteeAI - stable-diffusion-3-medium ✅ 已支持 - GiteeAI - FLUX.1-schnell ✅ 已支持 - GiteeAI - stable-diffusion-xl-base-1.0 ✅ 已支持 - GiteeAI - Kolors ✅ 已支持 - 更多 计划中... 期待 PR 向量化模型 大语言模型名称 支持情况 描述 Openai ✅ 已支持 - 星火大模型 ✅ 已支持 - 智普 ChatGLM ✅ 已支持 - Ollama ✅ 已支持 - 通义千问 ✅ 已支持 - GiteeAI - bge-small-zh-v1.5 ✅ 已支持 - GiteeAI - bge-large-zh-v1.5 ✅ 已支持 - GiteeAI - bge-m3 ✅ 已支持 - 更多 计划中... 期待 PR 向量存储(向量数据库) 向量数据库名称 支持情况 描述 Milvus ✅ 已支持 - 阿里云向量数据存储服务 ✅ 已支持 - 腾讯云向量数据存储服务 ✅ 已支持 - OpenSearch ✅ 已支持 - ElasticSearch ✅ 已支持 - Redis ✅ 已支持 - Chroma 计划中... 期待 PR Cassandra 计划中... 期待 PR Gemfire 计划中... 期待 PR Weaviate 计划中... 期待 PR 文档解析器 向量数据库名称 支持情况 描述 PDFBox ✅ 已支持 用于解析 PDF 文档 POI ✅ 已支持 用于解析 Word 文档 OmniParse ✅ 已支持 更丰富的解析能力 更多 计划中... 期待 PR 模块构成

优秀的个人博客,低调大师

mybatis-table-modify 1.5.1-beta3,自动生成和变更表结构组件更新

项目介绍 本项目 Fork 自A.C.Table,之前在其他项目中用到了 A.C.Table, 并对功能进行了改造。因为该 A.C.Table 项目近期发生了停更,所以打算把这些功能给开源出来,同时继续将这个项目完善下去。 项目地址:https://gitee.com/bootx/mybatis-table-modify,非常欢迎看看项目介绍留以及个Star呀🤺🤺🤺 更新说明 fix: 获取MySqlFieldType 错 fix: 打包时未把mapper 导入jar 中 功能说明 支持自动创建和更新数据库表结构 支持指定表的名称、字符集、引擎类型、注释等信息 支持指定表字段的类型、排序、非空、自增、默认值、长度等信息 支持配置索引,包括指定字段、类型、注释等 支持多种更新模式:创建和更新表、只创建不更新、删除后重新创建、不进行任何操作 路线图 1.5.1 主要目标:调整项目结构,去除除表维护相关的其他功能,代码暂时只适配 Spring Boot 项目 1.5.2 主要目标:拆分为 Maven 多模块项目,支持非 Spring Boot 的项目接入 1.5.x 目标: 支持 SQL Server 数据库的表维护 支持 Oracle 数据库的表维护 支持达梦数据库的表维护 提供接入其他类型数据库的插件机制 1.6.x 目标: 支持非 Spring 中间件的项目接入 支持多数据源中间件 使用说明 添加 pom 依赖 <dependency> <groupId>cn.bootxe</groupId> <artifactId>mybatis-table-modify</artifactId> <version>${latest.version}</version> </dependency> 最新版本 配置要建表的路径 无论是使用 MyBatis 还是 MyBatis Plus,需要保证项目中的mapper被扫描到,否则会报错无法启动,项目中mapper文件所在的路径为classpath*:cn/bootx/mybatis/table/modify/impl/*/mapper/*TableModifyMapper.xml mybatis-table: # 数据库类型 database-type: mysql # 更新类型 update-type: create # 扫描包路径, 可以用 ,和 ; 分隔 scan-package: cn.bootx.**.entity 核心注解 不同的数据库各自会有一些专属的注解,通常适用于对应类型数据库专有的配置,如 MySQL 专有的MySqlEngine(存储引擎)、MySqlFieldType(字段类型)等 @DbTable 表注释,标注在要进行建表的实体类上 属性 类型 默认值 描述 name String "" 表名,未配置时会读取TableName中的配置 value String "" 表名,未配置时会读取TableName中的配置 comment String "" 表注释 charset MySqlCharset "" 数据库默认字符集 isSimple boolean true 是否开启simple模式配置,开启后字段不写注解@Column也可以采用默认的驼峰转换法创建字段 excludeFields String[] {} 需要排除的属性名,排除掉的属性不参与建表,静态字段默认会被排除 @Column 字段注解,@DbTable开启simple模式后,@DbColumn不标注也会根据规则进行转换 属性 类型 默认值 描述 name String "" 行名,未配置时会读取Column中的配置 value String "" 行名,未配置时会读取Column中的配置 order int 0 数据库字段排序,数字小的在前面,大的在后面 type MySqlFieldType DEFAULT 不填默认使用属性的数据类型进行转换,转换失败的字段不会添加 length int 255 字段长度,默认是 255 decimalLength int 0 小数点长度,默认是 0 isNull boolean true 是否为可以为 null,true是可以,false是不可以,默认为true isKey boolean false 是否是主键,默认false isAutoIncrement boolean false 是否自动递增,默认false,只有主键才能使用 defaultValue String "DEFAULT" 默认值,默认为 null comment String "" 数据表字段备注 ignore boolean false 是否排除该字段,默认不排除 🥂 Bootx 项目合集 Bootx-Platform 单体版脚手架 Bootx-Cloud 微服务版脚手架 Dax-Pay 支付开发平台 Mybatis-Table-Modify 数据库表结构管理 Bpm-Plus 工作流开发平台 🍻 鸣谢 感谢 JetBrains 提供的免费开源 License: 🍷License Apache License Version 2.0

优秀的个人博客,低调大师

Mybatis-Flex 1.0-beta2 发布,一个优雅的 Mybatis 增强框架

Mybatis-Flex 一个优雅的 Mybatis 增强框架。 特征 1、很轻量,整个框架只依赖 Mybatis 再无其他第三方依赖 2、只增强,支持 Entity 的增删改查、及分页查询,但不丢失 Mybatis 原有功能 3、Db + Row,可以无需实体类对数据库进行增删改查 4、支持多种数据库类型,自由通过方言持续扩展 5、支持联合主键,以及不同的主键内容生成策略 6、极其友好的 SQL 联动查询,IDE 自动提示不再担心出错 7、更多小惊喜 开始 Maven 依赖 示例项目 hello world 第一步:编写 Entity 实体类 @Table("tb_account") public class Account { @Id() private Long id; private String userName; private Date birthday; private int sex; //getter setter } 第二步,编写 Mapper 类,并继承 BaseMapper public interface AccountMapper extends BaseMapper<Account> { //只需定义 Mapper 接口即可,可以无任何内容。 } 第三步:开始查询数据 示例 1:查询 1 条数据 class HelloWorld { public static void main(String... args) { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/mybatis-flex"); dataSource.setUsername("username"); dataSource.setPassword("password"); MybatisFlexBootstrap.getInstance() .setDatasource(dataSource) .addMapper(AccountMapper.class) .start(); //示例1:查询 id=100 条数据 Account account = MybatisFlexBootstrap.getInstance() .execute(AccountMapper.class, mapper -> mapper.selectOneById(100) ); } } 示例2:查询列 //示例2:通过 QueryWrapper 构建条件查询数据列表 QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.like("张").or(ACCOUNT.USER_NAME.like("李"))); // 执行 SQL: // ELECT * FROM `tb_account` // WHERE `tb_account`.`id` >= 100 // AND (`tb_account`.`user_name` LIKE '%张%' OR `tb_account`.`user_name` LIKE '%李%' ) List<Account> accounts = MybatisFlexBootstrap.getInstance() .execute(AccountMapper.class, mapper -> mapper.selectListByQuery(query) ); 示例3:分页查询 // 示例3:分页查询 // 查询第 5 页,每页 10 条数据,通过 QueryWrapper 构建条件查询 QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.like("张").or(ACCOUNT.USER_NAME.like("李"))) .orderBy(ACCOUNT.ID.desc()); // 执行 SQL: // ELECT * FROM `tb_account` // WHERE `id` >= 100 // AND (`user_name` LIKE '%张%' OR `user_name` LIKE '%李%' ) // ORDER BY `id` DESC // LIMIT 40,10 Page<Account> accounts = MybatisFlexBootstrap.getInstance() .execute(AccountMapper.class, mapper -> mapper.paginate(5, 10, query) ); QueryWrapper 示例 select * QueryWrapper query=new QueryWrapper(); query.select().from(ACCOUNT) // SQL: // SELECT * FROM tb_account select columns QueryWrapper query=new QueryWrapper(); query.select(ACCOUNT.ID,ACCOUNT.USER_NAME).from(ACCOUNT) // SQL: // SELECT id, user_name // FROM tb_account QueryWrapper query=new QueryWrapper(); query.select(ACCOUNT.ALL_COLUMNS).from(ACCOUNT) // SQL: // SELECT id, user_name, birthday, sex, is_normal // FROM tb_account select functions QueryWrapper query=new QueryWrapper() .select( ACCOUNT.ID, ACCOUNT.USER_NAME, max(ACCOUNT.BIRTHDAY), avg(ACCOUNT.SEX).as("sex_avg") ).from(ACCOUNT); // SQL: // SELECT id, user_name, // MAX(birthday), // AVG(sex) AS sex_avg // FROM tb_account where QueryWrapper queryWrapper=QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.like("michael")); // SQL: // SELECT * FROM tb_account // WHERE id >= ? // AND user_name LIKE ? exists, not exists QueryWrapper queryWrapper=QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and( exist( selectOne().from(ARTICLE).where(ARTICLE.ID.ge(100)) ) ); // SQL: // SELECT * FROM tb_account // WHERE id >= ? // AND EXIST ( // SELECT 1 FROM tb_article WHERE id >= ? // ) and (...) or (...) QueryWrapper queryWrapper=QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))) .or(ACCOUNT.AGE.in(18,19,20).or(ACCOUNT.USER_NAME.like("michael"))); // SQL: // SELECT * FROM tb_account // WHERE id >= ? // AND (sex = ? OR sex = ? ) // OR (age IN (?,?,?) OR user_name LIKE ? ) group by QueryWrapper queryWrapper=QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME); // SQL: // SELECT * FROM tb_account // GROUP BY user_name having QueryWrapper queryWrapper=QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME) .having(ACCOUNT.AGE.between(18,25)); // SQL: // SELECT * FROM tb_account // GROUP BY user_name // HAVING age BETWEEN ? AND ? join QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)) .innerJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)) .where(ACCOUNT.AGE.ge(10)); // SQL: // SELECT * FROM tb_account // LEFT JOIN tb_article ON tb_account.id = tb_article.account_id // INNER JOIN tb_article ON tb_account.id = tb_article.account_id // WHERE tb_account.age >= ? 存在疑问? 疑问 1:QueryWrapper 是否可以在分布式项目中通过 RPC 传输? 答:可以。 疑问 2:如何通过实体类 Account.java 生成 QueryWrapper 所需要的 "ACCOUNT" 类 ? 答:Mybatis-Flex 使用了 APT(Annotation Processing Tool)技术,在项目编译的时候,会自动根据 Entity 类定义的字段帮你生成 "ACCOUNT" 类, 通过开发工具构建项目(如下图),或者执行 maven 编译命令:mvn clean package都可以自动生成。这个原理和 lombok 一致。 Db + Row 工具类 Db + Row 工具类,提供了在 Entity 实体类之外的数据库操作能力。使用 Db + Row 时,无需对数据库表进行映射, Row 是一个 HashMap 的子类,相当于一个通用的 Entity。以下为 Db + Row 的一些示例: //使用原生 SQL 插入数据 String sql = "insert into tb_account(id,name) value (?, ?)"; Db.insertBySql(sql,1,"michael"); //使用 Row 插入数据 Row account = new Row(); account.set("id",100); account.set("name","Michael"); Db.insertRow("tb_account",account); //根据主键查询数据 Row row = Db.selectOneById("tb_account","id",1); //Row 可以直接转换为 Entity 实体类,且性能极高 Account account = row.toEntity(Account.class); //查询所有大于 18 岁的用户 String listsql = "select * from tb_account where age > ?" List<Row> rows = Db.selectListBySql(sql,18); //分页查询:每页 10 条数据,查询第 3 页的年龄大于 18 的用户 QueryWrapper query = QueryWrapper.create() .where(ACCOUNT.AGE.ge(18)); Page<Row> rowPage = Db.paginate("tb_account",3,10,query); Db 工具类还提供了更多 增、删、改、查和分页查询等方法。 具体参考:Db.java。 Entity 部分字段更新 相比市面上的其他框架,这部分的功能应该也算是 MyBatis-Flex 的亮点之一。在 BaseMapper 中,Mybatis-Flex 提供了如下的方法: update(T entity, boolean ignoreNulls) 第一个参数是 entity 的对象。 第二个参数是是否忽略 null 值。 有些场景下,我们可能希望只更新 几个 字段,而其中个别字段需要更新为 null。此时需要用到UpdateEntity工具类,以下是示例代码: Account account = UpdateEntity.of(Account.class); account.setId(1); account.setUserName(null); account.setSex(1); accountMapper.update(account,false); 以上的示例中,会把 id 为 1 这条数据中的 user_name 字段更新为 null,sex 字段更新为 1,其他字段不会被更新。也就是说,通过UpdateEntity创建的对象,只会更新调用了 setter 方法的字段,若不调用 setter 方法,不管这个对象里的属性的值是什么,都不会更新到数据库。 其生成的 sql 内容如下: update tb_account set user_name = ? ,sex = ? where id = ? #params: null,1,1 多主键 Mybatis-Flex 多主键就是在 Entity 类里有多个@Id注解标识而已,比如: @Table("tb_account") public class Account { @Id((keyType=KeyType.Auto) private Long id; @Id(keyType=KeyType.Generator, value="uuid") private String otherId; //getter setter } 当我们保存数据的时候,Account 的 id 主键为自增,而 otherId 主键则通过 uuid 生成。 自定义主键生成器 第 1 步:编写一个类,实现IKeyGenerator接口,例如: public class UUIDKeyGenerator implements IKeyGenerator { @Override public Object generate(Object entity, String keyColumn) { return UUID.randomUUID().toString().replace("-", ""); } } 第 2 步:注册 UUIDKeyGenerator KeyGeneratorFactory.register("myUUID",new UUIDKeyGenerator()); 第 3 步:在 Entity 里使用 "myUUID" 生成器: @Table("tb_account") public class Account { @Id(keyType=KeyType.Generator, value="myUUID") private String otherId; //getter setter } 使用数据库 Sequence 生成 @Table("tb_account") public class Account { @Id((keyType=KeyType.Sequence, value="select SEQ_USER_ID.nextval as id from dual") private Long id; } 更多示例 示例 1:Mybatis-Flex 原生(非 Spring) 示例 2:Mybatis-Flex with Spring 示例 3:Mybatis-Flex with Spring boot

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册