我正在运行一个存储过程,返回2个游标,但没有任何数据.我有以下映射xml:
<resultMap id="resultMap1" class="HashMap">
<result property="firstName" columnIndex="2"/>
</resultMap>
<resultMap id="resultMap2" class="com.somePackage.MyBean">
<result property="unitStreetName" column="street_name"/>
</resultMap>
<parameterMap id="parmmap" class="map">
<parameter property="id" jdbcType="String" javaType="java.lang.String" mode="IN"/>
<parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap1"/>
<parameter property="Result1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap2"/>
</parameterMap>
<procedure id="proc" parameterMap="parmmap">
{ call my_sp (?,?,?) }
</procedure>
Run Code Online (Sandbox Code Playgroud)
第一个结果集放在一个HashMap中......第二个resultSet被放在一个MyBean类中.
我DAO中的代码如下:
HashMap map = new HashMap()
map.put("id", "1234");
getSqlMapClientTemplate().queryForList("mymap.proc", map);
HashMap result1 = (HashMap)((List)parmMap.get("Result0")).get(0);
MyBean myObject = (MyBean)((List)parmMap.get("Result1")).get(0);//code fails here
Run Code Online (Sandbox Code Playgroud)
在上面的最后一行..我的代码失败.它失败,因为第二个游标没有行,这就是为什么没有任何东西放入列表.但是,第一个游标也没有返回任何内容,但由于结果被放入HashMap第一个游标的列表中,因此至少有HashMap对象在其中.
为何如此区别?有没有办法让iBatis将MyBean的对象放在列表中,即使没有返回行?或者我应该在DAO中处理这个......我想避免在DAO中处理它,因为我有一大堆这样的DAO.
决定将我的一个项目从iBatis移到MyBatis并遇到插入问题.
mapper xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="bap.persistance.interfaces.ArticleMapper">
<insert id="insertTestA">
insert into test_a ( cookie ) values( 'tomek pilot');
</insert>
</mapper>
Run Code Online (Sandbox Code Playgroud)
mapper java文件:
public interface ArticleMapper {
void insertTestA();
}
Run Code Online (Sandbox Code Playgroud)
映射器实现:
String resource = "bap/persistance/MyBatis_xml/MyBatisConfig.xml";
....
...
public void createArticle( Article article ) throws IOException {
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
try{
ArticleMapper mapper = session.getMapper(ArticleMapper.class);
mapper.insertTestA();
} catch( Exception e ){
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) 感谢您阅读本文.
我有2个MySQL数据库 - 写入主,读取从属.我想象的完美场景是我的应用程序使用连接到master来进行readOnly=false事务,slave用于readOnly=true事务.
为了实现这一点,我需要提供一个有效的连接,具体取决于当前事务的类型.我的数据服务层不应该知道它使用什么类型的连接,只是直接使用注入SqlMapClient(我使用iBatis).这意味着(如果我做对了)注入的SqlMapClients应该被代理,并且应该在运行时选择委托.
public class MyDataService {
private SqlMapClient sqlMap;
@Autowired
public MyDataService (SqlMapClient sqlMap) {
this.sqlMap = sqlMap;
}
@Transactional(readOnly = true)
public MyData getSomeData() {
// an instance of sqlMap connected to slave should be used
}
@Transactional(readOnly = false)
public void saveMyData(MyData myData) {
// an instance of sqlMap connected to master should be used
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是 - 我该怎么做?
非常感谢
我在Java中使用iBatis作为ORM框架.我有一个选择声明
<select id="getList" resultMap="correctMap">
SELECT *
FROM SOME_TABLE
</select>
Run Code Online (Sandbox Code Playgroud)
我正在使用queryForList方法:
List<MappedObject> list = getSqlMapClientTemplate().queryForList("getList");
Run Code Online (Sandbox Code Playgroud)
但是它检索了大量数据,并且此查询的性能非常慢.
我对这个问题的假设是iBatis具有默认的提取大小(例如在JDBS中是10),所以这就是它如此慢的原因.所以我想设置更大的提取大小(例如1000).我怎么能这样做?
还是我看错了?
注意:我需要所有数据,因此设置queryForList方法中的最大结果对我来说不是一个合适的解决方案.
List queryForList(String id,
Object parameterObject,
int skip,
int max)
Run Code Online (Sandbox Code Playgroud) 在mybatis中使用注释,我们可以将返回类型作为普通地图吗?
基本上,我想要这样的东西
@Select("select a, b from tableA")
public Map<String, String> getItems();
Run Code Online (Sandbox Code Playgroud)
哪里
mysql> select * from tableA;
+------+------+
| a | b |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
mysql> desc tableA;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | varchar(10) | YES | | NULL | |
| b | varchar(10) | YES | | NULL | | …Run Code Online (Sandbox Code Playgroud) 我有一个Web应用程序,我一直在慢慢地从iBATIS 2迁移到使用Spring Data的JPA.
在大多数情况下,事情进展顺利,我一次只为一个域对象迁移DAO.但是,最近引起我注意的一个问题是在网站的某些部分显示过时的结果列表.
例如,我有一个"票证"部分,它显示了打开的票证列表,并允许您在不同的页面上查看特定票证.当我创建新票证时,我可以正确地在其特定页面上查看该票证.但是,打开的票证列表似乎在一段时间之后才会显示此新票证.
我试图排除的事情:
cacheModelsEnabled="false"在iBATIS配置中设置,我也会看到这个问题.<cacheModel>元素和cacheModel="x"属性,我也会看到这个问题.我也试图用iBATIS排除某种奇怪的事务状态,但似乎根本没有在这里使用任何事务.
我错过了什么?还有什么我应该试图解决这个问题吗?或者,我是否应该优先使用Spring Data JPA替换iBATIS层,这似乎不受此问题的影响?
UPDATE
我现在已经经历了很多我最近的变化git bisect,并且我已经将它缩小到引入Spring的变化org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.
因此,似乎某些交易的寿命比应有的长.我将添加更多日志记录,看看我是否可以确认这一点,然后寻找避免使用该过滤器的方法.
我已经阅读了关于Mybatis的书和文档,XML和Annotation都做了我想要的,但是从myBatis官方网站,他们声称XML是一种更好的做Mappers的方法,因为Java注释有局限性.
我个人更喜欢注释,例如
public interface PersonDAO {
String INSERT_PERSON = "insert into person (title,firstName,surName,jobTitle,dob,email,mobile,landPhone,fax,twitter,facebook,linkedin) VALUES (#{title},#{firstName},#{surName},#{jobTitle},#{dob},#{email},#{mobile},#{landPhone},#{fax},#{twitter},#{facebook},#{linkedin})";
String UPDATE_PERSON = "update person set title=#{title},firstName=#{firstName},surName=#{surName},jobTitle=#{jobTitle},dob=#{dob},email=#{email},mobile=#{mobile},landPhone=#{landPhone},fax=#{fax},twitter=#{twitter},facebook=#{facebook},linkedin=#{linkedin} where id=#{id}";
String GET_PERSON_BY_ID = "SELECT * FROM vw_person WHERE id = #{personId}";
String DELETE_PERSON = "DELETE FROM person WHERE id = #{personId}";
@Select(GET_PERSON_BY_ID)
public PersonVO doSelectPerson(long personId) throws Exception;
@Update(UPDATE_PERSON)@Options(flushCache = true, useCache = true)
public int doUpdatePerson(PersonVO vo) throws Exception;
@Insert(INSERT_PERSON)@Options(useGeneratedKeys = true, keyProperty = "id", flushCache = true)
public int doCreatePerson(PersonVO person) throws Exception;
@Delete(DELETE_PERSON)@Options(flushCache …Run Code Online (Sandbox Code Playgroud) 我环顾四周寻找一个很好的例子,但我还没有碰到一个.我想使用IBATIS框架将自定义字符串数组从java传递到oracle并返回.有没有人有一个很好的链接到一个例子?我正在调用IBATIS的存储过程.
谢谢
我想在Android应用程序中使用myBatis(iBatis 3).有没有人尝试过这样的事情或知道任何资源?
我需要在插入的同一个表中填充2个不同的ID,我试图使用selectKey从Oracle序列中提取值来填充ID.
使用一个id和selectKey我没有问题但是当我添加第二个selectKey时,该值似乎没有填充(请参阅下面的插入节).
是否有可能做到这一点?或者我是否需要创建另一个查询来更新第二个ID?
谢谢
<insert id="create" parameterClass="MyObject">
<selectKey keyProperty="id" resultClass="long" type="pre">
<include refid="sequences.myObjectId" />
</selectKey>
<selectKey keyProperty="mySecondId" resultClass="long" type="pre">
<include refid="sequences.mySecondId" />
</selectKey>
INSERT INTO MY_OBJECT_TABLE
(
MY_OBJECT_ID,
MY_SECOND_ID,
...
)
VALUES
)
#id#,
#mySecondId#,
...
)
</insert>
Run Code Online (Sandbox Code Playgroud)