Mybatis环境搭建及简单入门

时间:2021-05-20 05:11:33

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

[java]view plaincopyprint?

  1.  

 

 

 

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的。

Mybatis环境搭建及简单入门

Mybatis环境搭建及简单入门

首先解决JDBC方式,之后介绍ibatis方式。

 

3.1 数据库Oracle

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

 

3.2  Java代码

 

model代码,用于描述数据库对象

[java]view plaincopyprint?

  1. package jdbc.model; 

  2.  

  3. publicclass Userimplements java.io.Serializable { 

  4.    private Integer empNO; 

  5.    private String ename; 

  6.    private String job; 

  7.    private String mgr; 

  8.    private String sal; 

  9.      

  10.  

  11.    public Integer getEmpNO() { 

  12.        return empNO; 

  13.     } 

  14.  

  15.  

  16.    publicvoid setEmpNO(Integer empNO) { 

  17.        this.empNO = empNO; 

  18.     } 

  19.  

  20.  

  21.    public String getEname() { 

  22.        return ename; 

  23.     } 

  24.  

  25.  

  26.    publicvoid setEname(String ename) { 

  27.        this.ename = ename; 

  28.     } 

  29.  

  30.  

  31.    public String getJob() { 

  32.        return job; 

  33.     } 

  34.  

  35.  

  36.    publicvoid setJob(String job) { 

  37.        this.job = job; 

  38.     } 

  39.  

  40.  

  41.    public String getMgr() { 

  42.        return mgr; 

  43.     } 

  44.  

  45.  

  46.    publicvoid setMgr(String mgr) { 

  47.        this.mgr = mgr; 

  48.     } 

  49.  

  50.  

  51.    public String getSal() { 

  52.        return sal; 

  53.     } 

  54.  

  55.  

  56.    publicvoid setSal(String sal) { 

  57.        this.sal = sal; 

  58.     } 

  59.  

  60.  

  61.    @Override 

  62.    public String toString() { 

  63.        return"EMP [empNO=" + empNO +", ename=" + ename +", job=" 

  64.                 + job +", mgr=" + mgr +", sal=" + sal 

  65.                 +"]"

  66.     } 

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

[java]view plaincopyprint?

  1. jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 

  2. jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL 

  3. jdbc.username=scott 

  4. jdbc.password=tiger 

jdbc.driverClassName=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@localhost:1521:ORCLjdbc.username=scottjdbc.password=tiger

工具类,从jdbc.properties读取数据库信息,并连接数据库。

[java]view plaincopyprint?

  1. package jdbc.util; 

  2.  

  3. import java.sql.*; 

  4. import java.util.ResourceBundle; 

  5.  

  6. publicclass DBUtil { 

  7.          

  8.    privatestatic Connection conn =null

  9.    privatestatic String url ="jdbc:oracle:thin:@localhost:1521:ORCL";//驱动程序名:@主机名/IP:端口号:数据库实例名 

  10.    privatestatic String driver ="oracle.jdbc.driver.OracleDriver"

  11.    privatestatic String userName ="scott"

  12.    privatestatic String passWord ="tiger"

  13.    public DBUtil() { 

  14.     } 

  15.    publicstatic Connection getConnection() { 

  16.        try

  17.             Class.forName(driver); 

  18.            //DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());//实例化驱动程序类 

  19.             conn = DriverManager.getConnection(url, userName, passWord); 

  20.         }catch (Exception e) { 

  21.             e.printStackTrace(); 

  22.         } 

  23.        return conn; 

  24.     } 

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测试

[java]view plaincopyprint?

  1. package jdbc; 

  2.  

  3. import java.sql.*; 

  4. import jdbc.model.User; 

  5. import jdbc.util.DBUtil; 

  6. publicclass JDBCDemo { 

  7.    publicstatic User getUser(int id)throws SQLException { 

  8.         User user =null

  9.         String sql ="select * from EMP where EMPNO=?"

  10.         Connection conn =null

  11.         PreparedStatement pstmt =null

  12.         ResultSet rs =null

  13.        try

  14.             conn = DBUtil.getConnection(); 

  15.             pstmt = conn.prepareStatement(sql); 

  16.             pstmt.setInt(1, id); 

  17.             rs = pstmt.executeQuery(); 

  18.            while (rs.next()) { 

  19.                 user =new User(); 

  20.                 user.setEmpNO(rs.getInt("EMPNO")); 

  21.                 user.setEname(rs.getString("ENAME")); 

  22.                 user.setJob(rs.getString("JOB")); 

  23.                 user.setMgr(rs.getString("MGR")); 

  24.                 user.setSal(rs.getString("SAL")); 

  25.             } 

  26.         }finally

  27.            try

  28.                if (rs !=null) { 

  29.                     rs.close(); 

  30.                 } 

  31.             }finally

  32.                try

  33.                    if (pstmt !=null) { 

  34.                         pstmt.close(); 

  35.                     } 

  36.                 }finally

  37.                    if (conn !=null) { 

  38.                         conn.close(); 

  39.                     } 

  40.                 } 

  41.             } 

  42.         } 

  43.        return user; 

  44.     } 

  45.    publicstaticvoid main(String[] args)throws Exception { 

  46.         System.out.println(getUser(7369)); 

  47.     } 

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。

