-
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 | 简介
8.5.5导入jar包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
环境搭建核心配置文件
定义JavaBean类
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,如果没有查到数据返回空的MapMap map = 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;
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,得到结果
List dates = session.selectList("mappers.DeptMapper.queryAll");
//5.处理结果
dates.forEach(System.out::println);
//6.关闭会话
session.close();
}
}
8.5.6Mybatis配置文件
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(); } }
8.5.7Mybatis配置文件详解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
List list =
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();
}
}



