标签: mybatis

Ibatis/MyBatis动态选择,无需创建任何Pojo/Mapper

有没有办法使用Ibatis/MyBatis动态选择/更新/删除?

当我说"动态"时,它意味着我根本不想创建任何POJO/DataMapper.

任何URL示例都会受到欢迎.

ibatis mybatis

6
推荐指数
1
解决办法
1万
查看次数

对于使用Spring与JDBCTemplates,iBatis/myBatis或Hibernate的新项目?

您好我们正在开始一个项目,我们必须在使用Spring JDBCTemplates,iBatis/myBatis或Hibernate作为持久层之间做出决定.我或多或少熟悉他们两个人的概念,但我想知道人们目前倾向于使用什么.

我的要求是:

  • 保持一切尽可能简单
  • 易于学习和使用
  • 高性能
  • 最佳开发者生产力
  • 必须可以在Spring 3中使用

如上所述,我们希望尽可能简化一切.我倾向于倾向于iBatis/myBatis,因为它看起来更容易使用,我们不需要真正的OR Mapper.但我真的很期待向使用这些框架的人学习.

spring persistence hibernate ibatis mybatis

6
推荐指数
3
解决办法
1万
查看次数

MyBatis映射器直接注入服务类.例外呢?

我目前正在使用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)

在服务层中转换异常是否可以?

应该怎么做?

在此先感谢您的建议.

java spring dao design-patterns mybatis

6
推荐指数
1
解决办法
3728
查看次数

MyBatis select 语句返回空值

我正在尝试运行一个简单的 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)

jdbc mybatis

6
推荐指数
1
解决办法
3万
查看次数

@NotTransactional替代品

我正在进行单元测试,它通过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)

junit spring mybatis

6
推荐指数
2
解决办法
4261
查看次数

MyBatis:使用动态查询比较String值

我正在使用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)

java database mybatis

6
推荐指数
2
解决办法
2万
查看次数

使用mybatis时如何从查询中更改值(null为空字符串)?

我正在做一个使用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

================================================== ====================================

我找到了带来一些空值的方法.它需要一些配置.

  • make config.xml,其中应包含有关MyBatis Config DTD和Settings的一些信息,如下所示
<?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>
Run Code Online (Sandbox Code Playgroud)

现在,我可以得到{id="aaa", code = null}.这是另外一个问题.如何设置查询的默认值?例如.如果'code'的值为null,那么我想把默认字符串'default'.所以结果应该改变形式 {id="aaa", code=null}{id="aaa",code="default"}.可能吗?

谢谢〜

null ibatis map mybatis typehandler

6
推荐指数
1
解决办法
2万
查看次数

如何在MyBatis中对INSERT语句使用TypeHandler

有配置:

<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的相同处理程序?

java mybatis

6
推荐指数
1
解决办法
4108
查看次数

如何重用带有参数的SQL片段?

我打算制作一个片段,用于重用参数.

<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)

这可能吗?

ibatis mybatis

6
推荐指数
1
解决办法
5862
查看次数

MyBatis 3中Less Than/Equal运算符的正确语法是什么?

如何在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)

mybatis

6
推荐指数
1
解决办法
9536
查看次数