mybatis 相关问题

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

如果MyBatis SqlSession长时间不关闭会发生什么?

为什么会出现DisconnectNonTransientException?这种情况只发生一次,之后就无法重现该错误。 有什么解决方法可以避免将来再次发生该错误。更多进口...

回答 1 投票 0

使用 Spring 3.1、Mybatis 3 和 ehcache 缓存静态数据查找的最佳方式是什么?

我遵循了 mybatis-ecache 集成的建议,但我没有看到来自 EhCacheCache 的任何日志语句。 Spring 还集成了 eh-cache,乍一看似乎很容易导入...

回答 2 投票 0

如何高效地构建包含多个 UNION 操作的 SQL 查询?

我希望构造一个涉及多个联合的查询。 从 ( 中选择 * (从a中选择列) union(从 b 中选择列) union(从 c 中选择列) union(从 d 中选择列) ...) 我打算减少

回答 1 投票 0

为什么MyBatis有时找不到映射器,但大多数时候都能找到?

我在 Tomcat Web 应用程序中间歇性地收到 MyBatis 错误: org.apache.ibatis.exceptions.PersistenceException: ### 查询数据库时出错。 原因:java.lang.IllegalArgumentException:...

回答 1 投票 0

MyBatis:无效比较:java.util.Date 和 java.lang.String

我在比较 MyBatis 中的日期时遇到以下问题,如下所示 引起原因:java.lang.IllegalArgumentException:无效比较:java.util.Date 和 java.lang.String java 'applyDate' 和

回答 2 投票 0

在mybatis中评估json表达式

我的 sql server 表中有 JSON 列。我需要在列上执行一些过滤器并执行查询 下面是 SQL 选择 数数(*) ,json_extract(

回答 2 投票 0

验证 MyBatis 3.x 缓存是否正常工作的最简单方法

您好! 我正在尝试为一个小型 MyBatis 和 Spring 应用程序设置缓存,并遵循我的 xml 映射器包含的 pdf 文档 顶部的配置 xml 文件的设置为...

回答 1 投票 0

将ibatis案例迁移到原生SQL

我有以下 ibatis 查询: 更新用户 参考= #{参考}, ...

回答 1 投票 0

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

我有一个记录表及其评论表,例如: |评论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

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