小试Ibatis

来源:互联网 发布:数据库设计三大模式 编辑:程序博客网 时间:2024/04/29 17:44

iBatis 是一个 O/R Mapping解决方案, iBatis 最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis 是能满足你的要求又足够灵活的最简单的解决方案。iBatis中所有的DAO方法都只传一个值对象,复杂查询当然也不例外。另外对常见的1:1,1:N关系的支持不如Hibernate。Ibatis是应该属于面向SQL的O/RMapping 而Hibernate 则属于面向对象的O/R Mappding相对比较复杂。

一直听说Ibatis很简单,而且很不错。所以,今天就学习一下。

先建数据库和表:
/*
MySQL Data Transfer
Source Host: localhost
Source Database: ibatis
Target Host: localhost
Target Database: ibatis
Date: 2007-4-24 1:02:15
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
Create TABLE `t_user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) default NULL,
  `password` varchar(10) default NULL,
  `email` varchar(50) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

-- ----------------------------
-- Records
-- ----------------------------
Insert INTO `t_user` VALUES ('1', '小林', 'admin', 'test#baidu.com.cn');
Insert INTO `t_user` VALUES ('2', 'Eays, 'admin', 'test2#163.com');
Insert INTO `t_user` VALUES ('3', '8', '8888', 'test3#google.net');

我的Eclipse工程目录:

现在编写Ibatis的SqlMapConfig.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<!-- Ibatis配置文件-->

<sqlMapConfig >
<!-- 加载连接数据库属性文件 -->
<properties resource="net/eays/maps/SqlMapConfig.properties" />

 <!--
 cacheModelsEnabled:是否启动SqlMapClient的缓存机制。
 enhancementEnabled:是否针对POJO启用字节码增加机制以提升geter/seter的调用效用,为延迟加载带来了及大的性能提升。
 lazyLoadingEnabled:是否启用延迟加载机制。
 maxRequests:最大并大请求数。
 maxSessions:最大Session数,即当前最大允许的开发SqlMapClient数
 maxTransactions:最大并发事务数。   
 -->
 <settings
 cacheModelsEnabled = "true"
 enhancementEnabled = "true"
 lazyLoadingEnabled = "true"
  maxRequests = "32"
  maxSessions = "10"
  maxTransactions = "5"
  useStatementNamespaces = "false"
 />
    <!-- DataSource -->
    <transactionManager type="JDBC">
     <dataSource type="SIMPLE">
      <!--JDBC驱动-->
      <property name="JDBC.Driver" value="${driver}" />
      <!--数据库URL-->
      <property name="JDBC.ConnectionURL" value="${url}" />
      <!--数据库用户名-->
      <property name="JDBC.Username" value="${username}" />
      <!--数据库密码-->
      <property name="JDBC.Password" value="${password}" />
   <!--不知道,在网站上查不出来,有时间再研究-->
   <property name="JDBC.DefaultAutoCommit" value="true" />
   <!--数据库连接池可维持的最大容量-->
   <property name="Pool.MaximumActiveConnections" value="10"/>
   <!--数据库连接池中允许的可挂起连接数-->
   <property name="Pool.MaximumIdleConnections" value="5"/>
   <!--数据库连接池中,连接被某个任务所占用的最大时间-->
   <property name="Pool.MaximumCheckoutTime" value="120000"/>
   <!--当线程想从连接池中获取连接时,连接池中无可用连接,该参数设置线程所允许等待的最长时间-->
   <property name="Pool.TimeToWait" value="500"/>
   <!--数据库连接状态检查语句-->
   <property name="Pool.PingQuery" value="select 1 from t_user"/>
   <!--是否允许检查连接状态-->
   <property name="Pool.PingEnabled" value="false"/>
   <!--对持续连接超过设定值的连接进行检查-->
   <property name="Pool.PingConnectionsOlderThan" value="1"/>
   <!--对空闲超过设定值的连接进行检查-->
   <property name="Pool.PingConnectionsNotUsedFor" value="1"/>
     </dataSource>
    </transactionManager>
<!--加载SqlMap文件-->
<sqlMap resource="net/eays/maps/User.xml" />
</sqlMapConfig>

编写配置文件类:SqlMapConfig.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ibatis
username=root
password=password

编写User.java类

package net.eays.maps;


/**
 * @author 小林信仁
 * @version 2007.4.23
 */
public class User {
 
 private int id;
 private String name;
 private String password;
 private String email;
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 
}
然后编写User.java类关联映射的User.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
    PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Author">
 <!--模块配置-->
 <!--设置本映射文件中的别名-->
 <typeAlias alias="user" type="net.eays.maps.User" />
 <!--Statement配置-->
 
 <select id="getUser" parameterClass="java.lang.String" resultClass="user">
 <![CDATA[ select name,password,email from t_user where  name = #name#]]>
 </select>
 <!--查询所有的记录-->
 <select id="getAllUser" resultClass="user">
 <![CDATA[ select * from t_user]]>
 </select>
 <!--修改-->
 <update id="updateUser" parameterClass="user">
 <![CDATA[ update t_user set name = #name#,password = #password# where id = #id#]]>
 </update>
 <!--删除-->
 <delete id="deleteUser" parameterClass="user">
 <![CDATA[ delete from t_user where id = #id# ]]>
 </delete>
 <insert id="insertUser" parameterClass="user">
 <![CDATA[ insert into t_user(name,password,email) values(#name#,#password#,#email#)]]>
 </insert>
</sqlMap>

编写测试类:
package com.eays;

import java.sql.*;
import java.io.Reader;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import net.eays.maps.User;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.common.resources.Resources;

/**
 * @author 小林信仁
 * @version 2007/4/23
 */
public class TestIbatis {
 //首先初始化一个Ibatis获取一个SqlMapConfig.xml对象
  public static SqlMapClient sqlMap = null;
  TestIbatis(){
  
  String resource = "net/eays/maps/SqlMapConfig.xml";
  try {
   Reader reader = Resources.getResourceAsReader(resource);
   sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   System.err.print("无价实例化SqlMapConfig对象");
  }
 }
 public  void updateUser(String name,String password,int id){
  User user = new User();
  user.setId(id);
  user.setName(name);
  user.setPassword(password);
  try {
   sqlMap.startTransaction();
   sqlMap.update("updateUser", user);
   sqlMap.commitTransaction();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   System.err.println("修改错误");
  }finally{
   try {
    sqlMap.endTransaction();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 public static List getAllUser(){
  List list = null;
  try {
   sqlMap.startTransaction();
   list = sqlMap.queryForList("getAllUser");
   sqlMap.commitTransaction();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {
    sqlMap.endTransaction();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return list;
 }
 
 public  boolean insertUser(String name,String password,String email){
  boolean bool = false;  
  User user = new User();
  user.setName(name);
  user.setEmail(email);
  user.setPassword(password);
  try {
   sqlMap.startTransaction();
   sqlMap.insert("insertUser",user);
   bool = true;
   sqlMap.commitTransaction();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   try {
    sqlMap.endTransaction();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return bool;
  
 }
 public static void main(String[] args) {
  
  TestIbatis testIbatis = new TestIbatis();
  testIbatis.updateUser("易思网", "sydica", 2);
  List list = TestIbatis.getAllUser();
  Iterator iterator = list.iterator();
  while(iterator.hasNext()){
   User user = (User)iterator.next();
   System.out.print("Email=" + user.getEmail() + " ");
   System.out.print("Id=" + user.getId() + " ");
   System.out.print("Password=" + user.getPassword() + " ");
   System.out.println("Name=" + user.getName() + " ");
   
  }
 }
 
}


 
原创粉丝点击