分类: Mysql/postgreSQL
2009-03-15 21:43:55
基于ibatis的CURD
1.简介
2.环境配置
3.具体应用
4.结语
作者:曹祺
Email:Qi.Cao@Sun.Com
Web:
Blog:http://blogs.sun.com/greysh
文章源代码下载
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Ibatis.zip
文章难度:入门
简介
相对于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代码为
当然,我们可以用typeAlias来简化
完整代码为
常用的操作如增删,ibatis提供了5种标签
select,insert,delete,update,statement
考虑到程序的可读性,主要使用前4种标签
本教程主要针对增删查改
代码为
insert into USER (USER_NAME, USER_PASSWORD) values ( #userName#,#userPassword#)
SELECT @@IDENTITY AS ID
update USER set USER_NAME = #userName#,
USER_PASSWORD = #userPassword#
delete from USER where USER_ID = #userId#
Ibatis中引用的变量用#号分割标签主要的熟悉是id,传入参数类(parameterClass),
传出参数类(resultClass),尽管ibatis可以提供传入Map(parameterMap)和传出Map(resultMap),
但是map会引起程序可读性下降,因此除了是跳用数据库存储过程,一般不传Map
然后在标签里面就是普通的SQL语句,但是对于MySQL的插入动作,
由于主键是交给数据库自身去代理,
所以需要以下标签来控制主键(仅仅针对MySQL有效)
SELECT @@IDENTITY AS ID
实体的映射配置好了后,需要配置sqlMapConfig,这个文件类似于hibernate.cfg.xml
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"">
请记得修改账户密码和连接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
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
List
list = (List
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:
Web:
Blog:http://blogs.sun.com/greysh