Java小白的数据库爱情(五)mybatis 入门环境搭建
Mybatis不是一个完全的orm框架,Mybatis需要程序员自己写sql,但是 也存在映射(输入参数映射,输出结果映射),学习门槛mybatis比 hibernate低;同时灵活性高,特别适用于业务模型易变的项目,使用 范围广。
简单概括: 更加简化jdbc代码,简化持久层,sql语句从代码中分离,利用反射, 将表中数据与java bean 属性一一映射 即 ORM(Object Relational Mapping 对象关系映射)
使用范围: 在日常的开发项目中,如中小型项目,例如ERP,需求与关系模型相对 固定建议使用Hibernate,对于需求不固定的项目,比如:互联网项 目,建议使用mybatis,因为需要经常灵活去编写sql语句。总之, mybatis成为当下必须学习掌握的一个持久层框架。
从上面我们可以看到mybatis的功能架构分为三层:
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来 操纵数据库。接口层接收到调用请求就会调用数据处理层来完成具体 的数据处理。
**数据处理层:**负责具体的SQL查 找、SQL解析、SQL执行和执行结果映 射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
**基础支撑层:**负责最基础的功能支撑,包括连接管理、事务管理、配 置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基 础的组件。为上层的数据处理层提供最基础的支撑
Mybatis特点
属于持久层ORM框架
-
持久层: 讲内存中对象数据,转移到数据库中的过程持久层 Mybatis Hibernate Spring-jpa
-
ORM Object Relational Mapping 对象关系映射框架
类 表
属性 字段
对象 记录
-
半自化 自动
Mybatis 半自动化
表需要手动进行设计
提供sql
依赖与数据库平台
优点:学习使用简单(基与原声jdbc封装),优化灵活,适合做 互联网项目
Hibernate 自动化ORM框架
表可以通过框架自动创建
省略一些基本的sql
不依赖与数据库平台
缺点: 学生成本高,优化难度大,适合与传统框(OA|图书管 理系 统…),不适合做大型互联网项目
Mybatis环境搭建
官网: https://mybatis.org/mybatis-3/zh/index.html
- 新建Java项目
新建Java项目,导入核心java包与mybatis依赖jar包
- 导入jar包
- mybatis核心jar包
- mybatis依赖jar包
- 数据库驱动jar包
- Build Path 选中所有的jar包,右键build path->add to build path 管理外部的jar资源
Mybatis配置文件
mybatis提供两种配置文件, 核心配置文件
mybatisconfig.xml|mybatis.xml 与 SQL映射文件mapper.xml
核心配置文件添加
是一个xml文件,命名无要求,位置无要求,一般成为mybatis.xml,放在src 路径下
dtd 头约束
<?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 | 配置文件根目录,所有其他的元素都要在这个标签下使用(dtd文件规 定) |
environments | 用于管理所有环境, 并可以指定默认使用那个环境,通过defualt属性来 指定 |
transactionManager | 用户配置事务管理器 |
dataSource | 用于配置数据源, 设置Myabtis是否使用连接池技术,并且配置数据库的 四个连接参数 |
property | 用于配置数据库连接参数 (driver,url,username,password) |
mappers | 用于配置扫描sql映射文件,我们需要告诉 MyBatis 到哪里去找到定义 SQL 映射语句。 最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 |
<?xml version="1.0" encoding="UTF-8" ?>
<!--dtd: 规定mybatis核心配置稳定的定义要求:内容,位置,规范...-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--基础核心配置 : 根元素-->
<configuration>
<!--使用的环境: 定义事务管理,数据库连接,连接参数配置...-->
<!--
environments: 可以定义多个环境environment
default : 选择使用哪一个环境,关联environment的id 属性值
-->
<environments default="dvd">
<!--定义环境基础配置: id: 表示唯一 不可重复-->
<environment id="dvd">
<!--事务管理: type="JDBC" 使用JDBC的事务管理机制-->
<transactionManager type="JDBC"/>
<!--数据源的配置: type="POOLED" 选择使用数据库连接池管理连接 -->
<dataSource type="POOLED">
<!--配置连接参数 name:配置的内容 value:数据值 -->
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="SCOTT"/>
<property name="password" value="TIGER"/>
</dataSource>
</environment>
</environments>
<!--配置sql映射文件的位置-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
SQL映射文件的添加
配置映射文件
标签名 | 作用 |
---|---|
parameterType | 入参类型 |
resultType | 结果类型 |
<?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">
<!--
SQL映射文件 mapper 根元素映射配置
namespace: 命名空间 必填
在当前项目下是唯一的,唯一标识,标识sql映射文件的唯一
任意定义,内容没有要求
一般定义为:当前sql映射文件的包名.文件名 com.xxxx.mappers.DeptMapper
-->
<mapper namespace="com.xxxx.mappers.DeptMapper">
<!--
select : 定义查询语句
id : 是当前命名空间下的sql语句的唯一标识,当前命名空间下不能重复
resultType : 结果类型
常用的结果类型: 基本数据类型 包装类型 String Date Javabean List Map.
parameterType : 入参类型
常用的入参类型: 基本数据类型 包装类型 String Date Javabean List 数组 Map
-->
<select id="queryAll" resultType="String" >
select dname from dept
</select>
<select id="queryAllDept" resultType="com.xxxx.pojo.Dept" >
select * from dept
</select>
<!--
测试sql语句传递参数
sql语句中的占位符号#{deptno}
占位符号的名字可以随意定义
-->
<select id="queryDeptById" parameterType="int" resultType="com.xxxx.pojo.Dept" >
select * from dept where deptno = #{deptno}
</select>
</mapper>
创建工厂使用Mapper中的增删改查方法
简单步骤:
- 创建SqlSessionFactoryBuilder对象
- 加载SqlMapConfig.xml配置文件
- 创建SqlSessionFactory对象
- 创建SqlSession对象
- 通过SqlSession对象调用Mapper中的增删改查方法
案例
public class DeptTest {
public static void main(String[] args) throws IOException {
//1.加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//2.构建SqlSessionFactory对象实例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.根据工厂获取会话 SqlSession
SqlSession session = factory.openSession();
//4.执行sql语句
//selectList("命名空间.id") 执行某一个sql做查询,返回一个List集合 com.xxxx.mappers.DeptMapper.queryAll
List<String> list = session.selectList("com.xxxx.mappers.DeptMapper.queryAll");
list.forEach(System.out::println);
List<Dept> list2 = session.selectList("com.xxxx.mappers.DeptMapper.queryAllDept");
list2.forEach(System.out::println);
//5.关闭
session.close();
测试有条件的Sql语句 ->DeptMapper2.xml
selectOne("命名空间.id") 执行指定的sql,返回一个结果
selectOne("命名空间.id",sql语句的实参)
selectList("命名空间.id") 执行指定的sql,返回一个List集合 (集合中存储的数据的类型->resultType)
selectList("命名空间.id",sql语句的实参)
selectMap("命名空间.id","返回的map集合中,作为key的字段名") 执行指定的sql,返回一个存储的数据的Map集合,默认键值对的value查询的数据resultType
selectMap("命名空间.id",Object类型的sql语句的实参,"返回的map集合中,作为key的字段名")