在我的项目中,我需要在运行时在数据库之间切换.我试图使用Hibernate,但卡在一个地方,我需要用数据库中的表映射对象.问题是,我有几个带前缀的表:documents2001,documents2002 ......据我所知,我无法在运行时使用表映射类.我尝试使用iBatis,但问题是在运行时期间数据库更改.在iBatis中,这很难做到.
也许有些建议,我该怎么用?
我的要求:
更新:
好的,我将尝试解释:
我必须编写应用程序,它可以在运行时连接到不同的数据库.app的用户可以选择,连接哪个数据库.所有数据库都具有相同的结构.除此之外,用户还可以在数据库中的表之间切换.表具有相同的结构.
也许我可以使用另一种工具?
iBatis 框架在版本 2 和 3 之间进行了重大调整,甚至配置文件(现在通常称为 MapperConfig.xml)也有所不同。
话虽如此,网上有很多关于如何使用 iBatis 创建 JDBC 连接池的示例,但我找不到关于如何使用 JNDI 创建的示例。有一个更新的用户指南:http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-User-Guide.pdf确实参考了第 19 页上的 JNDI 设置,但我仍然无法让它与数据库正确通信。
非常感谢 iBatis 3 中 JDNI(容器管理连接池)的工作示例!!
有一种方法可以使用oracle jdbc和Java指定IBatis查询超时吗?
谢谢
我正在尝试将 Ibatis 与 GWT 一起使用,我有这个场景,我有数据库表机场、航站楼和航班。一个机场可以有不同的航站楼。一个航站楼可以有一个机场和多个航班。一个航班可以有一个航站楼。所以表结构看起来像这样。
机场 -id -name -terminal_id
航站楼 -id -name -flight_id
航班 -id -airline -terminal_id
我的选择语句看起来像这样
SELECT airport.name AS Airport,
terminals.name AS Terminal,
flights.airline,
FROM airport,
terminals,
flights
WHERE airport.terminal_id = terminals.id
AND terminals.flight_id = flights.id;
Run Code Online (Sandbox Code Playgroud)
得到这个结果的 sql 映射是什么样的。我感到困惑的是结果集是表的组合,因此结果集不是三个表中任何一个的模型对象。
我正在尝试在我的工作项目中实施 MyBatis。它是一个遗留系统,它使用 vanilla JDBC 来访问数据库,仅通过存储过程。我知道要调用存储过程,MyBatis 需要一个包含存储过程输入参数的对象和另一个保存结果集的对象。不确定这是否完全正确。
为了防止在系统中创建过多的数据实体,我想重用现有的。这就是问题出现的地方。让我解释一下我面临的典型情况/场景,然后我将如何解决它。
假设我在系统中有以下数据实体:
class Account {
private int accountID;
private String accountName;
private OrganizationAddress address;
// Getters-Setters Go Here
}
class OrganizationAddress extends Address {
// ... some attributes here
// Getters-Setters Go Here
}
class Address {
private String address;
private String city;
private String state;
private String country;
// Getters-Setters Go Here
}
Run Code Online (Sandbox Code Playgroud)
我正在使用注释,所以我的Mapper类有这样的东西:
@Select(value = "{call Get_AccountList(#{accountType, mode=IN, jdbcType=String})}")
@Options(statementType = StatementType.CALLABLE)
@Results(value = {
@org.apache.ibatis.annotations.Result
(property = "accountID", column …Run Code Online (Sandbox Code Playgroud) 在映射器界面中,我有:
ArrayList<Item> select(@Param("filterId")int filterId, @Param("filterData")HashMap<String,Object> filterData);
Run Code Online (Sandbox Code Playgroud)
在映射器 xml 中,我有:
<select id="select" parameterType="map" resultMap="RM">
SELECT ...
FROM ....
WHERE id=#{filterData["id"]}
</select>
Run Code Online (Sandbox Code Playgroud)
没有错误,但结果不符合预期(它返回空集,但我知道存在具有此类 ID 的项目)。#{filterData["id"]} 似乎不起作用。我的错误在哪里?
假设我在我的mapper xml中执行下面的查询:
<select id="getData" parameterType="java.util.HashMap" resultType="java.util.LinkedHashMap">
select * from emp where empId=#{empId}
</select>
Run Code Online (Sandbox Code Playgroud)
在上面的xml中,empId是动态值,它返回HashMap的键中的值,该值作为Mybatis中上面的mapper xml中的参数传递.
当运行映射到方法getData的上述选择查询时,有没有办法将带有传递的参数的sql打印到控制台.
例如,我想在控制台中传递数据empId = 1:select*from emp其中empId = 1
使用jdbcType=BIGDECIMAL不支持myBatis并ibatis和抛出下一个错误:
Error resolving JdbcType. Cause: java.lang.IllegalArgumentException:
No enum constant org.apache.ibatis.type.JdbcType.BIGDECIMAL
Run Code Online (Sandbox Code Playgroud)
什么是jdbcType替代品BIGDECIMAL?
我正在使用mybatis-3.4.4版本
我有不同的客户使用不同的数据库供应商(postgres、oracle、mysql 等)
我想编写一次代码并能够针对不同的数据库运行。
实现这一目标的“mybatis”方式是什么?
到目前为止我发现的问题,例如:
我不想重复我的查询(这是我目前所做的)。可能有一种更优雅的方法来做到这一点。
我正在使用 mybatis java annotaions。
最近我在Web应用程序上工作,我决定在数据模型中使用integer [].有2个表,一个有文章数据,第二个有标签(标签ID和描述),决定标签ID,文章将在article.tags integer []列中标记.
正如Milen A. Radev所指出的那样:
提示:数组不是集合; 搜索特定的数组元素可能是数据库错误设计的标志.考虑为每个将成为数组元素的项使用一个单独的表.这将更容易搜索,并且可能更好地扩展到大量元素.
不仅如此,但是必须使用JDBC和iBatis来处理整数[],我应该说"有趣".
目前,我可以为我必须做的工作落实到位.为了简单起见,它可能会使用一个存储article.id和tag.id关系的单独表来重新工作.
最后,我很困惑的是整数[]最好用于什么语境?
我想我已经找到了最好的方法.