MyBatis简介

1.对于MyBatis的理解

MyBatis本是apache的一个开源项目iBatis,后迁移google code,并改名MyBatis。
MyBatis是一个优秀的持久层框架,它对JDBC的操作过程进行封装,让开发者只需关注SQL本身,而不用去处理JDBC繁杂的过程代码,例如:注册驱动、创建connection、statement、结果集检索等(JDBC--Java Database Connectivity:Java数据库连接,是Java语言中用来规范客序任何来访问数据库的应用程序接口,提供诸如查询和更新数据库中数据的方法。目标:一次编译,到处运行
MyBatis通过xml或注解的方式将要执行的各种statement(statement/preparedStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射成java对象并返回。(映射--简单来说就是把一个数据库表里的字段和一个java类里的属性对应起来,让程序知道类里的属性应该对应数据库表里的哪个字段。跟数学中的一对一映射关系是一个意思,就是通过一个键来存取值,键可以是任何类型

总结:MyBatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码,解决JDBC将结果集封装为java对象的麻烦。
MyBatis架构图
1)mybatis-config.xml是MyBatis的核心配置文件,通过其中的配置可以生成SqlSessionFactory,也就是SqlSession工厂
2)基于SqlSessionFactory可以生成SqlSession对象
3)SqlSession是一个既可以发送SQL去执行,并返回结果,类似于JDBC中的Connection
对象,也是MyBatis中至关重要的一个对象
4)Executor是SqlSession底层的对象,用于执行SQL语句
5)MapperStatement对象也是SqlSession底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的结果映射成相应的结果)

2.为什么要使用MyBatis

1)MyBatis对JDBC进行封装,可以简化JDBC代码
2)MyBatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率
3)MyBatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译
4)对查询SQL执行后返回的ResultSet对象,MyBatis会帮我们除了,转换成Java对象
总结:JDBC中所有的问题(代码繁琐、有太多重复代码、需要操作太多对象、释放资源、对结果的处理太麻烦等),在MyBatis框架中几乎都得到了解决!

2.MyBatis的入门

1.准备数据,创建库和表

创建bodydb库,emp表,并插入若干条记录

-- 1、创建数据库 bodydb数据库
create database if not exists bodydb charset utf8;
use bodydb; -- 选择bodydb数据库
-- 2、删除emp表(如果存在)
drop table if exists emp;
-- 3、在 yonghedb 库中创建 emp 表
create table emp(
    id int primary key auto_increment,
-- auto_increment会在新记录插入表时生成一个唯一的数字
    name varchar(50),
    job varchar(50),
    salary double
);
-- 4、往 emp 表中, 插入若干条记录
insert into emp values(null,'张三','前端工程师',9000);
insert into emp values(null,'李四','后端工程师',11000);
insert into emp values(null,'王五','前端工程师',11000);
insert into emp values(null,'赵六','部门主管',25000);
insert into emp values(null,'孙七','系统运维工程师',13500);
insert into emp values(null,'周八','后端工程师',13000);
insert into emp values(null,'吴九','后端工程师',15000);
insert into emp values(null,'郑十','软件测试工程师',10000);

2.创建工程、导入所需jar包、创建测试类

1)建Maven的java工程
2)junit、mysql、mybaits、log4j等开发包

<dependencies>
    <!-- junit单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.8</version>
    </dependency>
    <!-- 整合log4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>
</dependencies>

3)创建com.tedu.mybatis.TestMybatis01测试类,并提供findAll方法(查询emp表中所有的员工信息),开发步骤如下:

/** 查询emp表中的所有员工, 返回一个List<Emp>集合
* @throws IOException */
@Test
public void findAll() throws IOException {
    //1.读取mybatis的核心配置文件(mybatis-config.xml)
    //2.通过配置信息获取一个SqlSessionFactory工厂对象
    //3.通过工厂获取一个SqlSession对象
    //4.通过namespace+id找到要执行的sql语句并执行sql语句
}

3.添加mybatis-config.xml文件

1)在src/main/resources目录下,创建mybatis-config.xml文件(MyBatis的核心配置文件)
2)mybatis-config.xml文件配置如下:

<?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">
    
