Mybatis环境搭建及简单入门

最近做项目需要使用ibatis(已改名为Mybatis),以前也没接触过,所以也是网上学习,但是网上很多资料很乱,所以自己在简单成功后,写篇文章,帮助解决那些后面要学习的童鞋,本意在于写的清楚完善,不偷懒过程,以避免不必要的麻烦。“对自己的懒惰,就是对别人看你文章学习的不负责任。”O(∩_∩)O

1 基本介绍

 iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。 
概念什么的,自己去google下吧,MyBatis是个持久层框架,另外的著名的也有 hibernate。[区别:http://zhidao.baidu.com/question/99674664.html]
ibatis经常和MVC框架一起用,本人就是Spring MVC + Mybatis。[MVC框架、持久层框架:http://zhidao.baidu.com/question/250857885.html]

2 为什么要用

不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。 

3 JDBC Demo

先看下demo目录,注意JDBC DEMO和ibatis DEMO我放在同一个工程了。请忽略solr,和本工程无关,我本人用于测试Solr的。
首先解决JDBC方式,之后介绍ibatis方式。

3.1 数据库Oracle

使用的是scott/tiger示例EMP[别告诉我,你连这个都忘了,。。。cmd->sqlplus scott/tiger      SQL>select * from emp;]

3.2  Java代码

model代码,用于描述数据库对象
package jdbc.model;

public class User implements java.io.Serializable {
	private Integer empNO;
	private String ename;
	private String job;
	private String mgr;
	private String sal;
	

	public Integer getEmpNO() {
		return empNO;
	}


	public void setEmpNO(Integer empNO) {
		this.empNO = empNO;
	}


	public String getEname() {
		return ename;
	}


	public void setEname(String ename) {
		this.ename = ename;
	}


	public String getJob() {
		return job;
	}


	public void setJob(String job) {
		this.job = job;
	}


	public String getMgr() {
		return mgr;
	}


	public void setMgr(String mgr) {
		this.mgr = mgr;
	}


	public String getSal() {
		return sal;
	}


	public void setSal(String sal) {
		this.sal = sal;
	}


	@Override
	public String toString() {
		return "EMP [empNO=" + empNO + ", ename=" + ename + ", job="
				+ job + ", mgr=" + mgr + ", sal=" + sal
				+ "]";
	}
}
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件[jdbc.properties]中读取,比较方便。
jdbc.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username=scott
jdbc.password=tiger
工具类,从jdbc.properties读取数据库信息,并连接数据库。
package jdbc.util;

import java.sql.*;
import java.util.ResourceBundle;

public class DBUtil {
		
    private static Connection conn = null;
    private static String url = "jdbc:oracle:thin:@localhost:1521:ORCL";//驱动程序名:@主机名/IP:端口号:数据库实例名
    private static String driver = "oracle.jdbc.driver.OracleDriver";
    private static String userName = "scott";
    private static String passWord = "tiger";
	public DBUtil() {
	}
	public static Connection getConnection() {
		try {
			Class.forName(driver);
			//DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());//实例化驱动程序类
			conn = DriverManager.getConnection(url, userName, passWord);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}
Demo测试
package jdbc;

import java.sql.*;
import jdbc.model.User;
import jdbc.util.DBUtil;
public class JDBCDemo {
	public static User getUser(int id) throws SQLException {
		User user = null;
		String sql = "select * from EMP where EMPNO=?";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DBUtil.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				user = new User();
				user.setEmpNO(rs.getInt("EMPNO"));
				user.setEname(rs.getString("ENAME"));
				user.setJob(rs.getString("JOB"));
				user.setMgr(rs.getString("MGR"));
				user.setSal(rs.getString("SAL"));
			}
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
			} finally {
				try {
					if (pstmt != null) {
						pstmt.close();
					}
				} finally {
					if (conn != null) {
						conn.close();
					}
				}
			}
		}
		return user;
	}
	public static void main(String[] args) throws Exception {
		System.out.println(getUser(7369));
	}
}
 这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。

4 ibstis DEMO

目前最新的Mybatis是mybatis-3.2.0.jar,但是由于网上没有最新的教程,而且新mybatis由于拆分了很细的包,对于新手不知道该用哪些,所以就用了mybatis-2.3.5.jar。

4.1 数据库

数据库的配置信息还是使用jdbc.properties文件即可,统一管理。 

4.2 Java代码

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" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${jdbc.driverClassName}" />
			<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
			<property name="JDBC.Username" value="${jdbc.username}" />
			<property name="JDBC.Password" value="${jdbc.password}" />
		</dataSource>
	</transactionManager>
	<sqlMap resource="ibatis/resources/User.xml" />
</sqlMapConfig>
配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。 getUsers根据id获取数据,getAllUsers获取所有,看代码就懂了。

<?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">
	<typeAlias alias="User" type="ibatis.model.User" />
	<select id="getUsers" resultClass="User">
		select 
		* 
		from EMP
		where EMPNO=#id#
	</select>
	<select id="getAllUsers" resultClass="User">
		select 
		* 
		from EMP
	</select>
</sqlMap>
typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。 
这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。 
最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。 
package ibatis;

import ibatis.model.User;
import java.io.*;
import java.sql.SQLException;
import java.util.List;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.*;

public class iBatisDemo {
	public static void main(String[] args) throws IOException, SQLException {
		String config = "ibatis/SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(config);
		SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		//Object o =new Object();
		List<User> list = sqlMap.queryForList("getUsers",7499);
		for (User user : list) {
			System.out.println(user);
		}
		System.out.println("===============================================================");
		List<User> list1 = sqlMap.queryForList("getAllUsers");
		for (User user : list1) {
			System.out.println(user);
		}
	}
}
这样,就结束了,下面是输出结果

EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600]
===============================================================
EMP [empNO=8900, ename=lihao, job=it, mgr=7902, sal=20000]
EMP [empNO=7369, ename=SMITH, job=CLERK, mgr=7902, sal=800]
EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600]
EMP [empNO=7521, ename=WARD, job=SALESMAN, mgr=7698, sal=1250]
EMP [empNO=7566, ename=JONES, job=MANAGER, mgr=7839, sal=2975]
EMP [empNO=7654, ename=MARTIN, job=SALESMAN, mgr=7698, sal=1250]
EMP [empNO=7698, ename=BLAKE, job=MANAGER, mgr=7839, sal=2850]
EMP [empNO=7782, ename=CLARK, job=MANAGER, mgr=7839, sal=2450]
EMP [empNO=7788, ename=SCOTT, job=ANALYST, mgr=7566, sal=3000]
EMP [empNO=7839, ename=KING, job=PRESIDENT, mgr=null, sal=5000]
EMP [empNO=7844, ename=TURNER, job=SALESMAN, mgr=7698, sal=1500]
EMP [empNO=7876, ename=ADAMS, job=CLERK, mgr=7788, sal=1100]
EMP [empNO=7900, ename=JAMES, job=CLERK, mgr=7698, sal=950]
EMP [empNO=7902, ename=FORD, job=ANALYST, mgr=7566, sal=3000]
EMP [empNO=7934, ename=MILLER, job=CLERK, mgr=7782, sal=1300]



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值