我正在使用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等),但这看起来也很蹩脚.
有任何想法吗?谢谢.
我想知道如何使用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) 我的目标实际上是将数据库的所有数据转储到XML文件中.数据库不是很大,大约300MB.问题是我的内存限制只有256MB(在JVM中).所以显然我不能把所有内容都读到内存中.
我设法使用iBatis解决了这个问题(是的,我的意思是iBatis,而不是myBatis)通过getList(... int skip, int max)多次调用它来增加skip.这确实解决了我的记忆问题,但我并没有对速度印象深刻.变量名称表明该方法的作用是读取整个结果集跳过然后指定的记录.这听起来对我来说是多余的(我不是说这是方法正在做什么,我只是猜测基于变量名称).
现在,我切换到myBatis 3以获取我的应用程序的下一个版本.我的问题是:有没有更好的方法来处理myBatis中的大块数据块?反正是为了让myBatis处理前N个记录,将它们返回给调用者,同时保持结果集连接打开,这样下次用户调用getList(...)时它将开始从N + 1记录中读取而不做任何记录"退出"?
我一直在尝试创建一个Spring项目,它将MyBatis用于数据访问层,作为我团队的概念验证.我真的希望尽可能避免XML配置,所以我试图使用带注释的@Configuration类将所有内容连接在一起.
一切似乎都正确连接,但我的映射器bean没有自动连接到我的服务层.
在我的示例中,我正在尝试将UserDao,User实体和UserService连接在一起.
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)
@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)
我使用两个配置类将它们连接在一起.
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@Import(DefaultDataAccessConfig.class) …Run Code Online (Sandbox Code Playgroud) 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) 使用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用于新项目.我对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) 我有以下场景:
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) 我有一个mybatis映射文件xml,复杂的查询很多where条款的条款.
有什么办法可以创建可能的查询组合吗?
我想在所有这些查询上运行解释,因为我计划添加NOT IN所有查询.
mybatis ×10
java ×8
spring ×2
ibatis ×1
jpa ×1
large-data ×1
oracle ×1
orm ×1
persistence ×1
sql ×1