mybatis系列一:入门篇

来源:互联网 发布:如何屏蔽淘宝短信 编辑:程序博客网 时间:2024/05/19 20:19

环境:mybatis3.2.2    jdk1.7

一 MyBatis介绍

     MyBatis本是apache的一个开源的项目,原来称为iBatis, 2010年这个项目由apache software Foundation迁移到了google code,并且改名为MyBatis。 MyBatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架,是一个SQL映射框架。MyBatis消除了几乎所有的JDBC代码。MyBatis使用简单的XML或注解用于配置和映射,将接口和Java的POJOs (Plan Old Java Objects.普通的Java对象)映射成数据库中的记录。简单地说,MyBatis将SQL语句从程序里剥离出来,放到配置文件,并将查询结果和持久化类的属性通过配置文件做了映射,相对于Hibernate ORM框架,它属于一种“半自动化”的ORM实现。

二  MyBatis与Hibernate比较

    MyBatis与Hibernate都属于ORM框架,为数据层提供持久化操作的支持。相对于Hibernate的ORM, MyBatis属于“SQL-Mapping"的ORM实现。在以后的开发中,到底哪一个框架更适合业务系统的开发?下面从几个方面对Hibernate和Mybatis做一下比较,也为选择框架提供一些参考依据。

    (1)相对MyBatis,Hibernate的内容较多,学习难度高于MyBatis。MyBatis更接近于JDBC的开发,容易掌握。

    (2) Hibernate开发者不需要关注SQL的生成与结果的映射,而MyBatis需要手动写SQL语句。

    (3) Hibernate与具体数据库的关联只需要在XML中配置即可,所有的HQL语句与具体使用的数据库无关,移植性好。而MyBatis直接使用SQL语句,不同数据库可能会有差异,可移植性差。

    (4)由于直接使用SQL,所以MyBatis的灵活性更高,而且MyBatis的执行效率比Hibernate略高一些。

三 MyBatis的优缺点及其适用场合

   1.MyBatis的优点

    MyBatis小巧,简单易学,通过文档和源代码可以比较轻松地掌握它的设计思路和实现。其优点如下。

    (1)简单且功能强大。通过SQL映射文件和SqlSession能够实现数据持久层的功能,与JDBC相比减少了很多的代码量。

    (2)开发人员能够完全控制所执行的SQL语句,尤其适用于多表复杂查询。

    (3)容易维护和修改。SQL语句写在配置文件里,只要修改配置文件即可。

   2.MyBatis的缺点

    MyBatis属于半自动化的ORM,需要开发人员掌握SQL语句的编写。由于要写SQL语句,不同的数据库需要重新修改SQL,因此MyBatis的数据库移植性不好。

   3.MyBatis的适用场合

    如果不需要太多复杂的功能,而需要一个足够灵活的DAO层解决方案,或者对性能的要求很高,那么MyBatis将是不错的选择。

    那么什么情况下不适合选择MyBatis?

    (1)当希望对象的持久化对应用程序完全透明时,可以使用对象/映射方案,如Hibernate。

    (2)当数据库有移植需求,或者需要支持多种数据库时。

    (3)当应用程序需要完全动态的SQL时,如查询的字段都需要动态生成时。

    (4)当没有使用关系数据库时,或者使用的不是真正的关系数据库时。


四  入门案例

1.   建表

这里以大学里面的系表和学生表为例      系和学生是一对多的关系

CREATE TABLE department(    deptId SMALLINT PRIMARY KEY,    departName VARCHAR(20) NOT NULL,    address VARCHAR(20));CREATE TABLE student(    stuId INT PRIMARY KEY AUTO_INCREMENT,    stuName VARCHAR(20) NOT NULL,    gender VARCHAR(2),    age SMALLINT,    address VARCHAR(200) DEFAULT '学生宿舍',    deptIdd SMALLINT,    FOREIGN KEY(deptIdd) REFERENCES department(deptId))AUTO_INCREMENT=100;INSERT INTO department VALUES (10,'计算机系','计算机楼302');INSERT INTO department VALUES (11,'艺术系','艺术楼211');INSERT INTO department VALUES (12,'经管系','商学院911');INSERT INTO department VALUES (13,'工程系','工程楼301');INSERT INTO department VALUES (14,'土木系','建筑楼355');--INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王燕','女',18,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张栋','男',21,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('李波','男',21,DEFAULT,11);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('陈建','男',19,DEFAULT,11);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王江洪','男',25,DEFAULT,12);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('潘将','男',24,DEFAULT,13);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','男',22,DEFAULT,14);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','女',20,DEFAULT,10);--INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘大海','男',28,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘德华','男',31,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周润发','男',41,DEFAULT,11);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张学友','男',37,DEFAULT,11);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周星驰','男',42,DEFAULT,12);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘亦菲','女',24,DEFAULT,13);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('胡歌','男',32,DEFAULT,14);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('范冰冰','女',20,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('杨幂','女',26,DEFAULT,14);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘涛','女',27,DEFAULT,13);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周迅','女',21,DEFAULT,13);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('古力娜扎','女',19,DEFAULT,10);INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('黑山老妖','妖',99,DEFAULT,12);

2   建立java工程,导入相关jar包

