zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    Spring Boot 使用mysql数据库
    Nginx开启Gzip压缩大幅提高页面加载速度
    构建微服务:Spring boot 入门篇
    Python时间戳和日期的相互转换
    【Mongodb】aggregate限制返回字段
    MongoDB的skip,limit,sort执行顺序
    结对-结对四则运算生成器-最终程序
    C# List分页
    c# List的排序
    C#并行编程-Parallel
  • 原文地址:https://www.cnblogs.com/wangshen31/p/7719624.html
Copyright © 2011-2022 走看看