美文网首页
ORM模型(Mybatis)

ORM模型(Mybatis)

作者: hlchengzi | 来源:发表于2019-03-03 11:17 被阅读0次

    ORM(对象映射关系):

    JDBC存在一些缺陷,所以以后就被ORM所取代(对象映射关系),就是数据库的表和简单的java对象的映射关系模型,通过这层映射可以迅速的把数据库的表转化为POJO。

    Hibernate

    HIbernate是建立在POJO和数据库表模型上的直接映射关系上。(若干POJO通过XML映射文件(或注解)提供的规则映射到数据库表上),是对JDBC的高度封装,我们已经不需要编写SQL语言

    hb.xml

    <?xml version="1.0" encoding= "UTF-8"?>
    <!--引入xml文件的头文件-->
     <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <!--引入hbiernate的映射文件的约束-->
     2 <hibernate-mapping package="com.aegop.mto.pojo">  
     3     <!-- 标识一个类的xml映射,name为类名,table为表名 -->  
     4     <class name="Street" table="Streets">  
     5         <!-- 主键的设置,generator标识主键生成方式,因为native便于数据库的移植所以.id之间包含的就是该表的主键 ,generator class=“”表示主键的生成-->  
     6         <id name="id" type="int">  
     7             <column name="Id"/>  
     8             <generator class="native"/>  
     9         </id>  
    10         <!-- 这里配了该类一个属性街道名称 name属性字段,column表示数据库对应列 -->  
    11         <property name="streetName" type="string" column="StreetName" />  
    12         <!-- 这里同上,写法不同而已 -->  
    13         <property name="streetPhone" type="string">  
    14             <column name="Streetphone" />  
    15         </property>  
    16         <!-- 下面同样是配该类一个属性,只是比较特殊而已! DisrtictId它是对应实体(数据库中主键,hibernate有缺省)如果加property-ref=DistrictId,效果是一样!此属性用在有联合主键的时候-->  
    17         <many-to-one name="district" class="District">  
    18             <column name="DistrictId"/>  
    19         </many-to-one>  
    20     </class>  
    21 </hibernate-mapping>  
    22  
    23 //当column不指定的时候默认是和name相同 
    24  
    25 //这里简单介绍,<property>简单类型的配置标签,<many-to-one>多对一的配置标签,以此xml为例,需要注意的是该xml是一个街道的实体映射,也就是说一个区可以包含多个街道,所以这里街道配置了和区的多对一关系! 
    26 //name="district";这个仍然代表该类字段,不同的是class="District",他的类型没有用type,而是class!因为不是一个简单数据类型. 
    27  
    28 //这个只是一个多对一的简单表述,其实一对一,多对多...等!道理是一样的 
    


    然后建立Hibernate的工厂对象(SessionFactory),用他来作为全局对象,产生Session接口,就可以操作数据库了。
    好处:消除了代码的映射规则,它全部的被分离到XML或者注解里面去配置。
    无需管数据库连接,也配置在XML文件里面了。
    一个会话中,不需要操作那么多对象,只要操作Session对象即可。
    关闭资源只需要关闭一个Session即可
    除此之外,它还提供级联,缓存,映射,一对多等功能,是全表映射,全表映射会造成性能低下,由于全表映射,不能优化sql

    MyBatis--半自动映射框架

    ORM就是将数据库的表和java对象的映射关系模型,它主要解决数据库可POJO对象的相互映射
    Mybatis需要手动匹配提供POJO,SQL和映射关系。需要提供的映射文件,包含以下三个部分1,SQL 2,映射规则 3,POJO需要自己编写SQL,但是MyBatis可以配置动态SQL。同时能解决Hibernate不能解决的问题,可以优化相对的提高了性能

    Mybatis的基本构成

    **SqlSessionFactoryBuilder(构造器):它会根据配置信息(XML)或者代码来生成SQlSessionFactory(工厂接口)
    **SqlSessionFactory:依靠工厂来生成SqlSession(会话)
    **SqlSession:是一个既可以发送Sql去执行并返回结果,也可以获取Mapper的接口
    **Sql Mapper:它是MyBatis新设计的组件,它是由一个java接口和XML文件(或者注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

    使用XML方式构建

    首先,在MyBatis中的XML分为两类,一类使基础配置文件,通常只有一个,主要配置一些最基本的上下文参数和运行环境;另一类是映射文件,它可以配置映射关系,sql,参数等信息。
    XML配置里面中包含获取数据库连接实列的数据源,决定事务范围和控制方式的事务管理器和映射器。

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

    可以看出Mybatis配置分为两类,一类是<environment>另一类是<mappers>
    <environment>:描述的是数据库
    <mappers>:元素代表引入的那些映射器
    最后定义一个映射文件,用xml实现映射器

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.xxc.dao.bookMapper">
        <!--SQL和规则映射都在XML里面进行了分离-->
        <select id="selectBookById" resultType="com.xxc.entity.Book">
            select * from Book where id=#{id}
        </select>
    </mapper>
    

    最后的测试代码:

    package com.xxc.dao;
    import com.xxc.entity.Book;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import java.lang.reflect.*;
    
    import java.io.InputStream;
    
    public class bookDao {
        public Book getBookById(int id){
            /**
             * SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成 工厂接口SqlSessionFacory()
             * SqlSessionFactory:依靠工厂来生成SqlSession(会话)
             * SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获得Mapper的接口.
             * SQL Mapper:它是Mybaitis新设计的组件,它是由java接口和XML文件(或者注解)构成的,需要给出对应的SQL和映射规则.它负责发送SQl去执行,并返回结果
             */
            //使用类加载器加载mybatis的配置文件,流文件加载
            InputStream inputStream=bookDao.class.getClassLoader().getResourceAsStream("config.xml");
            //构建sqlSession的工厂
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            //创建能执行映射文件中的sql
            SqlSession sqlSession=sqlSessionFactory.openSession();
    
            Book book=sqlSession.selectOne("com.xxc.dao.bookMapper.selectBookById",2);
            return book;
        }
    }
    

    也可以使用注解的方式,来实现sql语句的映射

    package com.xxc.dao;
    import com.xxc.entity.Book;
    import org.apache.ibatis.annotations.Select;
    
    public interface bookMapper {
    //    @Select("select * from Book where id=#{id}")
        Book selectBookById();
    }
    

    一般情况下,推荐使用xml引入xml可以相互引入,所以一般推荐使用xml的方式来创建映射器。

    InputStream inputStream=bookDao.class.getClassLoader().getResourceAsStream("config.xml");
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    

    SqlSession

    在Mybatis中,SqlSession是其核心接口。在Mybatis中有两个实现类,DefaultSqlSession和SqlSessionManager。前者是单线程使用的,而后者是在多线程的环境下使用的它的作用有两个:
    **获取Mapper
    **发送SQL给数据库
    **控制数据库事务
    有了SqlSessionFactory然后创建SqlSession

     SqlSession sqlSession=sqlSessionFactory.openSession();
    

    SqlSession发送SQL

    有了映射器,我们就可以发送SQl了,SqlSession当中封装了很多方法。上面的selectOne方法表示使用查询并且只返回一个对象,而参数只是一个String对象和一个Object对象

    还可以用Mapper接口发送SQL

    SqlSession还可以获取Mapper接口,通过Mapper接口发送SQL下所示:

     bookMapper bm = sqlSession.getMapper(bookMapper.class);
            Book book1 = bm.selectBookById();
    

    Mybatis中各个对象的生命周期

    SqlSessionFactoryBUilder

    SqlSessionFactoryBUilder的作用是用来创建SqlSessionFactory,在创建完成之后就失去了作用

    SqlSessionFactory

    可以被认为是一个数据库连接池,他的作用是创建SqlSession接口对象。因为MyBatis的本质就是对数据库的操作,所以SqlSessionFactoty的生命周期存在于整个Mybatis的应用当中。如果创建多个SqlSessionFactory,这样就不会利于对数据库资源的控制,也会导致数据库连接资源被耗光。所以在一般的应用当中我们希望SqlSessionFactory作为一个单例,让它在线程中被共享。

    SqlSession

    SqlSession就相当于一个连接(Connection对象),你可以在在一个事务当中执行多条sql语句,最后提交或者回滚所以它存在于一个事务请求当中,处理完整个请求后,我们应该关闭这条连接,让他归还给SqlSessionFactory,否则会消耗数据库资源导致系统瘫痪,所以要用
    try..catch..finally...语句来保证其正确关闭。

    Mapper

    Mapper只是一个接口,它有SqlSession所创建,所以它的最大生命周期就和SqlSession保持一致

    Mybatis配置

    typeHandler

    typeHandler是承担jdbcType和javaType之间的相互转换

    相关文章

      网友评论

          本文标题:ORM模型(Mybatis)

          本文链接:https://www.haomeiwen.com/subject/ddpyuqtx.html