标签: mybatis

MyBatis列映射

我正在使用MyBatis 3.0.3并且有问题:数据库中的某些列具有带下划线的名称,这些列应该映射到实体属性(当然是在camelCase中)

class User {
  private String first_name;
  ...
}

public interface UserDao {
  @Select("SELECT * FROM users")
  List<User> findAllUsers();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我看不出任何解决方法(就像在JPA中完成的那样 - @Column(name ="first_name")).我可以在select-clause中为这些列创建别名(sush作为firstName作为firstName等),但这看起来也很蹩脚.

有任何想法吗?谢谢.

java mybatis

12
推荐指数
5
解决办法
3万
查看次数

如何使用MyBatis/Spring实现批处理操作?

我想知道如何使用MyBatis 3和Spring 3使用insert语句实现批处理操作?

例如,以下是目前正在进行的操作:

spring.xml:

<bean id="jndiTemplateDatasource" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
      <props>
        <prop key="java.naming.factory.initial">${context.factory}</prop>
      </props>
    </property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate" ref="jndiTemplateDatasource"/>
  <property name="jndiName" value="${connectionpool.jndi}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.test" />
</bean>
Run Code Online (Sandbox Code Playgroud)

MyService.xml:

<insert id="insertMyRecord" parameterType="com.test.MyRecord"  >
   insert into ... // code removed
</insert> 
Run Code Online (Sandbox Code Playgroud)

MyService.java:

public interface MyService {

  public void insertMyRecord (MyRecord);
}
Run Code Online (Sandbox Code Playgroud)

MyController.java:

@Controller
public class MyController …
Run Code Online (Sandbox Code Playgroud)

java spring mybatis

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

在MyBatis中处理大量数据

我的目标实际上是将数据库的所有数据转储到XML文件中.数据库不是很大,大约300MB.问题是我的内存限制只有256MB(在JVM中).所以显然我不能把所有内容都读到内存中.

我设法使用iBatis解决了这个问题(是的,我的意思是iBatis,而不是myBatis)通过getList(... int skip, int max)多次调用它来增加skip.这确实解决了我的记忆问题,但我并没有对速度印象深刻.变量名称表明该方法的作用是读取整个结果集跳过然后指定的记录.这听起来对我来说是多余的(我不是说这是方法正在做什么,我只是猜测基于变量名称).

现在,我切换到myBatis 3以获取我的应用程序的下一个版本.我的问题是:有没有更好的方法来处理myBatis中的大块数据块?反正是为了让myBatis处理前N个记录,将它们返回给调用者,同时保持结果集连接打开,这样下次用户调用getList(...)时它将开始从N + 1记录中读取而不做任何记录"退出"?

java large-data mybatis

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

MyBatis-Spring + @Configuration - 无法自动装配映射器bean

我一直在尝试创建一个Spring项目,它将MyBatis用于数据访问层,作为我团队的概念验证.我真的希望尽可能避免XML配置,所以我试图使用带注释的@Configuration类将所有内容连接在一起.

一切似乎都正确连接,但我的映射器bean没有自动连接到我的服务层.

在我的示例中,我正在尝试将UserDao,User实体和UserService连接在一起.

userDAO的

public interface UserDao {
    @Select("SELECT * FROM users WHERE id = #{userId}")
    User get(@Param("userId") Integer userId);
}
Run Code Online (Sandbox Code Playgroud)

用户

@Component("User")
public class User implements Entity {
    public Integer userId;
    public String username;

    /** ... getters/setters ommitted **/
}
Run Code Online (Sandbox Code Playgroud)

UserServiceImpl

@Service("UserService")
public class UserServiceImpl {
    private UserDao userDao = null;  

