基于ibatis的CURD
基于ibatis的CURD
作者:曹祺
Email:Qi.Cao@Sun.Com
Web: http://www.greysh.com
Blog: http://blogs.sun.com/greysh
文章源代码下载
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Ibatis.zip
原文链接:
http://developers.sun.com.cn/blog/functionalca/entry/%E5%9F%BA%E4%BA%8Eibatis%E7%9A%84curd1
文章难度:入门
1.简介
2.环境配置
3.具体应用
4.结语
简介
相对于Hibernate这种全自动化的ORM框架,笔者跟喜欢用Ibatis这种办自动化的
ORM框架,其最吸引笔者的地方就在于其灵活性和小巧。
对于大型项目,如果需要人工SQL语句优化,Ibatis相对于Hibernate更能胜任负载要求。
环境配置
ibatis: 2.3.4.726
mysql: 5.0.27-community-nt
java version "1.6.0_11"
MyEclipse Enterprise Workbench Version: 6.5.0 GA
启动MyEclipse,新建一个Java Projeect(当然也可以选Java Web Project)
修改一下项目属性
把Java Compiler的属性改为Java 6,同时采用自己最新的JDK(不建议使用MyEclipse自带的)
然后把ibatis和mysql的驱动放到Java Build Path
这样运行环境就配置好了
3.具体应用,本文用ibatis做了一个增删查改的例子,以MySQL为数据库
数据字典如下
对应的SQL语句
CREATE TABLE `user` (
`USER_ID` int(11) NOT NULL auto_increment,
`USER_NAME` varchar(255) default NULL COMMENT '用户名',
`USER_PASSWORD` varchar(255) default NULL COMMENT '用户密码',
PRIMARY KEY (`USER_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
USER_ID为主键
然后Java 工程里面的文件结构如下

笔者为方便区分建立了一系列的包:
com.greysh.genix.config用来放配置的XML文件
com.greysh.genix.dao是数据访问层
com.greysh.genix.model用来存放实体
com.greysh.genix.service用来存放接口
com.greysh.genix.service.impl用来放接口的实现文件
com.greysh.genix.test用来放测试文件
ibatis在运行的时候首先会读取数据库映射文件,然后会用加载实体配置文件,在跳用的时候
会用SqlMapClient去增删查改
首先,我们来配置数据表User的ORM映射
在model类里面建立一个User的实体
public class User {
private int userId;
private String userName;
private String userPassword;
private String userPopedom;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserPopedom() {
return userPopedom;
}
public void setUserPopedom(String userPopedom) {
this.userPopedom = userPopedom;
}
}
然后建立User这个实体的映射文件,类似hibernate的hbm.xml文件
ORM代码为
<resultMap id="UserResult" class="com.greysh.genix.model.User">
<result property="userId" column="USER_ID" />
<result property="userName" column="USER_NAME" />
<result property="userPassword" column="USER_PASSWORD" />
</resultMap>
当然,我们可以用typeAlias来简化
完整代码为
<typeAlias alias="User" type="com.greysh.genix.model.User" />
<resultMap id="UserResult" class="User">
<result property="userId" column="USER_ID" />
<result property="userName" column="USER_NAME" />
<result property="userPassword" column="USER_PASSWORD" />
</resultMap>
常用的操作如增删,ibatis提供了5种标签
select,insert,delete,update,statement
考虑到程序的可读性,主要使用前4种标签
本教程主要针对增删查改
代码为
<select id="selectUserById" parameterClass="int" resultClass="User">
select USER_ID as userId, USER_NAME as userName, USER_PASSWORD
as userPassword from USER where USER_ID = #userId#
</select>
<insert id="insertUser" parameterClass="User">
insert into USER (USER_NAME, USER_PASSWORD) values ( #userName#,#userPassword#)
<selectKey resultClass="int" keyProperty="userId">
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
<update id="updateUser" parameterClass="User">
update USER set USER_NAME = #userName#,
USER_PASSWORD = #userPassword#
</update>
<delete id="deleteUserById" parameterClass="int">
delete from USER where USER_ID = #userId#
</delete>
Ibatis中引用的变量用#号分割标签主要的熟悉是id,传入参数类(parameterClass),
传出参数类(resultClass),尽管ibatis可以提供传入Map(parameterMap)和传出Map(resultMap),
但是map会引起程序可读性下降,因此除了是跳用数据库存储过程,一般不传Map
然后在标签里面就是普通的SQL语句,但是对于MySQL的插入动作,
由于主键是交给数据库自身去代理,
所以需要以下标签来控制主键(仅仅针对MySQL有效)
<selectKey resultClass="int" keyProperty="userId">
SELECT @@IDENTITY AS ID
</selectKey>
实体的映射配置好了后,需要配置sqlMapConfig,这个文件类似于hibernate.cfg.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>
<transactionManager type="JDBC" commitRequired="false">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://localhost:3306/ibatis" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="root" />
</dataSource>
</transactionManager>
<sqlMap resource="com/greysh/genix/config/User.xml" />
</sqlMapConfig>
请记得修改账户密码和连接URL
这里采用SIMPLE,当然ibatis也可以配置连接池,比如apache的dbcp
sqlMap是用来指定刚才的实体映射文件的位置
配置完后,就可以用DAO(Data Access Object)类去调用
DAO类完整代码
package com.greysh.genix.dao;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import com.greysh.genix.model.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class UserDao {
private static SqlMapClient sqlMapper;
static {
try {
String source = "com\\greysh\\genix\\config\\SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(source);
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
throw new RuntimeException(
"Something bad happened while building the SqlMapClient instance");
}
}
public static List<?> selectAllUser() throws SQLException {
return sqlMapper.queryForList("selectAllUser");
}
public static User selectUserById(int id) throws SQLException {
return (User) sqlMapper.queryForObject("selectUserById", id);
}
public static void insertUser(User user) throws SQLException {
sqlMapper.insert("insertUser", user);
}
public static void updateUser(User user) throws SQLException {
sqlMapper.update("updateUser", user);
}
public static void deleteUser(int id) throws SQLException {
sqlMapper.delete("deleteUserById", id);
}
}
首先静态初始化,因为静态初始化了,因此可以直接用sqlMapper,
否则需要开启事务
开启事务为
sqlMapper.startTransaction();//开启事务
//处理事务
sqlMapper.commitTransaction();//提交事务
sqlMapper的常用方法对应两个参数,第一个参数为配置文件的标签名,
后面参数为传入的变量
然后DAO就完成了,剩下我们可以去跳用
定义了User的接口和实现,完整代码为
package com.greysh.genix.service;
import java.sql.SQLException;
import java.util.List;
import com.greysh.genix.model.User;
public interface UserService {
public void add(User user) throws SQLException;
public void modify(User user) throws SQLException;
public void delete(User user) throws SQLException;
public List<User> findAllUser() throws SQLException;
public User findUserById(Integer id) throws SQLException;
}
对应的接口的实现
package com.greysh.genix.service.impl;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.greysh.genix.dao.UserDao;
import com.greysh.genix.model.User;
import com.greysh.genix.service.UserService;
public class UserImpl implements UserService {
public void add(User user) throws SQLException {
UserDao.insertUser(user);
}
public void delete(User user) throws SQLException {
UserDao.deleteUser(user.getUserId());
}
@SuppressWarnings("unchecked")
public List<User> findAllUser() throws SQLException {
List<User> list = new ArrayList<User>();
list = (List<User>) UserDao.selectAllUser();
return list;
}
public User findUserById(Integer id) throws SQLException {
User user = new User();
user = (User) UserDao.selectUserById(id);
return user;
}
public void modify(User user) throws SQLException {
UserDao.updateUser(user);
}
}
当然,如果整合Spring后,可以直接得到ibatis的模板,
就可以用接口进行依赖注入和控制反转(IOC)
最后对刚才的代码进行测试,
在com.greysh.genix.test建立一个TestUser的测试类
测试方法为
public static void main(String[] args) throws Exception {
//创建实体
User user = new User();
user.setUserName("Genix Cao");
user.setUserPassword("Greysh");
//创建服务
UserService userService = new UserImpl();
System.out.println("开始插入数据>>");
userService.add(user);
System.out.println("插入数据结束>>");
运行后,查看数据库如图

说明数据插入成功
然后测试其他方法

最后测试跟新数据和删除数据

跟新数据测试成功,剩下是删除数据

提示报Exception in thread "main" java.lang.NullPointerException
这边是刚才数据删除成功后再次查找无法找到的,数据删除也测试成功
结语
Ibatis作为一种轻量级的框架,其小巧收到很多程序员的青睐
对于其优化,可以设置其cacheModel,设置其flush参数
也可以用连接池,对于大型项目的优化,可以用存储过程
为了方便维护,ibatis也支持一对多,一对一等多表关系映射
Ibatis也可以整合Spring,把数据源维护交给spring
开发除了流行ssh(Spring+Struts2+Hibernate)也可以使用
ssi(Spring+Struts2+ibatis)
本文作为入门教程就不在此赘述了
欢迎感兴趣的朋友Email共同学习
Email:
Qi.Cao@Sun.Com
Web:
http://www.greysh.com
Blog:http://blogs.sun.com/greysh
发表于 Sun Functional 校园大使 [JavaEE] ( 三月 06, 2009 08:13 下午 ) Permalink | 评论[0]
