MyBatis 一种优秀的O/R mapping框架 , 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索 。
MyBatis和Hibernate 对比:
1. MyBatis 非常简单易学,Hibernate相对较复杂,门槛较高。
2. 二者都是比较优秀的开源产品
3. 当系统属于二次开发,无法对数据库结构做到控制和修改,那MyBatis 的灵活性将比Hibernate更适合
4. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下MyBatis 会有更好的可控性和表现。
5. MyBatis 需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,MyBatis 的工作量比 Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而MyBatis 要把那些sql mapping的地方一一修改。 6. 以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种
PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
7. 当然因为HQL 和SQL 查询的问题 性能上MyBatis 很明显就比 Hibernate要快。
OK 看了上面这么的多 那么到底MyBatis怎么实现呢。下面就让我们一起走进MyBatis的大门吧。
第一步:做好准备工作
首先我们要到MyBatis官网下载MyBatis 开发包 http://www.mybatis.org/ 我下面例子用的事3.1.1的版本 :有了开发包 我们可以继续往下走了哦。
第二步:创建工程、配置开发环境
1:解压刚才下走的ZIP包
在这个文件里面我就不一个个介绍了。
2:打开你的开发工具:我这里用的是MyEclipse9.0
2.1创建工程jibatis
2.2 向工程导入所需要的包
这里导入的就是上面1所解压的jar包
注意: 导入的jar包中还有一个mysql-connector-java-5.0.4-bin.jar 这个 jar包 这个文件是mysql驱动的jar包 我这里用到的数据库是 mysql。
OK 到这里 你就基本上创建好一个项目了 而且是支持MyBatis的项目。第三步开始 我们就进入到编码过程
第三步:数据源配置
在项目中创建com.ibatis包(这里为了项目进行方便所有类或xml文件都放在这一个包下)
在com.ibatis创建sqlmap-config.xml
sqlmap-config.xml主要是用来配置数据源代码如下: PUBLIC \"-//ibatis.apache.org//DTD Config 3.0//EN\" \"http://ibatis.apache.org/dtd/ibatis-3-config.dtd\">
到这里第三步完成。下面我们继续往下走吧。
第四步:配置映射xml(TestSql.xml)
在com.ibatis创建TestSql.xml
恭喜您来到第四步 第四部很简单 ,如果学过Hibernate都知道 Hibernate都有一个映射文件 ,为什么要有这个文件 那是为了 实现面向对象 而要实现的 。具体代码如下:
PUBLIC \"-//ibatis.apache.org//DTD Mapper 3.0//EN\" \"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd\"> (#{id},#{name},#{createtime},#{email},#{tilepath},#{lastloginip},#{lastlogintime},#{nickname},#{password},#{picture},#{sessionid},#{sex},#{tel},#{username})
在上面代码中 您可以适当减少字段 这样会快点配置完成。 OK 第四步完成。
那么 到这里 所有要配置的文件基本都配置完了 下面就是我们要实现 Bean的 时候了 。
第五步:model (bean) 类(Test.java)
在com.ibatis创建Test.java
那么这个类没有什么好说的 就是一些字段属性 之后完成get set方法 就OK 了
不过还是贴出代码 方面朋友们查看:
public class Test implements Serializable {
private static final long serialVersionUID -2478236396012275225L;
private String id;
//用户�?
private String username;
=
//密码
private String password;
//姓名
private String name;
// 昵称
private String nickname;
// 性别 可�?�?1 为男�?�? 女�? private String sex; //用户头像图片
private String picture;
//创建时间
private String createtime;
//上次登录时间
private String lastlogintime;
private String tilepath;
public String getTilepath() { return tilepath; }
public void setTilepath(String tilepath) { this.tilepath = tilepath; }
//上次登录IP
private String lastloginip;
//当前会话ID
private String sessionid;
//联系电话
private String tel;
//邮箱
private String email;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; } /**
获取用户头像URL
@return 用户头像URL
* * */
public String getPicture() { return picture; }
/** * 设置用户头像URL
* @param picture 用户头像URL */
public void setPicture(String picture) { this.picture = picture; }
public String getLastLoginIp() { return lastloginip; }
public void setLastLoginIp(String lastloginip) { this.lastloginip = lastloginip; }
public String getSessionid() { return sessionid; }
public void setSessionid(String sessionid) { this.sessionid = sessionid; }
public String getCreatetime() { return createtime; }
public void setCreatetime(String createtime) { this.createtime = createtime; }
public String getLastlogintime() { return lastlogintime; }
public void setLastLogintime(String lastlogintime) {
this.lastlogintime = lastlogintime;
} /**
* 获取昵称
* @return the nickname 昵称 */
public String getNickname() { return nickname; } /**
* 设置昵称
* @param nickname 昵称 */
public void setNickname(String nickname) { this.nickname = nickname; }
public String getTel() { return tel; }
public void setTel(String tel) { this.tel = tel; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
在这一步要注意的是 要和第四步中的字段匹配 这个是硬性要求来的 大家可以这两部项目查看就明白了。
第六步:实例化 SqlSessionFactory
在com.ibatis创建GetSqlSessionFactory.java
这个类的原理和实现Hibernate实例化的原来一样 我们可以定义一个单例模式来 完成实例化。代码如下:
public class GetSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory = null;
private static GetSqlSessionFactory getSqlSessionFactory = null;
private GetSqlSessionFactory(){
String rs = \"com/ibatis/sqlmap-config.xml\"; Reader reader = null; try {
reader = Resources.getResourceAsReader(rs);
} catch (IOException e) { e.printStackTrace(); }
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(reader);
//注解方式查询时需要注册mapper
sqlSessionFactory.getConfiguration().addMapper(UserDaoTestImpl.class); }
public static GetSqlSessionFactory getInstance(){ if(getSqlSessionFactory == null){
getSqlSessionFactory = new GetSqlSessionFactory(); }
return getSqlSessionFactory; }
public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory;
}
第七步:DAO 业务处理层
在com.ibatis创建UserDaoTest.java
DAO 不想多说 大家直接参考代码:
public class UserDaoTest implements UserDaoTestImpl {
@SuppressWarnings(\"static-access\") public List SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().open Session(); List //xml方式查询 test = session.selectList(\"testid\"); //注解方式查询 // UserDaoTestImpl userDaoTestImpl = session.getMapper(UserDaoTestImpl.class); // test = userDaoTestImpl.getTest(); }catch (Exception e) { e.printStackTrace(); }finally{ session.close(); } return test; } public void insertvalue(Test test){ @SuppressWarnings(\"static-access\") SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory().openSession(); try{ session.selectOne(\"insertvalues\",test); }catch (Exception e) { e.printStackTrace(); }finally{ } session.close(); } } 到这里其实就可以完成的 但是我们的代码实现了接口 上面也有提到 我们可以用注解的方式来实现映射关系。注解方式就是其中一种 大家在测试的时候 可以使用xml 方式也可以使用注解的方式。 好吧 我们再努力一下下 看完下面的配置吧。 第八步:接口 在com.ibatis创建UserDaoTestImpl.java 接口中没有什么说的 其中有一样要注意的就是注解方式。 详细看代码: public interface UserDaoTestImpl { @Select(\" select * from test limit 1000\") List void insertvalue(Test test); } 在这里 我只实现了一个查询的注解方式 还有插入 更新 删除等操作 希望大家可以自己完成。不好意思 谢谢。 第九步:Servlet 实验 到这里 大家都可以写一个Servlet 来验证一下 你的MyBaits 是否能跑起来了 。 如果大家按照上面的实现的话 我可以保证百分百可以成功的。 Servlet 我就不贴代码了 这个你懂的。嘻嘻。 等你所有都完成之后 你会发现你的项目是这样的: 匆忙中 命名空间不好 包实现不规范 请大家多多担待 因为这个项目主要是介绍了MyBatis 的运用和实现。所以我在做这个文档中并没有什么规划 只是想尽快写一个测试用例。请大家多多包涵: 如果有什么问题的可以邮件:**************** 我们一起学 习 谢谢!!!! 因篇幅问题不能全部显示,请点此查看更多更全内容