有没有办法使用Ibatis/MyBatis动态选择/更新/删除?
当我说"动态"时,它意味着我根本不想创建任何POJO/DataMapper.
任何URL示例都会受到欢迎.
您好我们正在开始一个项目,我们必须在使用Spring JDBCTemplates,iBatis/myBatis或Hibernate作为持久层之间做出决定.我或多或少熟悉他们两个人的概念,但我想知道人们目前倾向于使用什么.
我的要求是:
如上所述,我们希望尽可能简化一切.我倾向于倾向于iBatis/myBatis,因为它看起来更容易使用,我们不需要真正的OR Mapper.但我真的很期待向使用这些框架的人学习.
我目前正在使用MyBatis-Spring集成框架,这就是我从docs中读到的内容:
Mybatis-Spring不是使用SqlSessionDaoSupport或SqlSessionTemplate手动编写数据访问对象(DAO),而是提供代理工厂:MapperFactoryBean.此类允许您将数据映射器接口直接注入服务bean.使用映射器时,您只需调用它们,因为您总是调用DAO,但您不需要编写任何DAO实现代码,因为MyBatis-Spring将为您创建代理.
这是一个非常好的功能......但是异常处理呢?我应该在哪里翻译SQL错误?在我的服务层?但它不会违反服务DAO模式吗?
例:
public final class AccountServiceImpl implements AccountService {
(...)
private AccountMapper accountMapper;
(...)
@Override
public void addAccount(Account account) throws AccountServiceException {
//Validating, processing, setting timestamps etc.
(...)
//Persistence:
int rowsAffected;
try {
rowsAffected = accountMapper.insertAccount(account);
} catch (Exception e) {
String msg = e.getMessage();
if (msg.contains("accounts_pkey"))
throw new AccountServiceException("Username already exists!");
if (msg.contains("accounts_email_key"))
throw new AccountServiceException("E-mail already exists!");
throw new AccountServiceException(APP_ERROR);
}
LOG.debug("Rows affected: '{}'", rowsAffected);
if (rowsAffected != 1)
throw new AccountServiceException(APP_ERROR);
}
Run Code Online (Sandbox Code Playgroud)
在服务层中转换异常是否可以?
应该怎么做?
在此先感谢您的建议.
我正在尝试运行一个简单的 MyBatis 示例,从“trains”表中选择所有行。
问题是查询执行,但它返回一个包含正确数量的元素的列表,但填充了空值。直接使用 JDBC PreparedStatement 运行的相同查询工作正常。
也许这是一个配置问题,但我无法弄清楚我做错了什么。
这是代码。提前致谢。
火车.java
package org.example.mybatis.domain;
public class Train implements Serializable
{
private int id;
private String type;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
TrainMapper.java
package org.example.mybatis.persistence;
public interface TrainMapper {
List<Train> getAllTrains();
}
Run Code Online (Sandbox Code Playgroud)
训练选择器.java
package org.example.mybatis.test;
public class TrainSelector implements TrainMapper {
private static String resource = "mybatis-config.xml";
private static SqlSessionFactory factory = null;
private SqlSessionFactory getSqlSessionFactory()
{
if (factory == null)
{
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
} …Run Code Online (Sandbox Code Playgroud) 我正在进行单元测试,它通过DAO将信息提交到Oracle数据库,然后检索它并检查所有内容是否保持不变.
测试类中还有其他单元测试,在课程顶部我有:
@TransactionConfiguration (defaultRollback = true)
Run Code Online (Sandbox Code Playgroud)
我想知道如何删除@NotTransactional.我没有在类上指定Transactional,所以默认情况下不应该像那样测试.由于这是它自己的测试,我不知道@BeforeTransaction(或After)注释是否正确.
的最大的问题是,如果没有@NotTransactional,看起来好像退订()函数不跑了.(垃圾标志不变.)
再次运行测试,@ rollback = false和@NonTransactional存在,我在测试完成后在数据库中看到trash标记正确设置为true.
@RunWith (SpringJUnit4ClassRunner.class)
@TransactionConfiguration (defaultRollback = true)
public class DatabaseTest {
@Autowired (required = true)
private FooDao<Foo> fooDao;
@Autowired (required = true)
private FooService fooService;
// other tests here that are marked @Transactional.
@Test
@NotTransactional
public void testDelete() {
Foo foo = new foo();
foo.setTrashFlag(false);
foo.setId(123);
fooDao.create(foo);
Foo fooFromDb = fooService.getFromDbById(123);
assertNotNull(fooFromDb);
fooService.unsubscribe(123); // among other things,
// **sets trash flag to true.**
// sqlSession.flushStatements(); // doesn't …Run Code Online (Sandbox Code Playgroud) 我正在使用MyBatis映射一些我需要比较String参数(myString)的查询.
我的Mapper 界面是:
public Map<Integer, String> findSomething(@Param("myString") String myString);
我的XML如下:
<select id="findSomething" parameterType="String" resultType="Map">
SELECT column1 as key,
column2 as value
FROM my_table
<where>
<choose>
<when test="myString == 'xxx'">
column3 = 1
</when>
<when test="myString == 'yyy'">
myColumn = 2
</when>
<when test="myString == 'zzz'">
myColumn = 3
</when>
</choose>
</where>
ORDER BY value;
</select>
Run Code Online (Sandbox Code Playgroud)
当我执行此语句时,抛出以下错误:
ERROR [stderr] Caused by: org.apache.ibatis.exceptions.PersistenceException:
ERROR [stderr] ### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter …Run Code Online (Sandbox Code Playgroud) 我正在做一个使用Spring 3.1.1和MyBatis3.0的项目.
我正在尝试将iBatis更改为MyBatis.但是,我正在努力使用resultmap.
使用iBatis时,我可以使用'nullValue'处理来自下面的查询中的值.
<resultMap class="java.util.HashMap" id="ChannelData">
<result property="id" javaType="java.lang.String" column="CHANNEL_ID" nullValue=""/>
<result property="code" column="SELECTSCOPE" nullValue="Television"/>
</resultMap>
Run Code Online (Sandbox Code Playgroud)
问题是MyBatis中没有'nullValue'.此外,如果列为"null",则mybatis永远不会填充该元素.例如.如果'SELECTSCOPE'为空,则会带来{id=aaa}.我需要一些像这样的数据 - > {id=aaa, code=''}.无论如何要处理这个?
PS
我查询超过20列.其中一些需要""当值为null时,其他人有自己的默认值一些字符串值.(如果我使用iBatis,'nullValue'是魔术关键字)我发现一些链接建议使用自定义类型处理程序,但使处理程序超过20可能是未来修复或维护混乱的原因.我需要一些简单的方法.
非常感谢:D
================================================== ====================================
我找到了带来一些空值的方法.它需要一些配置.
Run Code Online (Sandbox Code Playgroud)<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="callSettersOnNulls" value="true"/> </settings> </configuration>
现在,我可以得到{id="aaa", code = null}.这是另外一个问题.如何设置查询的默认值?例如.如果'code'的值为null,那么我想把默认字符串'default'.所以结果应该改变形式
{id="aaa", code=null}来{id="aaa",code="default"}.可能吗?
谢谢〜
有配置:
<resultMap id="mapId" type="package.MyType">
<result property="prop1" column="column1" />
<result property="prop2" column="column2" />
<result property="prop3" column="column3" typeHandler="package.MyTypeHandler" />
</resultMap>
<select id="selectStat" resultMap="mapId">
SELECT `column1`, `column2`, `column3`
FROM `table`;
</select>
Run Code Online (Sandbox Code Playgroud)
对于select语句,一切都很好,调用处理程序.
如何在插入数据时编写INSERT语句以调用column3的相同处理程序?
我打算制作一个片段,用于重用参数.
<insert ...>
<selectKey keyProperty="id" resultType="_long" order="BEFORE">
<choose>
<when test="_databaseId == 'derby'">
VALUES NEXT VALUE FOR SOME_ID_SEQ
</when>
<otherwise>
SELECT SOME_ID_SEQ.NEXTVAL FROM DUAL
</otherwise>
</choose>
</selectKey>
INSERT INTO ...
</insert>
Run Code Online (Sandbox Code Playgroud)
我可以使用参数创建SQL片段吗?
<sql id="selectKeyFromSequence">
<selectKey keyProperty="id" resultType="_long" order="BEFORE">
<choose>
<when test="_databaseId == 'derby'">
VALUES NEXT VALUE FOR #{sequenceName}
</when>
<otherwise>
SELECT #{sequenceName}.NEXTVAL FROM DUAL
</otherwise>
</choose>
</selectKey>
</sql>
Run Code Online (Sandbox Code Playgroud)
这样我可以像这样重用它们吗?
<insert ...>
<include refid="...selectKeyFromSequence"/> <!-- How can I pass a parameter? -->
INSERT INTO ...
</insert>
Run Code Online (Sandbox Code Playgroud)
这可能吗?
如何在MyBatis 3中使用小于等于.
<select id="getLog" resultMap="BaseResultMap" parameterType="java.lang.String">
SELECT * FROM(
SELECT * FROM TABLE1
WHERE COL1 =#{COL1,jdbcType=VARCHAR}
ORDER BY DATE DESC
) TABLE2
WHERE ROWNUM <= 20
</select>
Run Code Online (Sandbox Code Playgroud)