MyBatis
回顾JDBC
- 注册驱动
- 获取连接
- 获取数据库操作对象
- 执行SQL,操作数据库
- 处理结果集
- 关闭连接
Connection可以获得PreparedStatement或者Statement
ResultSet是SQL语句执行后返回的对象
PreparedStatement和Statement是用来执行SQL语句的对象
两者的区别:
PreparedStatement对SQL语句做了预编译,很好的解决了SQL注入的问题。
Statement是单纯的对字符串进行拼接,会产生SQL注入的问题
简介
Def: MyBatis是一个优秀的持久层的框架,支持定制化SQL语句,存储过程以及高级映射,大大简化了JDBC的笨重的代码。
MyBatis可以使用XML配置文件或者注解的方式来配置和映射原生类型、接口和pojo(Plain Object Java Object)
持久层是什么?持久层是一个将应用中产生的数据保存到数据库的过程
思路:导入依赖—》编写代码—》测试
1 | <dependency> |
入门
MyBatis中最重要的三个类
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
每个基于MyBatis的应用都是以一个SqlSessionFactory实例为核心的。这个实例需要通过SqlSessionFactoryBuilder加载配置文件获得。这个配置文件可以通过两种方式获得,第一种是以XML文件的形式存在,第二种是在java代码对象的形式存在
构建SqlSessionFactory
mybatis-config.xml配置构建SqlSessionFactory所需要的参数
1 |
|
在java中加载配置文件,通过SqlSessionFactoryBuilder构建SqlSessionFactory实例
1 | String resource="mybatis-config.xml"; |
通过java代码配置不推荐,略
构建SqlSession
SqlSession,通过此对象获得接口的映射器实例,该映射对象对标JDBC中接口的实现类
1 | //开启一个sqlSession对象,默认关闭自动提交事务 |
映射SQL语句
通过XML配置文件的方式和接口做绑定,实现接口方法
1 |
|
- mapper标签的namespace属性指向被绑定的接口
- 标签内书写SQL语句,id为接口中的方法名
- select标签实现select方法
- insert标签实现insert方法
- update标签实现update方法
- delete标签实现delete方法
通过注解的方式实现SQL映射
1 |
|
选择何种方式实现SQL映射,取决于自身。
但是如果SQL复杂的情况下,尽量不要使用注解开发,使用XML的方式去做SQL映射
三个对象的作用域(Scope)
- SqlSessionFactoryBuilder
该对象就一个作用,通过读取一些配置获取SqlSessionFactory实例对象。
我们没有理由一直保留它,因为SqlSessionFactory将被保存在全局作用域中,以保证所有的XML解析资源可以被释放给做其他事情,所以它的作用域应该是局部变量
- SqlSession
该对象就一个作用,通过getMapper方法获取映射器实例。
每个线程都应该有它自己的SqlSession对象,因为该对象不是线程安全的,因此它是不能被共享的,所以它的最佳作用域是局部变量。
在web框架中,可以将其放到request的作用域中,返回一个响应前,关闭SqlSession对象,这个关闭操作很重要
- SqlSessionFactory
该对象就一个作用,通过openSession方法获取SqlSession对象。
因为SqlSession对象是线程不安全的,所以每次查询数据库都需要一个新的SqlSession对象,既然SqlSessionFactoryBuilder的作用域为局部变量,那么在我们第一次创建出来SqlSessionFactory对象的时候,就可以将其保存在全局作用域中,下次就不需要再创建SqlSessionFactoryBuilder对象了,所以SqlSessionFactory的最佳作用域是全局唯一变量。