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