Chinaunix首页 | 论坛 | 博客
  • 博客访问: 438759
  • 博文数量: 161
  • 博客积分: 5005
  • 博客等级: 上校
  • 技术积分: 1090
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-20 16:38
文章分类

全部博文(161)

文章存档

2011年(21)

2010年(33)

2009年(89)

2008年(18)

我的朋友

分类: 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"     
    "">

   
      
      
                     value="jdbc:mysql://localhost:3306/ibatis" />
      
      
      

   

   

请记得修改账户密码和连接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 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 findAllUser() throws SQLException {
       List list = new ArrayList();
       list = (List) 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:

Web:

Blog:http://blogs.sun.com/greysh

阅读(640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~