<!-- MyBatis的全局配置文件 -->
<configuration >
    <!-- 1.配置环境,可配置多个环境(比如:develop开发、test测试) -->
    <environments default="develop">
        <environment id="develop">
            
            <!-- 1.1.配置事务管理方式:JDBC/MANAGED
            JDBC:将事务交给JDBC管理(推荐)
            MANAGED:自己管理事务
              -->
            <transactionManager type="JDBC"></transactionManager>
            
            <!-- 1.2.配置数据源,即连接池 JNDI/POOLED/UNPOOLED
                JNDI:已过时
                POOLED:使用连接池(推荐)
                UNPOOLED:不使用连接池
             -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/bodydb?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="*****"/><!-- mysql服务器的密码 -->
            </dataSource>
        </environment>
    </environments>
    
    <!-- 2.导入Mapper配置文件,如果mapper文件有多个,可以通过多个mapper标签导入 -->
    <mappers>
        <mapper resource="EmpMapper.xml"/>
    </mappers>
</configuration>

4.添加并编写Emp实体类

注意:在当前实例中,Emp类中的属性和数据库表的字段名称必须一致,否则将会无法将结果集封装到Java对象中。
在src/main/java目录下创建 com.tedu.pojo.Emp类,并编辑Emp类:提供私有属性以及对应的getter/setter方法,重写toString方法(IDEA可用快捷键ctrl+insert选择生成)

package com.tedu.pojo;
public class Emp {
    //1.声明实体类中的属性
    private Integer id;
    private String name;
    private String job;
    private Double salary;
    //2.提供对应的getter和setter方法
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
    //3.重写toString方法
    @Override
 public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", job='" + job + ''' +
                ", salary=" + salary +
                '}';
    }
}

5.添加EmpMapper.xml文件

1)在src/main/resources目录下,创建EmpMapper.xml文件 (实体类的映射文件)
2)EmpMapper.xml文件配置如下:

<?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">
 <!-- 
    不同Mapper文件的namespace值应该保证唯一
    在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句
 -->
<mapper namespace="EmpMapper">
<!-- 通过select、insert、update、delete标签声明要执行的SQL -->
    <!-- 查询emp表中的所有员工信息
        resultType指定查询的结果将会封装到什么类型中
        即使最终返回的结果是集合(List<Emp>),resultType也只需要指定集合中的泛型即可!
     -->
    <select id="findAll" resultType="com.tedu.pojo.Emp">
        select * from emp;
    </select>
</mapper>

6.实现测试类,并测试

1)实现findAll方法,代码:

package com.tedu.mybatis;
import com.tedu.pojo.Emp;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis01 {
    @Test
 public void finAll()throws IOException {
 //1.读取mybatis的核心配置文件(mybatis-config.xml)
  InputStream in = 
        Resource.class.getResourceAsStream("/mybatis-config.xml");
//InputStream in=org.apache.ibatis.io.Resources.getResourceAsStream("mybatis-config.xml");
 //2.通过配置信息获取一个SqlSessionFactory工厂对象
 SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
 //3.通过工厂获取一个SqlSession对象
        SqlSession session = fac.openSession();
        //4.通过namespace+id找到要执行的sql语句并执行sql语句
        List<Emp> list = session.selectList("EmpMapper.findAll");
        for (Emp e:list){
            System.out.println(e);
        }
    }
}

2)执行findAll方法,结果:

log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Emp{id=1, name='张三', job='前端工程师', salary=9000.0}
Emp{id=2, name='李四', job='后端工程师', salary=11000.0}
Emp{id=3, name='王五', job='前端工程师', salary=11000.0}
Emp{id=4, name='赵六', job='部门主管', salary=25000.0}
Emp{id=5, name='孙七', job='系统运维工程师', salary=13500.0}
Emp{id=6, name='周八', job='后端工程师', salary=13000.0}
Emp{id=7, name='吴九', job='后端工程师', salary=15000.0}
Emp{id=8, name='郑十', job='软件测试工程师', salary=10000.0}

Process finished with exit code 0

詅®燃
1 声望0 粉丝

下一篇 »
基础点收集

引用和评论

0 条评论