mybatis 相关问题

MyBatis是一个将对象映射到关系数据库的框架,强调高性能和简单性。 XML描述符或注释将对象耦合到SQL语句或存储过程。

如何同时选择所有行的总和值以及某些特定行中的值?

我有一个记录表及其评论表,例如: |评论ID |相关记录 ID |正在阅读 | |------------+----------------+--------| | 1 | 1 |正确 | | 2 | 1 ...

回答 3 投票 0

MyBatis 不会返回查询的所有结果

问题 我有一个返回 17 条记录的查询。 当我将 MyBatis 与带有 的地图一起使用时,它返回 6 条记录。请注意,我的其他地图不会发生这种情况,我有很多

回答 5 投票 0

如何使用mybatis返回Map<String, List<Object>>

数据类型,字符串是类别名称 这是gpt写的代码,但这不能返回我想要的,我希望这个函数返回一个Map类型的数据,字符串是类别名称 <resultMap id="articles" type="com.toc.content.pojo.Article"> <result column="title" property="title" /> <result column="content" property="content" /> <result column="state" property="state"/> </resultMap> <resultMap id="CategoryArticleMap" type="java.util.HashMap"> <id column="category_name" property="key"/> <collection property="value" ofType="com.toc.content.pojo.Article" resultMap="articles"/> </resultMap> <select id="getCategoryArticlesMap" resultMap="CategoryArticleMap"> select c.category_name, a.title, a.content, a.state from category c left join article a on c.id = a.category_id where c.category_name is not null order by c.category_name </select> 在我的文章Dao.java中 @MapKey("category_name") Map<String, List<Article>> getCategoryArticlesMap(); 我想从 json 获取这种类型 { "art":[ {"title":"xxx", "author":"yyy" }, {"title":"ppp", "author":"ssy" }, ], } MyBatis 无法直接将结果映射到如此复杂的java.util.Map,不幸的是。 如果结果必须是 Map,您可以告诉 MyBatis 返回 List 的 Map 并在 Java 代码中转换它。 import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.apache.ibatis.annotations.Select; public interface Mapper { @Select(""" select c.category_name, a.title, a.author from category c left join article a on c.id = a.category_id where c.category_name is not null order by c.category_name """) List<Map<String, Object>> selectMaps(); default Map<String, List<Article>> getCategoryArticlesMap() { return selectMaps().stream().collect(Collectors.groupingBy(m -> (String) m.get("category_name"), Collectors.mapping(m -> new Article((String) m.get("title"), (String) m.get("author")), Collectors.toList()))); } } 请注意,某些数据库以大写形式返回列名称。 仅供参考,如果你定义了 POJO,MyBatis 可以直接映射结果。 import java.util.List; public class CategoryWithArticles { private String categoryName; private List<Article> articles; public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public List<Article> getArticles() { return articles; } public void setArticles(List<Article> articles) { this.articles = articles; } } 映射器看起来像这样。 <resultMap type="test.Article" id="articleRM"> <id property="title" column="title" /> <result property="author" column="author" /> </resultMap> <resultMap type="test.CategoryWithArticles" id="beanRM"> <id property="categoryName" column="category_name"/> <collection property="articles" resultMap="articleRM" /> </resultMap> <select id="selectBeans" resultMap="beanRM"> select c.category_name, a.title, a.author from category c left join article a on c.id = a.category_id where c.category_name is not null order by c.category_name </select> 这是映射器方法签名。 List<CategoryWithArticles> selectBeans();

回答 1 投票 0

MybatisAutoConfiguration没有创建dataSource bean

我有一个SpringBoot 2.0.4.RELEASE项目,使用mybatis-spring-boot-autoconfigure-1.3.2.jar,并且工作正常。 mybatis-spring-boot-autoconfigure-1.3.2.jar 将创建 type 的 bean 数据源...

回答 1 投票 0

如何获取Mybatis中生成字符串的prepared语句

我正在将开发人员工具制作为网络服务。 要求之一是开发者工具应该能够将 Mybatis 使用的准备好的语句作为字符串返回。 然而,我不太...

回答 2 投票 0

如何使用Mybatis和SQLite创建表?

我正在尝试使用 Mybatis 和 SQLite 创建一个新数据库和新表。我从之前的答案(1,2,3)中发现Mybatis确实支持使用CREATE和ALTER语句,通过将它们标记为...

回答 1 投票 0

MyBatis 映射器配置

https://github.com/ChileKasoka/demospring 我该如何解决我不断收到的这个错误。我有一个名为“demoMapper”的映射器接口,并且我还手动配置了 myBatis 来初始化...

回答 1 投票 0

如何获取MyBatis插入生成的key?

如何使用 MyBatis 获取插入的生成密钥?我读了很多关于这个问题的页面,但我仍然被阻止,有人可以帮助我吗? 这是我的代码: 桌子: ID_ERROR 长 prima...

回答 11 投票 0

