MyBatis基本的增删改查操作,有图有真相,项目截图[MyBatis-0200]
项目依赖及表参阅上一篇
[user.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接口的完整类路径,在MyBatis3.x中不可省略 -->
<mapper namespace="net.yeah.likun_zhang.mapper.IUserMapper">
<!-- ========================================
eviction : 回收方式(
LRU – 最近最少使用的:移除最长时间不被使用的对象(默认)。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
)
flushInterval : 可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size : 可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
reayOnly : 可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
======================================== -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="false"/>
<!-- 定义一段sql语句,后续代码可以重用 -->
<sql id="user_columns">
id ,account ,password ,nickname ,email ,birthday ,status ,registed_time
</sql>
<!-- 主键查询 -->
<select id="get" parameterType="long" resultType="user">
<!-- include : 引用sql中定义的语句 -->
select <include refid="user_columns"/> from tbl_user where id = #{id}
</select>
<!-- ========================================
id : 在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType : 将会传入这条语句的参数类的完全限定名或别名
resultType : 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。resultType 或 resultMap不能同时使用
flushCache : 如果为true,将清空缓存,默认值:false
useCache : 如果为true,本条语句将被缓存,默认值:true
timeout : 设置超时时间,默认不设置,驱动自行处理
fetchSize : 暗示驱动程序每次批量返回的结果行数(是否执行因驱动而异),默认不设置,驱动自行处理
statementType :指定STATEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。默认值:PREPARED
resultSetType :FORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE 中的一种。默认不设置,驱动自行处理
以上参考文档 :http://mybatis.github.com/mybatis-3/zh/sqlmap-xml.html ======================================== -->
<select id="listByAccount"
parameterType="String"
resultType="user"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
select <include refid="user_columns"/> from tbl_user where account = #{account}
</select>
<!-- ========================================
参数配置与select基本类似,主要不同有以下几点:
keyProperty :属性名,标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。默认: 不设置(仅对 insert 有用)
keyColumn :字段名,同上
以上参考文档 :http://mybatis.github.com/mybatis-3/zh/sqlmap-xml.html ======================================== -->
<insert id="save"
parameterType="user"
flushCache="false"
statementType="PREPARED"
keyProperty="id"
useGeneratedKeys="true"
timeout="20">
insert into tbl_user (account ,password ,nickname ,gender ,email ,status ,registed_time)
values (#{account},#{password},#{nickname},#{gender},#{email},#{status},#{registedTime})
</insert>
<update id="update"
parameterType="user"
flushCache="true"
statementType="PREPARED"
timeout="20">
update tbl_user set
nickname = #{nickname} ,
email = #{email} ,
status = #{status} ,
birthday = #{birthday}
where id = #{id}
</update>
<delete id="delete"
parameterType="long"
flushCache="true"
statementType="PREPARED"
timeout="20">
delete from tbl_user where id = #{id}
</delete>
</mapper>
[
IUserMapper.java
]
package net.yeah.likun_zhang.mapper;
import java.util.List;
import net.yeah.likun_zhang.model.User;
/**
* 用户表映射接口
* @author ZhangLiKun
* @mail likun_zhang@yeah.net
* @date 2013-3-31
*/
public interface IUserMapper {
User get(Long id) ;
List<User> listByAccount(String account) ;
int save(User user) ;
void update(User user) ;
void delete(Long id) ;
}
[测试用例]
package net.yeah.likun_zhang.example;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.List;
import net.yeah.likun_zhang.mapper.IUserMapper;
import net.yeah.likun_zhang.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SqlSessionTest {
private SqlSessionFactory sessionFactory ;
private SqlSession session ;
private IUserMapper um ;
@Before
public void setUp() throws IOException {
String resource = "mybatis.xml";
InputStream in = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(in);
session = sessionFactory.openSession();
um = session.getMapper(IUserMapper.class);
}
@Test
public void testSelectOne() {
User user = um.get(1L);
assertNotNull(user);
assertEquals("admin", user.getAccount());
}
@Test
public void testSelectList() {
List<User> users = um.listByAccount("admin") ;
assertNotNull(users);
assertEquals("admin", users.get(0).getAccount());
}
@Test
public void testInsert() {
User user = new User() ;
user.setAccount("jack") ;
user.setPassword("123456") ;
user.setNickname("jack") ;
user.setEmail("jack@yeah.net") ;
user.setGender(0) ;
user.setStatus(0) ;
user.setRegistedTime(Calendar.getInstance().getTime()) ;
int result = um.save(user) ;
assertEquals(1 ,result) ; // 返回的是插入记录条数而非自增长ID
assertTrue(user.getId() > 0) ; // 自增长ID被set到要保存对象中去了,类似于JPA的persist方法
}
@Test
public void testUpdate() {
User user = um.get(1L) ;
user.setStatus(0) ;
um.update(user) ;
user = um.get(1L) ; // 重新获取User对象
assertEquals("admin", user.getAccount()) ;
assertEquals(0 ,user.getStatus()) ;
}
@Test
public void testDelete() {
Long id = 15L ;
assertNotNull(um.get(id)) ;
um.delete(id) ;
assertNull(um.get(id)) ;
}
@After
public void tearDown() {
// session.commit() ; // 需手动提交事务,否则数据不会被写入数据库中,增删改测试需提交事务
session.close() ;
}
}
【
Source Download
】
来源:oschina
链接:https://my.oschina.net/u/1023355/blog/120875