ORM模型(Mybatis)

ORM(对象映射关系):

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

Hibernate

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

hb.xml



   

 2   
 3       
 4       
 5           
 6           
 7               
 8               
 9           
10           
11           
12           
13           
14               
15           
16           
17           
18               
19           
20       
21   
22  
23 //当column不指定的时候默认是和name相同 
24  
25 //这里简单介绍,简单类型的配置标签,多对一的配置标签,以此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配置里面中包含获取数据库连接实列的数据源,决定事务范围和控制方式的事务管理器和映射器。




    
        
            
            
                
                
                
                
            
        
    
    
        
    


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




    
    

最后的测试代码:

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))