    public User getUserDetails(Integer userId) {
        return userDao.get(userId);        
    }

    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用两个配置类将它们连接在一起.

ApplicationContextConfig

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@Import(DefaultDataAccessConfig.class) …
Run Code Online (Sandbox Code Playgroud)

spring mybatis

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

MyBatis插入列表值

Mapper.xml(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="TestDAO">
<insert id="insertEmployeeList" parameterType="java.util.List">
INSERT INTO EMPLOYEE (id, name) VALUES
<foreach collection="list" item="element" index="index" open="(" separator=","  close=")">
#{element.id}, #{element.name}
</foreach>
</insert>
</mapper>
Run Code Online (Sandbox Code Playgroud)

Employee.java

public class Employee {
  private List<Emp> list = new ArrayList<Emp>();
  public List<Emp> getList() {
    return list;
  }
  public void setList(List<Emp> list) {
    this.list = list;
  }
}
Run Code Online (Sandbox Code Playgroud)

Emp.java

public class Emp {
  public Emp(int id, String name) {
    this.id = id;
    this.name = name; …
Run Code Online (Sandbox Code Playgroud)

java oracle mybatis

11
推荐指数
3
解决办法
8万
查看次数

解析SQL Mapper配置处理程序时,MyBatis不解析Inner类

使用MyBatis 3.2.8,我试图将枚举类型(Status)映射到jdbc VARCHAR类型(只能使用我的实体bean中的枚举).所以我定义了TypeHandler UserStatusHandler

import com.sample.User.Status;
import org.apache.ibatis.type.EnumTypeHandler;

public class UserStatusHandler extends EnumTypeHandler<Status>
{
  public UserStatusHandler(Class<Status> type)
  {
    super(type);
  }
}
Run Code Online (Sandbox Code Playgroud)

我正确地在xml配置文件和UserDao.xml中声明了处理程序(将属性Status映射到resultMap中的VARCHAR ...)示例:

In the XML config file:
<typeHandlers>
    <typeHandler handler="com.sample.dao.UserStatusHandler" javaType="com.sample.User.Status"/>
</typeHandlers>

In the DAO mapper XML file:
<resultMap id="UserResultMap" type="User">
  <id property="id" column="ID" javaType="long"/>
  <result property="status" column="STATUS" typeHandler="com.sample.dao.UserStatusHandler" javaType="com.sample.User.Status"/>
  xxxxx
</resultMap>
Run Code Online (Sandbox Code Playgroud)

但是来自MyBatis的问题是MyBatis找不到我的java enum类,因为它是在另一个接口中定义的

public interface User
{
  public enum Status
  {
    A, B, C
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

当我在一个单独的文件中定义这个枚举类时,它没有问题,但我不喜欢改变我的设计(因为有限制?),我搜索了解为什么MyBatis在这种情况下找不到类?这是解决这个问题的方法吗?

MyBatis无法构建SqlSession.在执行简单测试以查找用户时,我得到以下异常

Cause: org.apache.ibatis.builder.BuilderException: 
Error parsing SQL Mapper Configuration. Cause:  
org.apache.ibatis.builder.BuilderException: …
Run Code Online (Sandbox Code Playgroud)

mybatis

11
推荐指数
1
解决办法
7374
查看次数

10
推荐指数
1
解决办法
8053
查看次数

使用mybatis保存/更新集合,通常的做法是什么?

我决定尝试将mybatis用于新项目.我对SQL非常熟悉,最近我对hibernate有一些不好的经历,所以我正在寻找一种更低级的DAO方法.

似乎相当不错,除了一件事,那就是处理集合.

我有两个POJO,组和用户,它们是多对多的.我已经决定了一个设计理念,即拥有集合的POJO应该只在保存时更新表之间的MM关系.因此,例如,当我保存具有用户集合的组对象时,设计理念规定应该已经保存用户,并且我只需要在数据库中保存组和group_user关系.

所以,对于界面中的saveGroup函数,我为mybatis做了这个XML映射:

    <insert id="saveGroup" keyColumn="id"
    parameterType="se.myapp.domain.Group">
    <choose>
        <when test="id == null">
        INSERT INTO myapp_group (name, description)
        VALUES
        (#{username}, #{password});
        </when>
        <otherwise>
        UPDATE myapp_group set name=#{name}, description=#{description}
        where id=#{id};
        </otherwise>
    </choose>

    <if test="users != null">
        create temporary table tmpnewgroups (group_id integer, user_id integer);

        insert into tmpnewgroups (group_id, user_id) values (
        <foreach collection="users" item="user" open="" close="" separator="),()">
             #{id},#{user.id}
        </foreach>
        );

        insert into myapp_user_group(group_id, user_id) 
        select tmp.group_id, tmp.user_id 
        from tmpnewgroups tmp 
        left outer join myapp_user_group ug 
            on ug.group_id = tmp.group_id and …
Run Code Online (Sandbox Code Playgroud)

java persistence ibatis mybatis

10
推荐指数
1
解决办法
4313
查看次数

MyBatis,插入复杂对象

我有以下场景:

public class MyObj{
    private String myField_1
    private String myField_2
    private MyChildObj myChild
    // Constructor & get/set
}

public class MyChildObj{
    private String myField_3
    private String myField_4
    // Constructor & get/set
}
Run Code Online (Sandbox Code Playgroud)

在我的Query.xml上,我用这种方式写了插入:

<insert id="insertMyObj" parameterType="MyObj">
    INSERT INTO MY_TABLE    (   FIELD_1,
                                FIELD_2,
                                FIELD_3,
                                FIELD_4)
    values  (   #{myField_1},
                #{myField_2},
                #{myField_3},
                #{myField_4},
    )
</insert>
Run Code Online (Sandbox Code Playgroud)

阅读mybatis结果地图指南后,我尝试在mybatis-config.xml文件中添加以下行:

<typeAliases>
    <typeAlias alias="MyObj"        type="myPackage.MyObj"/>
    <typeAlias alias="MyChildObj"   type="myPackage.MyChildObj"/>
</typeAliases>

<resultMap id="insertObj" type="MyObj">
    <result property="myField_1"  column="FIELD_1"/>
    <result property="myField_2"  column="FIELD_2"/>
    <association property="PrimaryKeyMap" resultMap="PrimaryKey"/>
</resultMap>

<resultMap id="PrimaryKeyMap" type="PrimaryKey">
    <result property=myField_3  column="FIELD_3"/> …
Run Code Online (Sandbox Code Playgroud)

java mybatis

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

从mybatis xml查询生成sql查询

我有一个mybatis映射文件xml,复杂的查询很多where条款的条款.

有什么办法可以创建可能的查询组合吗?

我想在所有这些查询上运行解释,因为我计划添加NOT IN所有查询.

java sql mybatis spring-mybatis

10
推荐指数
1
解决办法
269
查看次数