MyBatise的官方网址是http://code.google.com/p/mybatis需要的jar包都可以从官方网站上下载得到。推荐下载mybatis-3.2.2.zip。

    注意查看根目录(mybatis-3.2.2)和lib目录。根目录下存放着mybatis-3.2.2.jar包,MyBatis自身的接口和类就在这个jar包中;lib目录下是一些第三方的类库。为了方便以后的学习和开发,可以把MyBatis的源码下载下来,下载主页上有个source标签,根据提示的步骤可以下载下来。目前的下载地址是http://repol.maven.org/maven2/org/mybatis/mybatis,选择3.2.2目录,就可以找到MyBatis对应的源码文件mybatis-3 .2.2-sources.jar。

这里我们需要的jar包如图所示:



3.  编写MyBatis核心配置文件

    XML配置文件包含对MyBatis系统的核心设置,包括获取数据库连接实例的数据源和决定如何控制事务的事务管理器。在工程中的src目录下添加MyBatis配置文件(可在mybatis- 3.2.2根目录下找到mybatis-3.2.2.pdf,里面也有示例配置),名称可取任意值,在这里命名为“mybatis-config.xml”。下面是一个简单的示例,连接mysql数据库。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"    "mybatis-3-config.dtd"><configuration><typeAliases></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/schooldb" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><mappers></mappers></configuration>

    其中的几个常用元素的作用如下。

    (1)  environments元素:用于配置多个数据环境,这样可以映射多个数据库信息。采用default来指定默认使用哪个数据库环境。environrnent则是每个数据库环境的具体配置,包括数据连接信息和事务管理信息。

    在MyBatis中有两种事务管理器类型(即type="[JDBC|MANAGED]"):

Ø   JDBC:直接使用了JDBC控制事务。它依赖于从数据源得到的连接来管理事务范围。

Ø   MANAGED: MyBatis自己不负责控制事务,它会让容器来管理事务的整个生命周期(如通过Spring或JavaEE应用服务器)。

    数据源类型有三种:UNPOOLED、POOLED、JNDI。

Ø   UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。

Ø   POOLED:采用连接池以避免创建新的连接实例时必要的初始连接和认证时间。这是一种当前Web应用程序快速响应请求的很流行的方法。

Ø   JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器。容器可以集中或在外部配置数据源,MyBatis通过JNDI获取数据源。

   (2)mappers元素:包含所有mapper的列表,告诉MyBatis到哪里去找SQL语句。mapper主要是定义SQL映射文件。

  (3)  typeAliases元素,用于配置别名

另外:建议把dtd(文档类型定义)文件与核心配置文件放在一起,这样就可以方便的在配置文件里面按快捷键,显示提示信息,如图所示。


4.   建立实体类

================StudentEntity.java======================================

package com.obtk.entitys;public class StudentEntity implements java.io.Serializable {private static final long serialVersionUID = 4897498920955479723L;private Integer stuId;private String stuName;private String gender;private Integer age;private String address;private Integer deptIdd;public StudentEntity() {}public StudentEntity(String stuName, String gender,int age, String address) {this.stuName = stuName;this.gender = gender;this.age = age;this.address = address;}public Integer getStuId() {return this.stuId;}public void setStuId(Integer stuId) {this.stuId = stuId;}public String getStuName() {return this.stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public String getGender() {return this.gender;}public void setGender(String gender) {this.gender = gender;}public void setAge(Integer age) {this.age = age;}public Integer getAge() {return age;}public String getAddress() {return this.address;}public void setAddress(String address) {this.address = address;}public void setDeptIdd(Integer deptIdd) {this.deptIdd = deptIdd;}public Integer getDeptIdd() {return deptIdd;}}
======================UserEntity.java=====================

package com.obtk.entitys;import java.io.Serializable;public class UserEntity implements Serializable{private static final long serialVersionUID = 1034088741557780953L;private int userId;private String userName;private String passWord;private String email;public UserEntity() {}public UserEntity(String userName, String passWord, String email) {super();this.userName = userName;this.passWord = passWord;this.email = email;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}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 getEmail() {return email;}public void setEmail(String email) {this.email = email;}}
5.  建立映射文件

==============UserMapper.xml========

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "mybatis-3-mapper.dtd"><mapper namespace="user"><select id="countAll" resultType="int">select count(*) from users</select></mapper>
其中namespace表示命名空间,不能重复。

把dtd文件和mapper文件放一起,如图所示:

6.   与核心配置文件进行关联


7   编写测试代码

package com.obtk.test;import java.io.IOException;import java.io.Reader;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class TestCnt {public static void main(String[] args) {Reader reader=null;SqlSessionFactoryBuilder builder=null;SqlSessionFactory factory=null;SqlSession session=null;try {//1.加载配置文件reader=Resources.getResourceAsReader("mybatis-config.xml");//2.得到工厂的创建对象builder=new SqlSessionFactoryBuilder();//3.得到工厂对象factory=builder.build(reader);//4.得到sessionsession=factory.openSession();//5.执行语句int cnt=session.selectOne("user.countAll");System.out.println("用户数:"+cnt);} catch (IOException e) {e.printStackTrace();}finally{if(session!=null){session.close();}}}}
 SqlSession相当于JDBC中的Connection,在使用前获取,然后执行SQL语句,在使用后关闭。SqlSession对象包含所有执行SQL操作的方法。可以用SqlSession实例来直接执行已映射的SQL语句。





原创粉丝点击