MyBatis学习笔记二:增删改查

老子叫甜甜 提交于 2020-12-22 05:03:13

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!