使用@Fetch加载数据时如何添加动态where代码?

我使用mybatis-mp框架进行开发,该框架的url是[这里](https://github.com/mybatis-mp)。 框架版本:1.5.8 视音频类 @数据 @ResultEntity(SysUser.class) 公开

回答 1 投票 0

MyBatis - 如何创建动态 WHERE 子句

服务获取一个未知对象,其中包含三个值的列表[列,运算符,值]例如, 电子邮件 - 就像 - “测试” 根据结果列表构建 WHERE 子句,但我

回答 3 投票 0

Mybatis如何将Integer映射到Enum?

在数据库中,“status”列是整数。 xml mybatis 在数据库中,“status”列是整数。 xml mybatis <resultMap id="TaskStatus" type="ru....domain.Task$Status"> <result typeHandler="org.apache.ibatis.type.EnumTypeHandler" property="id" column="status"/> </resultMap> <select id="selectStatus" resultMap="TaskStatus"> select id, status from task where id = #{id} </select> 我的枚举类 public class Task{ @Getter @AllArgsConstructor public enum Status { CREATED(1), RUNNING(2), PAUSED(3), FINISHED(4), ARCHIVED(5), MODERATION_READY(6), MODERATING(7), REJECTED(8); private final Integer id; } .... } 我想在枚举类中放置一列。 错误 查询数据库时出错。 原因:org.apache.ibatis.executor.result.ResultMapException:尝试从结果集中获取列“状态”时出错。 原因:java.lang.IllegalArgumentException:没有枚举常量ru...domain.Task.Status.2 默认的 EnumTypeHandler 映射枚举的名称(例如 "CREATED"、"RUNNING"),因此列类型必须是 VARCHAR [1] 等文本类型之一。 由于 MyBatis 对 id 属性一无所知,因此您必须编写自定义类型处理程序。 这是一个示例实现。 import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedTypes; import org.apache.ibatis.type.TypeHandler; @MappedTypes(Status.class) public class StatusTypeHandler implements TypeHandler<Status> { @Override public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { ps.setNull(i, Types.INTEGER); } else { ps.setInt(i, parameter.getId()); } } @Override public Status getResult(ResultSet rs, String columnName) throws SQLException { return getStatus(rs.getInt(columnName)); } @Override public Status getResult(ResultSet rs, int columnIndex) throws SQLException { return getStatus(rs.getInt(columnIndex)); } @Override public Status getResult(CallableStatement cs, int columnIndex) throws SQLException { return getStatus(cs.getInt(columnIndex)); } private static Status getStatus(int id) { if (id == 0) { return null; } for (Status status : Status.values()) { if (id == status.getId()) { return status; } } throw new IllegalArgumentException("Cannot convert " + id + " to Status"); } } 您应该全局注册此类型处理程序。 那么大多数情况下就不需要显式指定 typeHandler。 如果您使用mybatis-spring-boot,在配置中指定mybatis.type-handlers-package可能是全局注册类型处理程序的最简单方法。 如果您使用 XML 配置,请添加以下内容。 <typeHandlers> <typeHandler handler="xxx.yyy.StatusTypeHandler" /> </typeHandlers> 如果 Status 是您项目中唯一的枚举,您可以停止阅读。 但是,如果有许多具有 id 属性的枚举,并且您不想为每个枚举编写类似的自定义类型处理程序,该怎么办? 如果您的枚举实现如下所示的通用接口,您可以编写一个可以映射所有枚举的类型处理程序。 public interface HasId { Integer getId(); } 这是一个类型处理程序实现示例。 请注意,它有一个以 java.lang.Class 作为参数的构造函数。 import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedTypes; import org.apache.ibatis.type.TypeHandler; @MappedTypes(HasId.class) public class HasIdTypeHandler<E extends Enum<E> & HasId> implements TypeHandler<E> { private Class<E> type; private final E[] enums; public HasIdTypeHandler(Class<E> type) { if (type == null) throw new IllegalArgumentException("Type argument cannot be null"); this.type = type; this.enums = type.getEnumConstants(); if (!type.isInterface() && this.enums == null) throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type."); } @Override public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException { if (parameter == null) { ps.setNull(i, Types.INTEGER); } else { ps.setInt(i, parameter.getId()); } } @Override public E getResult(ResultSet rs, String columnName) throws SQLException { return getEnum(rs.getInt(columnName)); } @Override public E getResult(ResultSet rs, int columnIndex) throws SQLException { return getEnum(rs.getInt(columnIndex)); } @Override public E getResult(CallableStatement cs, int columnIndex) throws SQLException { return getEnum(cs.getInt(columnIndex)); } private E getEnum(int id) { if (id == 0) { return null; } for (E e : enums) { if (id == e.getId()) { return e; } } throw new IllegalArgumentException("Cannot convert " + id + " to " + type.getSimpleName()); } } 请注意,如果您尝试在映射器中指定此类型处理程序,它可能无法正常工作。有一个已知的问题。 [1] 仅供参考,还有另一个用于枚举的内置类型处理程序:EnumOrdinalTypeHandler 映射枚举的 ordinal。 这是另一种没有TypeHandler的方法。 只需在结果类型类中添加一个setter,其中输入参数应与数据库中的列类型相同。 例如 @Data public class YourDTO { private YourEnum yourEnum; public void setYourEnum(Integer enumCode) { this.yourEnum= YourEnum.fromCode(enumCode);//Call your static method defined in YourEnum } 仅此而已。对于mapper.xml 无需再做任何事情。 <resultMap id="yourDTO" type="YourDTO"> <result property="yourEnum" column="enumCode"/>

回答 2 投票 0

如何控制mybatis的localCache?

我在项目中使用mybatis 3.4.0版本和postgre sql。有一个 id 列 是串行类型(自动创建主键列)。 我编写映射器的generateId方法来获取序列值: 我...

回答 1 投票 0

带有 rollbackOnly=true 的事务(mybatis-cdi:org.mybatis.cdi.Transactional)注释不在 Weld / JUnit 5 测试中回滚事务

我希望此类 UserMapperTest.java 运行回滚事务的测试(在本例中是一个简单的插入,其中字段电子邮件是唯一的,但问题的核心是关于

回答 1 投票 0

MyBatis可以记录可以直接运行的完整SQL吗

MyBatis可以记录可以直接运行的完整SQL吗

回答 4 投票 0

Mybatis字符串值插入到oracle CLOB中

我正在尝试使用mybatis orm将记录列表插入到oracle数据库中。 插入数据库时抛出以下异常。 更新数据库时出错。 原因:java.sql.SQLException:ORA-014...

回答 1 投票 0

MyBatis 将结果转换为带有关联的 Java 记录时出错

我们正在从使用 Java Pojo 作为 DTO 转向使用 MyBatis 框架进行记录。 使用以下两种记录类型: 公共记录用户(整数cprid,字符串inlognaam,字符串upn,布尔值

回答 1 投票 0

Mybatis数据透视xml NumberFormatException“[”

我正在尝试使用 mybatis hub xml 创建一个变量列。就像下面的例子一样。 但是,如果包含字符串“[”,如下例所示,则会发生错误。 原因是:...

回答 1 投票 0

MyBatis:尝试从具有原始返回类型的方法返回 null

我的数据库连接是与mybatis, 我有具有此功能的 DAO: 公共 int getUpdateTaskStateStart(任务任务); 其实现位于 XML 文件中: 我的数据库连接是与mybatis, 我有具有此功能的 DAO: public int getUpdateTaskStateStart(Task task); 实现位于XML文件中: <select id="getUpdateTaskStateStart" resultType="Integer" parameterType="com.ladpc.mobile.entities.Task"> SELECT START_UPDATE FROM UPDATE_TASK_STATE WHERE TASK_ID = #{taskId} AND RASHUT_ID=#{rashutId} </select> 在数据库中,我有表 UPDATE_TASK_STATE,其中包括 START_UPDATE 归档。 我的问题是,当我运行 getUpdateTaskStateStart(Task) (并发送包含 rashutId="248" 和 taskId="2449" 文件的任务参数)时,我收到错误: org.apache.ibatis.binding.BindingException: Mapper method 'com.ladpc.mobile.dao.AssesmentTasksDao.getUpdateTaskStateStart attempted to return null from a method with a primitive return type (int). 我的功能出了什么问题? 谢谢! 您的 Mapper XML 指定了 resultType="Integer",但 getUpdateTaskStateTask() 希望返回原始 int,而不是 Integer 包装类。 将其更改为resultType="int"。 堆栈跟踪表明,您的方法返回“NULL”,但该方法具有“int”返回类型,这是Java中的原始数据类型,因此不能返回“NULL”值。 将方法的返回类型更改为其包装类“Integer”,那么至少异常将会消失。 public int getUpdateTaskStateStart(任务任务); 将 int 更改为整数 public Integer getUpdateTaskStateStart(任务任务); <Select> -> Null, <Update> -> int org.apache.ibatis.annotations.Select; org.apache.ibatis.annotations.Update;

回答 0 投票 0

类org.apache.commons.pool2.impl.BaseObjectPoolConfig没有成员字段'java.time.Duration DEFAULT_DURATION_BETWEEN_EVICTION_RUNS

我正在尝试使用 Spring boot 2.7.18 和 mybatis 3.5.10 运行 Java 21 应用程序。 该项目编译正常,但运行时出现以下异常。 DEFAULT_DURATION_BETWEEN_EVICTION_RUNS 属性...

回答 1 投票 0

考虑在配置中定义一个类型的bean:MyBatis

我是整个 Spring 生态系统的新手。我一直在关注一些教程,并且能够创建一个 Spring Boot 应用程序并执行 CRUD 操作。然后我开始将该项目更改为

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.