MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了 google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框 架包括SQL Maps和Data Access Objects(DAO)
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的
JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和 原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 Mybatis不是一个完全的orm框架,Mybatis需要程序员自己写sql,但是也存在映射(输入参数映射,输 出结果映射),学习门槛mybatis比hibernate低;同时灵活性高,特别适用于业务模型易变的项目,使用范围广。
简单概括: 更加简化jdbc代码,简化持久层,sql语句从代码中分离,利用反射,将表中数据与java bean 属性一一 映射 即 ORM(Object Relational Mapping 对象关系映射) 使用范围:
在日常的开发项目中,如中小型项目,例如ERP,需求与关系模型相对固定建议使用Hibernate,对于需求不固定的项目,比如:互联网项目,建议使用mybatis,因为需要经常灵活去编写sql语句。总之,mybatis成为当下必须学习掌握的一个持久层框架。
属于持久层ORM框架
持久层: 讲内存中对象数据,转移到数据库中的过程持久层 Mybatis Hibernate Spring-jpa
ORM Object Relational Mapping 对象关系映射框架 类 表 属性 字段 对象 记录
半自化 自动化 Mybatis 半自动化 表需要手动进行设计 提供sql 依赖与数据库平台 优点:学习使用简单(基与原声jdbc封装),优化灵活,适合做互联网项目 Hibernate 自动化ORM框架 表可以通过框架自动创建 省略一些基本的sql 不依赖与数据库平台 缺点: 学生成本高,优化难度大,适合与传统框(OA|图书管理系统...),不适合做大型互联网项 目
官网: mybatis – MyBatis 3 | 简介
4.2.1. mybatis核心jar包 4.2.2. mybatis依赖jar包 4.2.3. 数据库驱动jar包 4.2.4. Build Path 选中所有的jar包,右键build path->add to build path 管理外部的jar资源 4.3. Mybatis配置文件 mybatis提供两种配置文件, 核心配置文件 mybatis-config.xml|mybatis.xml 与 SQL映射文件 mapper.xml
package com.yjxxt.pojo; import java.util.Objects; public class Dept { private int deptno; private String dname; private String loc; public Dept() { } public Dept(int deptno, String dname, String loc) { this.deptno = deptno; this.dname = dname; this.loc = loc; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Dept dept = (Dept) o; return deptno == dept.deptno && Objects.equals(dname, dept.dname) && Objects.equals(loc, dept.loc); } @Override public int hashCode() { return Objects.hash(deptno, dname, loc); } @Override public String toString() { return "Dept{" + "deptno=" + deptno + ", dname='" + dname + '\'' + ", loc='" + loc + '\'' + '}'; } }
package com.yjxxt.pojo; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.util.Map; public class Class002_SelectMethod { public static void main(String[] args) throws IOException { //1.获取会话 SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); //2.执行sql //T selectOne("namespace.id") 执行指定的sql,查到对应类型的结果,如果没有查询到返回null //T selectOne("namespace.id",入参) 执行指定的sql,同时为SQL语句传递入参,查到对应类型的结果,如果没有查询到返回null Dept dept = session.selectOne("com.yjxxt.mappers.DeptMapper.queryDeptByNo",40); System.out.println(dept); //selectMap("namespace.id","作为key的字段名") 执行指定的sql,返回Map集合,查询到的一条数据作为Map集合中的一个键值对,指定的字段值做key,resultType结果作为value,如果没有查到数据返回空的MapMapmap = session.selectMap("com.yjxxt.mappers.DeptMapper.queryAll","dname"); //System.out.println(map); //selectMap("namespace.id",入参,"作为key的字段名") Map map = session.selectMap("com.yjxxt.mappers.DeptMapper.queryDeptByNo",99,"deptno"); System.out.println(map); //selectList("namespace.id") 执行sql,查询到的多个结果返回List,如果没有查到返回空的List //selectList("namespace.id",入参) //3.关闭回话 session.close(); } }
package test; import com.yjxxt.pojo.Dept; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; /* 测试类: 1.加载核心配置文件 2.构建 SqlSessionFactory 会话工厂 3.根据工厂构建会话SqlSession 4.执行sql,得到结果 5.处理结果 6.关闭会话 环境搭建步骤: 1.下载jar包,在项目中配置集成 Mybatis核心jar包 Mybatis依赖jar包 数据库驱动包 2.定义Mybatis核心配置文件 3.定义SQL映射文件 4.测试类,Mybatis的使用 */ public class Class01_Dept { public static void main(String[] args) throws IOException { //1.加载核心配置文件 InputStream in = Resources.getResourceAsStream("mybatis.xml"); //2.构建 SqlSessionFactory 会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.根据工厂构建会话SqlSession SqlSession session = factory.openSession(); //4.执行sql,得到结果 Listdates = session.selectList("mappers.DeptMapper.queryAll"); //5.处理结果 dates.forEach(System.out::println); //6.关闭会话 session.close(); } }
mybatis提供两种配置文件, 核心配置文件 mybatis-config.xml|mybatis.xml 与 SQL映射文件 mapper.xml 4.3.1. 核心配置文件添加 是一个xml文件,命名无要求,位置无要求,一般成为mybatis.xml,放在src路径下 4.3.1.1. dtd 4.3.1.2. mybatis.xml文件配置内容
注意:不要忘记mybatis核心xml文件中的mapper配置 4.4. 测试 5. Mybatis配置文件详解 5.1. 核心配置文件 1.configuration 配置文件的根元素,所有其他的元素都要在这个标签下使用(dtd文件规定) 2.environments default="environment" 用于管理所有环境, 并可以指定默认使用那个环境,通过defualt属性来指定 3.environment 用来配置环境,id属性用于唯一标识当前环境 4.transactionManager type="JDBC" 用户配置事务管理器 type属性 用来指定Mybatis采用何种方式管理事务 JDBC : 表示采用与原生JDBC一致方式管理事务 MANAGED: 表示讲事务管理交给其他容器进行, Spring 5.dataSource type="POOLED" select * from t_user public class TestUser { public static void main(String[] args) throws IOException { //1.加载mybatis全局核心配置文件 InputStream is = Resources.getResourceAsStream("mybatis.xml"); //2.构建SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //3.通过工厂获取会话SqlSession SqlSession session = factory.openSession(); //4.通过session调用方法执行查询 //selectList() 查到的数据返回一个list集合,没查到返回空的list //selectList 的第一个参数为statement: 命名空间+id List list = session.selectList("com.yjxxt.mappers.UserMapper.queryAll"); System.out.println(list); //5.关闭会话资源 session.close(); } }
5.1. 核心配置文件 1.configuration 配置文件的根元素,所有其他的元素都要在这个标签下使用(dtd文件规定) 2.environments default="environment" 用于管理所有环境, 并可以指定默认使用那个环境,通过defualt属性来指定 3.environment 用来配置环境,id属性用于唯一标识当前环境 4.transactionManager type="JDBC" 用户配置事务管理器 type属性 用来指定Mybatis采用何种方式管理事务 JDBC : 表示采用与原生JDBC一致方式管理事务 MANAGED: 表示讲事务管理交给其他容器进行, Spring 5.dataSource type="POOLED" select * from t_user public class TestUser { public static void main(String[] args) throws IOException { //1.加载mybatis全局核心配置文件 InputStream is = Resources.getResourceAsStream("mybatis.xml"); //2.构建SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //3.通过工厂获取会话SqlSession SqlSession session = factory.openSession(); //4.通过session调用方法执行查询 //selectList() 查到的数据返回一个list集合,没查到返回空的list //selectList 的第一个参数为statement: 命名空间+id List
三个查询方法 selectList("命名空间.id") 用户查询多条数据情况,返回一个List集合, 没有查到数据返回空集合,不是 null selectOne("命名空间.id") 用于查询单条数据,返回一个数据, 如果没有查到返回null selectMap("命名空间.id",key的字段名) 用于查询多条记录情况, 返回Map集合, 需要指定那个属性 作为key, sql查询结果作为value,指定的字段值作为key, 如果查不到, 返回一个空map集合,不是null
package com.yjxxt.test; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.yjxxt.pojo.User; public class UserTest { 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 session = factory.openSession(); //4.操作 //1)selectList("namespace.id") 用于查询多条数据,返回一个list集合,如果没有查询到 任数据,返回空集合,不是null Listlist = session.selectList("com.yjxxt.mappers.UserMapper.queryAll"); System.out.println(list); //2)selectOne("namespace.id") User user = session.selectOne("com.yjxxt.mappers.UserMapper.queryById"); System.out.println(user); //3)selectMap("namespace.id","执行作为key的属性") Map map = session.selectMap("com.yjxxt.mappers.UserMapper.queryAll", "id"); System.out.println(map); //5.关闭session session.close(); } }