ORM模型(Mybatis)

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之间的相互转换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容