标签: 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
查看次数

@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
查看次数

为什么接口和xml映射器文件必须在同一个包中并且具有相同的名称?

今天我正在准备一个使用Spring Boot并使用MyBatis进行Spring-MyBatis旁边的数据访问通信的示例.这是相关的项目配置(使用maven):

src/main/java
- edu.home.ltmj.controller
  + CategoryController.java
- edu.home.ltmj.dao
  + CategoryDao.java
- edu.home.ltmj.domain
  + Category.java
src/main/resources
- edu.home.ltmj.dao
  + CategoryMapper.xml
Run Code Online (Sandbox Code Playgroud)

文件的相关内容:

CategoryDao.java:

package edu.home.ltmj.dao;

public interface CategoryDao {
    List<Category> getAllCategories();
}
Run Code Online (Sandbox Code Playgroud)

CategoryMapper.xml:

<mapper namespace="edu.home.ltmj.dao.CategoryDao">
    <resultMap id="categoryMap"
        type="edu.home.ltmj.domain.Category">
        <id property="id" column="id" />
        <result property="name" column="name" />
    </resultMap>
    <select id="getAllCategories" resultMap="categoryMap">
        SELECT id, nombre
        FROM category
    </select>
</mapper>
Run Code Online (Sandbox Code Playgroud)

然后,我在请求控制器中注入一个这个dao的实例(用于测试目的),如下所示:

package edu.home.ltmj.controller;

@RestController
public class CategoryController {
    @Autowired
    private CategoryDao dao;

    @RequestMapping(value="/category/all",
        method=RequestMethod.GET,
        produces=MediaType.APPLICATION_JSON_VALUE)
    public List<Categoria> getAllCategories() {
        return dao.getAllCategories();
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行我的项目并通过使用测试执行 …

java spring mybatis spring-boot spring-mybatis

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

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
查看次数