Mybatis介绍

参考自极客视频还有博客:http://blog.csdn.net/zxc_helloworld/article/details/78037284

这是个开源的持久层框架。有几个特点:第一个是轻;第二个是将sql语句和代码分离;第三个是很好地支持java中复杂数据的映射;第四个是,我们用jdbc的时候要去拼凑sql语句,这种方式是不安全的,也不方便,mybatis这里用的是动态sql技术来代替这种拼凑sql语句。

使用的时候要导入相关jar包还有MySQL相关jar包,如果要输出sql语句的话,还要配置位置文件,就要加入log4j.properties这个文件。

在mybatis中有两种配置文件,一种是基本配置文件,一种是mapper配置文件也叫映射。通过配置文件我们可以建立SqlSessionFactory和SqlSession

下面介绍一下mybaits的工作流程:

  1.读取基本配置文件,这里包含着连接数据库的信息;

  2.然后就会生成SqlSessionFactory,这是个sqlsession的工厂,用来建立和数据库之间的会话。

  3.有了SqlSessionFactory之后就可以建立SqlSession,这个东西的目的是用来执行sql语句,它通过调用mybatis中各种各样的api函数来执行sql语句。

  4.sql语句则放在另一个配置文件里,就是我们的MAP配置文件(MyBatis的开发中一般一个表设一个map配置文件,方便管理)。

  5.返回结果。

  6.关闭sqlsession。

基本配置文件:

(一般可以找现成的MyBatis配置文件,比如上Github上找)

基本配置文件大概由两部分组成,一部分是连接数据库的信息,另一部分是map配置文件的位置。

基本配置文件有两个元素,一个是

<environments defaults="development">

  <environment id="development">

..

  </environment>

<environments>

这里边叫环境,里面封装的就是连数据库的相关信息。 环境里面会有多个environment,每个environment代表的是连接的一种数据库,里面包含连接这种数据库的所有信息。

还有一个元素就是

<mappers>

  <mapper resource="map/MapUser.xml"></mapper>

  <mapper resource="map/MapVisit.xml"></mapper>

</mappers>

这里包含的是映射配置文件的映射信息。

关于sqlsessionfactory和sqlsession的生命周期:

  sqlsessionfactory的生命周期是程序级的,一般的程序只有一个factory,程序开始它会建立,程序结束它会消亡。

  sqlsession的生命周期是过程级的, 在一个方法中它会建立,方法结束它会销毁。

sqlsession和sqlsessionfactory的建立代码:

  SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);    //reader是个输入流,这个流就是基本配置的文件路径。

  SqlSession session = sqlMapper.openSession(); 

Map文件:

mybatis的sql和代码之所以能够分开,靠的就是Map文件,Map文件中包含的是全部的sql代码,那么map文件怎么被找到呢,是在基本配置文件中来引用它的,这种引用的方式有三种:

mappers>用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件。

在<mappers>中有两个子元素 1.<package>  2.<mapper>

1.第一种配置映射文件的方式

<package name="映射文件所在包名">

注意:这种方式必须保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。

<package name="cn.sdut.dao"/>

2.第二种方式:<mapper resource="">

这种方式不用保证同接口同包同名。例如:<mapper resource="cn/sdut/pojo/PersonMapper.xml"/> 

3.第三种方式:<mapper url="文件路径名">

这种方式我所了解的就是这样用: 

<mapper url="file:E:/Study/myeclipse/_03_Test/src/cn/sdut/pojo/PersonMapper.xml"/>

采用的是java的url技术,这样你的文件可以在文件上,网络等都可以

4.第四种方式:<mapper class="接口路径">

这种方式和第一种方式要求一致,保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。例如:<mapper class="cn.sdut.dao.IPersonDao"/>


但是对于接口方法使用注解方式来说,使用这种方式没有xml文件都可以,更别提同包同名什么的限制条件了。

现在来看看map文件是什么样的,来看一个简单的map文件里的sql语句:

<select id="findById" parameterType="int" resultType="jike.book.pojo.JiKeUser">
    select * from JikeUser where id=#{id}
</select>

这里我们看到的是一个select语句,这里先是一个select元素来包含这个语句。     元素的主题部分就是我们的select的sql语句,这个语句基本和我们正常的sql语句差不多,但是就是在id=#{id}这不太一样,这里#后面的内容代表的是一个参数,参数的名称叫id。  这里就可以类比jdbc的PreparedStatement接口的那个     ?    ,就是先准备一个sql语句,完了往里面填参数。

这里的select元素有三个属性,一个是id属性,这是找到这条sql语句的标志;      还有就是parameterType属性,它的作用是确定这个参数的类型,比如这里是int型;         还有就是resultType属性,它的作用就是确定返回值的类型,可以是map,也可以是java中的基本数据类,也可以是对象。

来看看查询的代码:(首先我们的数据库的表叫JiKeUser,表中有三个四个键,主键id,键name,键password,在Java中也有它的对应的实体类JiKeUser)

(这里顺便科普一下,POJO类就是数据库中表或数据对应的实体类)

JiKeUser temp = session.selectOne("findById",1);//调用session的查询方法,第一个参数是那个sql语句的id,第二个是给sql语句的参数。
System.out.println("name="+temp,getUserName());
session.close();//关闭session

看个完整的例子:

public static void main(String[] args) {
    String resource = "jike/book/map/MyBatisConfig.xml";
    Reader reader = null;
    SqlSession session =null;
    try {
        reader = Resources.getResourceAsReader(resource);
    } catch(IOException e) {
        e.printStackTrace();
    }
    SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder.build(reader);
    session = sqlMapper.openSession();
    JiKeUser temp = session.selectOne("findById",1);
    System.out.println("name="+temp.getUserName());
    session.close();
}
原文地址:https://www.cnblogs.com/wangshen31/p/7719624.html