iBatis示范

iBatis示例

使用的是ibatis-2.3.4.726.jar

数据库驱动是mysql-connector-java-5.1.7-bin.jar、ojdbc14.jar

 

实体类

package org.monday.domain;

import java.util.Date;

/**
 * 实体类
 */
public class User {

	private int id;
	private String name;
	private String phone;
	private Date birthday;
	
	//getter and setter

	
}

 

 其映射文件User.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="User">

	<!-- 设置缓存 -->
	<cacheModel id="userCache" type="MEMORY" readOnly="true" serialize="false">
		<flushInterval hours="12" />
		<flushOnExecute statement="insert" />
		<flushOnExecute statement="update" />
		<flushOnExecute statement="delete" />
		<property name="reference-type" value="WEAK" />
	</cacheModel>

	<!-- 设置结果类型 -->
	<resultMap id="User" class="org.monday.domain.User">
		<result property="id" column="id" javaType="int" jdbcType="INTEGER" />
		<result property="name" column="name" javaType="string" jdbcType="VARCHAR" />
		<result property="phone" column="phone" javaType="string" jdbcType="VARCHAR" />
		<result property="birthday" column="birthday" javaType="date" jdbcType="DATE" />
	</resultMap>

	<!-- 设置别名 -->
	<typeAlias alias="User" type="org.monday.domain.User" />

	<!-- 添加 -->
	<insert id="insert" parameterClass="User">
		<!-- MySQL -->
		<!-- 
			这个可以不写
			<selectKey resultClass="int" keyProperty="id">  
        		select last_insert_id() as id 
			</selectKey>
		 -->
		insert into user_table(name,phone,birthday)
		values(#name#,#phone#,#birthday#)
		
		<!-- Oracle 实现自增使用序列,ibatis_seq要创建建好-->
		<!-- 
			<selectKey resultClass="int" keyProperty="id" type="pre">       
	            select ibatis_seq.nextval as id from dual
			</selectKey>
			insert into user_table(id,name,phone,birthday)
			values(#id#,#name#,#phone#,#birthday#)
		 -->
	</insert>

	<!-- 修改 -->
	<update id="update" parameterClass="User">
		update user_table
		set
		name=#name#,phone=#phone#,birthday=#birthday#
		where id=#id#
	</update>

	<!-- 删除 -->
	<delete id="delete" parameterClass="int">
		delete from user_table
		where id=#id#
	</delete>

	<!-- 根据Id查询 -->
	<select id="findById" parameterClass="int" resultClass="User">
		select *
		from
		user_table
		where id=#id#
	</select>

	<!-- 查询 全部 -->
	<select id="findAll" resultMap="User" cacheModel="userCache">
		select *
		from user_table
	</select>

	<!-- 查询记录数 -->
	<select id="findCount" resultClass="int">
		select count(*)
		from user_table
	</select>

	<!-- 模糊查询 -->
	<select id="findByLike" parameterClass="string" resultClass="User">
		select *
		from user_table
		where
		name
		like '%$name$%' 
	</select>

	<!-- 日期查询 -->
	<select id="findByDate" parameterClass="java.util.HashMap" resultClass="User">
		select *
		from user_table
		<!-- 有 > >= < <= 要使用<![CDATA[]]> where <![CDATA[birthday >= #start# and birthday <= #end#]]> -->
		where birthday between #start# and #end#
	</select>

	<!-- 存储过程 -->
	<procedure id="showData" resultClass="User">
		{call showData()}
	</procedure>

	<!-- 存储过程 in -->
	<parameterMap id="in_proc" class="int"> <!-- java.lang.Integer -->
		<parameter property="param" mode="IN" javaType="int" jdbcType="INTEGER" />
	</parameterMap>
	<procedure id="in_proc" parameterMap="in_proc" resultClass="User">
		{call in_proc (?)}
	</procedure>

</sqlMap>    

 

iBatis工具类

package org.monday.util;

import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

/**
 * iBatis工具类
 * @author Monday
 */
public class IbatisUtil {

	private static SqlMapClient sqlMapClient;

	private IbatisUtil() {
	}

	static {
		String resource = "sqlMapConfig.xml";
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (Exception e) {
			throw new ExceptionInInitializerError("初始化Ibatis出现错误");
		}
		sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
	}

	public static SqlMapClient getSqlMapClient() {
		return sqlMapClient;
	}
}

 

 

分页类

package org.monday.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页类
 * @author Monday
 */
public class Page<T> {

	public static final int DEFAULT_PAGE_SIZE = 10; // 每页默认显示10条记录

	private int pageNo; // 当前页数
	private int pageSize; // 每页显示条数
	private int totalCount; // 总记录数
	private List<T> list; // 结果集

	public Page() {
		this(1, DEFAULT_PAGE_SIZE, 0, new ArrayList<T>());
	}

	public Page(int pageNo, int pageSize, int totalCount, List<T> list) {
		this.pageNo = pageNo;
		this.pageSize = pageSize;
		this.totalCount = totalCount;
		this.list = list;
	}

	public int getPageNo() {
		return pageNo;
	}

	public int getPageSize() {
		return pageSize;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public List<T> getList() {
		return list;
	}

	/**
	 * 总页数
	 */
	public int getTotalPage() {
		if (totalCount % pageSize == 0) {
			return totalCount / pageSize;
		} else {
			return totalCount / pageSize + 1;
		}
		// return (totalCount + pageSize - 1) / pageSize;
	}

	/**
	 * 首页
	 */
	public int getFirstPage() {
		return 1;
	}

	/**
	 * 尾页
	 */
	public int getLastPage() {
		return getTotalPage();
	}

	/**
	 * 上一页
	 */
	public int getPreviousPage() {
		// 若当前页<=首页,则返回首页
		if (pageNo <= getFirstPage()) {
			return getFirstPage();
		}
		return pageNo - 1;
	}

	/**
	 * 下一页
	 */
	public int getNextPage() {
		// 若当前页>=尾页,则返回尾页
		if (pageNo >= getLastPage()) {
			return getLastPage();
		}
		return pageNo + 1;
	}

}

 

 

Dao实现类

package org.monday.dao.impl;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.monday.dao.UserDao;
import org.monday.domain.User;
import org.monday.util.IbatisUtil;
import org.monday.util.Page;

import com.ibatis.sqlmap.client.SqlMapClient;

public class UserDaoImpl implements UserDao {

	/**
	 * 添加
	 */
	@Override
	public void insert(User user) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.insert("insert", user);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 修改
	 */
	@Override
	public void update(User user) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.update("update", user);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 根据对象删除
	 */
	@Override
	public void delete(User user) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.delete("delete", user.getId());
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 根据id删除(推荐)
	 */
	@Override
	public void delete(int id) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.delete("delete", id);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 批量添加
	 */
	@Override
	public void insertBatch(List<User> list) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.startTransaction(); // 开启事务
			sqlMapClient.startBatch(); // 开启批量
			for (User user : list) {
				sqlMapClient.insert("insert", user);
			}
			sqlMapClient.executeBatch(); // 执行批量操作
			sqlMapClient.commitTransaction(); // 提交事务
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				sqlMapClient.endTransaction(); // 结束事务
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	/**
	 * 批量更新
	 */
	@Override
	public void updateBatch(List<User> list) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.startTransaction(); // 开启事务
			sqlMapClient.startBatch(); // 开启批量
			for (User user : list) {
				sqlMapClient.update("update", user);
			}
			sqlMapClient.executeBatch(); // 执行批量操作
			sqlMapClient.commitTransaction(); // 提交事务
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				sqlMapClient.endTransaction(); // 结束事务
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	/**
	 * 根据对象批量删除
	 */
	@Override
	public void deleteBatch(List<User> list) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.startTransaction(); // 开启事务
			sqlMapClient.startBatch(); // 开启批量
			for (User user : list) {
				sqlMapClient.delete("delete", user.getId());
			}
			sqlMapClient.executeBatch(); // 执行批量操作
			sqlMapClient.commitTransaction(); // 提交事务
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				sqlMapClient.endTransaction(); // 结束事务
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	/**
	 * 根据id批量删除(推荐)
	 */
	@Override
	public void deleteBatch(int... ids) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			sqlMapClient.startTransaction(); // 开启事务
			sqlMapClient.startBatch(); // 开启批量
			for (int i = 0; i < ids.length; i++) {
				sqlMapClient.delete("delete", ids[i]);
			}
			sqlMapClient.executeBatch(); // 执行批量操作
			sqlMapClient.commitTransaction();// 提交事务
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				sqlMapClient.endTransaction(); // 结束事务
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

	/**
	 * 根据id查询
	 */
	@Override
	public User findById(int id) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			User user = (User) sqlMapClient.queryForObject("findById", id);
			return user;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 查询全部
	 */
	@Override
	public List<User> findAll() {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			List<User> list = sqlMapClient.queryForList("findAll");
			return list;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 查询记录数
	 */
	@Override
	public int findCount() {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			int count = (Integer) sqlMapClient.queryForObject("findCount");
			return count;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 模糊查询
	 */
	@Override
	public List<User> findByLike(String name) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			List<User> list = sqlMapClient.queryForList("findByLike", name);
			return list;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 日期查询
	 */
	@Override
	public List<User> findByDate(Date start, Date end) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			Map<String, Date> param = new HashMap<String, Date>();
			param.put("start", start);
			param.put("end", end);
			List<User> list = sqlMapClient.queryForList("findByDate", param);
			return list;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 分页查询
	 */
	@Override
	public Page<User> findByPage(int pageNo, int pageSize) {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		try {
			int skip = (pageNo - 1) * pageSize;
			int max = pageSize;
			List<User> list = sqlMapClient.queryForList("findAll", skip, max);
			int totalCount = findCount();
			return new Page<User>(pageNo, pageSize, totalCount, list);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}

 

存储过程的测试

 

--调用存储过程

create procedure showData()
begin
	select * from user_table;
end ;


create  procedure in_proc (in param integer)
begin
	if param=0 then
		select * from user_table order by id asc;
	else
		select * from user_table order by id desc;
	end if;	
end;

 

 

package org.monday.other;

import java.util.List;

import org.monday.domain.User;
import org.monday.util.IbatisUtil;

import com.ibatis.sqlmap.client.SqlMapClient;

/**
 * 存储过程操作
 * @author Monday
 */
public class ProcMain {

	public static void main(String[] args) throws Exception {
		proc();
		// in_proc();
	}

	/**
	 * 普通的存储过程
	 */
	private static void proc() throws Exception {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		List<User> list = sqlMapClient.queryForList("showData");
		show(list);
	}

	/**
	 * 有输入参数的存储过程
	 */
	private static void in_proc() throws Exception {
		SqlMapClient sqlMapClient = IbatisUtil.getSqlMapClient();
		List<User> list = sqlMapClient.queryForList("in_proc", 10);
		show(list);
	}

	// 遍历集合
	private static void show(List<User> list) {
		for (User u : list) {
			System.out.println(u);
		}
	}
}

 

iBatis配置文件

SqlMapConfig.xml

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>

	<!-- 引入属性文件 -->
	<properties resource="jdbc.properties"/>
	
	<!-- 设置全局属性 -->
	<settings 
		useStatementNamespaces="false" 
		cacheModelsEnabled="true" 
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5" 
	/>

	<!-- 设置别名 -->
	<typeAlias alias="User" type="org.monday.domain.User"/>
	
	<!-- 设置事务管理 -->
	<transactionManager type="JDBC" commitRequired="false">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${driver}"/>
			<property name="JDBC.ConnectionURL" value="${url}"/>
			<property name="JDBC.Username" value="${username}"/>
			<property name="JDBC.Password" value="${password}"/>
		</dataSource>
	</transactionManager>
	
	<!-- 引入SqlMap映射文件 -->
	<sqlMap resource="org/monday/domain/User.xml"/>
	
</sqlMapConfig>

 

 

测试:

package junit.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;
import org.monday.dao.UserDao;
import org.monday.dao.impl.UserDaoImpl;
import org.monday.domain.User;
import org.monday.util.Page;

/**
 * 单元测试
 * @author Monday
 */
public class IbatisTest {

	private static UserDao userDao;

	@BeforeClass
	public static void init() {
		userDao = new UserDaoImpl();
	}

	@Test
	public void test_insert() {
		userDao.insert(new User("test", "9898777", new Date()));
	}

	@Test
	public void test_update() {
		userDao.update(new User(4, "test_update", "9898777999", new Date()));
	}

	@Test
	public void test_delete1() {
		userDao.delete(new User(4));
	}

	@Test
	public void test_delete2() {
		userDao.delete(5);
	}

	@Test
	public void test_insertBatch() {
		List<User> list = new ArrayList<User>();
		list.add(new User("test1", "98987771", new Date()));
		list.add(new User("test2", "98987772", new Date()));
		list.add(new User("test3", "98987773", new Date()));
		list.add(new User("test4", "98987774", new Date()));
		list.add(new User("test5", "98987775", new Date()));
		userDao.insertBatch(list);
	}

	@Test
	public void test_updateBatch() {
		List<User> list = new ArrayList<User>();
		list.add(new User(6, "test11", "989877711", new Date()));
		list.add(new User(7, "test22", "989877722", new Date()));
		list.add(new User(8, "test33", "989877733", new Date()));
		list.add(new User(9, "test44", "989877744", new Date()));
		list.add(new User(10, "test55", "989877755", new Date()));
		userDao.updateBatch(list);
	}

	@Test
	public void test_deleteBatch1() {
		List<User> list = new ArrayList<User>();
		list.add(new User(6));
		list.add(new User(7));
		list.add(new User(8));
		list.add(new User(9));
		list.add(new User(10));
		userDao.deleteBatch(list);
	}

	@Test
	public void test_deleteBatch2() {
		int[] ids = { 11, 12, 13, 14, 15 };
		userDao.deleteBatch(ids);
	}

	@Test
	public void test_findById() {
		System.out.println(userDao.findById(1));
	}

	@Test
	public void test_findAll() {
		List<User> list = userDao.findAll();
		for (User u : list) {
			System.out.println(u);
		}
	}

	@Test
	public void test_findCount() {
		System.out.println(userDao.findCount());
	}

	@Test
	public void test_findByLike() {
		List<User> list = userDao.findByLike("app");
		for (User u : list) {
			System.out.println(u);
		}
	}

	@Test
	public void test_findByDate() throws Exception {
		Date start = new SimpleDateFormat("yyyy-MM-dd").parse("2012-06-01");
		Date end = new SimpleDateFormat("yyyy-MM-dd").parse("2012-07-01");
		List<User> list = userDao.findByDate(start, end);
		for (User u : list) {
			System.out.println(u);
		}
	}

	@Test
	public void test_findByPage() {
		int pageNo = 2;
		int pageSize = 5;
		Page<User> page = userDao.findByPage(pageNo, pageSize);
		System.out.println("-----结果集-----");
		for (User user : page.getList()) {
			System.out.println(user);
		}
		System.out.println("总记录数:" + page.getTotalCount());
		System.out.println("总页数:" + page.getTotalPage());
		System.out.println("首页:" + page.getFirstPage());
		System.out.println("尾页:" + page.getLastPage());
		System.out.println("上一页:" + page.getPreviousPage());
		System.out.println("下一页:" + page.getNextPage());
	}
}