Mybatis环境搭建及简单入门

 

4.1 数据库

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

 

4.2 Java代码

iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。

 

[html]view plaincopyprint?

  1. <?xmlversion="1.0"encoding="UTF-8"?> 

  2. <!DOCTYPE sqlMapConfig       

  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"       

  4.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> 

  5. <sqlMapConfig> 

  6.    <propertiesresource="jdbc.properties"/> 

  7.    <transactionManagertype="JDBC"> 

  8.        <dataSourcetype="SIMPLE"> 

  9.            <propertyname="JDBC.Driver"value="${jdbc.driverClassName}"/> 

  10.            <propertyname="JDBC.ConnectionURL"value="${jdbc.url}"/> 

  11.            <propertyname="JDBC.Username"value="${jdbc.username}"/> 

  12.            <propertyname="JDBC.Password"value="${jdbc.password}"/> 

  13.        </dataSource> 

  14.    </transactionManager> 

  15.    <sqlMapresource="ibatis/resources/User.xml"/> 

  16. </sqlMapConfig> 

<?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获取所有,看代码就懂了。

 

 

[html]view plaincopyprint?

  1. <?xmlversion="1.0"encoding="UTF-8"?> 

  2. <!DOCTYPE sqlMap       

  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"       

  4.     "http://ibatis.apache.org/dtd/sql-map-2.dtd"> 

  5. <sqlMapnamespace="User"> 

  6.    <typeAliasalias="User"type="ibatis.model.User"/> 

  7.    <selectid="getUsers"resultClass="User"> 

  8.         select  

  9.         *  

  10.         from EMP 

  11.         whereEMPNO=#id# 

  12.    </select> 

  13.    <selectid="getAllUsers"resultClass="User"> 

  14.         select  

  15.         *  

  16.         from EMP 

  17.    </select> 

  18. </sqlMap> 

<?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接口提供的方法进行数据操作。

[java]view plaincopyprint?

  1. package ibatis; 

  2.  

  3. import ibatis.model.User; 

  4. import java.io.*; 

  5. import java.sql.SQLException; 

  6. import java.util.List; 

  7.  

  8. import com.ibatis.common.resources.Resources; 

  9. import com.ibatis.sqlmap.client.*; 

  10.  

  11. publicclass iBatisDemo { 

  12.    publicstaticvoid main(String[] args)throws IOException, SQLException { 

  13.         String config ="ibatis/SqlMapConfig.xml"

  14.         Reader reader = Resources.getResourceAsReader(config); 

  15.         SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); 

  16.        //Object o =new Object(); 

  17.         List<User> list = sqlMap.queryForList("getUsers",7499); 

  18.        for (User user : list) { 

  19.             System.out.println(user); 

  20.         } 

  21.         System.out.println("==============================================================="); 

  22.         List<User> list1 = sqlMap.queryForList("getAllUsers"); 

  23.        for (User user : list1) { 

  24.             System.out.println(user); 

  25.         } 

  26.     } 

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);}}}

这样,就结束了,下面是输出结果

 

[java]view plaincopyprint?

  1. EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600

  2. =============================================================== 

  3. EMP [empNO=8900, ename=lihao, job=it, mgr=7902, sal=20000

  4. EMP [empNO=7369, ename=SMITH, job=CLERK, mgr=7902, sal=800

  5. EMP [empNO=7499, ename=ALLEN, job=SALESMAN, mgr=7698, sal=1600

  6. EMP [empNO=7521, ename=WARD, job=SALESMAN, mgr=7698, sal=1250

  7. EMP [empNO=7566, ename=JONES, job=MANAGER, mgr=7839, sal=2975

  8. EMP [empNO=7654, ename=MARTIN, job=SALESMAN, mgr=7698, sal=1250

  9. EMP [empNO=7698, ename=BLAKE, job=MANAGER, mgr=7839, sal=2850

  10. EMP [empNO=7782, ename=CLARK, job=MANAGER, mgr=7839, sal=2450

  11. EMP [empNO=7788, ename=SCOTT, job=ANALYST, mgr=7566, sal=3000

  12. EMP [empNO=7839, ename=KING, job=PRESIDENT, mgr=null, sal=5000

  13. EMP [empNO=7844, ename=TURNER, job=SALESMAN, mgr=7698, sal=1500

  14. EMP [empNO=7876, ename=ADAMS, job=CLERK, mgr=7788, sal=1100

  15. EMP [empNO=7900, ename=JAMES, job=CLERK, mgr=7698, sal=950

  16. EMP [empNO=7902, ename=FORD, job=ANALYST, mgr=7566, sal=3000

  17. EMP [empNO=7934, ename=MILLER, job=CLERK, mgr=7782, sal=1300

转:http://blog.****.net/lich0000/article/details/8628808