Mybatis环境搭建及简单入门

来源:互联网 发布:js获取元素对象移除 编辑:程序博客网 时间:2024/06/07 02:07

最近做项目需要使用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;}@Overridepublic String toString() {return "EMP [empNO=" + empNO + ", ename=" + ename + ", job="+ job + ", mgr=" + mgr + ", sal=" + sal+ "]";}}
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件[jdbc.properties]中读取,比较方便。
jdbc.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@localhost:1521:ORCLjdbc.username=scottjdbc.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 EMPwhere 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]



原创粉丝点击