MyBatis

MyBatis  

一、什么是MyBatis

  1、简介

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

  对jdbc的封装框架有哪些:Hibernate,dbutils,jdbcTemplate[spring],mybatis

  原理:Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

  每一个 MyBatis 的应 用程序 都以一 个 SqlSessionFactory 对象的 实例为 核心。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以通过 XML 配置文件,或从以往使用惯例中准备好的 Configuration 类实例中来构建 SqlSessionFactory 对象。 

 

  2、入门——从XML中构建SQLSessionFactory   

1、接口式编程
    原生:        Dao        ====>  DaoImpl
    mybatis:    Mapper    ====>  xxMapper.xml
2、SqlSession代表和数据库的一次会话;用完必须关闭;
3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
        (将接口和xml进行绑定)
        EmployeeMapper empMapper =    sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
        mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
        sql映射文件:保存了每一个sql语句的映射信息:    将sql抽取出来。

步骤:
* 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
* 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 1)、根据全局配置文件得到SqlSessionFactory;
* 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。

  2.1  从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资 源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径 或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些工具类,称作为资源,这些工具 类包含一些方法,这些方法使得从类路径或其它位置加载资源文件更加简单。 

1 //获取SqlSessionFactory
2     public SqlSessionFactory getSqlSessionFactory() throws IOException {
3         //读取配置文件
4         String resource = "mybatis-config.xml";
5         Reader reader = Resources.getResourceAsReader(resource);
6         return new SqlSessionFactoryBuilder().build(reader);
7     }

  mybatis-config.xml:

MyBatis
<?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>
    <!--
        1、mybatis可以使用properties来引入外部properties配置文件的内容;
        resource:引入类路径下的资源
        url:引入网络路径或者磁盘路径下的资源
      -->
    <properties resource="db.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.jdbcUrl}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper resource="com/ant/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>
mybatis-config.xml

  2.2  获取sqlSession对象,执行增删改查方法

public void daoSession() throws IOException {
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            //获取接口的实现类 对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //mybatis会给自动的创建一个代理对象,代理对象去执行增删改查 方法
            User user = userMapper.findUserById(2);
            System.out.println(userMapper.getClass());
            System.out.println(user);
        }finally {
            sqlSession.close();
        }
    }

  User实例

MyBatis
package com.ant.mybatis;

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String address;

    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 Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}
User.java

  UserMapper.xml

MyBatis
<?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">
<!--
    namespace:命名空间,定义为接口的全类名。如下:
    id:唯一标识,可写用 方法名作为唯一标识
    public User findUserById(Integer id);
-->
<mapper namespace="com.ant.mybatis.dao.UserMapper">
    <select id="findUserById" resultType="com.ant.mybatis.User">
      select * from user where id = #{id}
     </select>
</mapper>
UserMapper.xml

  dao层的接口类

1 package com.ant.mybatis.dao;
2 
3 import com.ant.mybatis.User;
4 
5 public interface UserMapper {
6   //根据id查询User
7     public User findUserById(Integer id);
8 }

  2.3  结果:

MyBatis

 

上一篇:MyBatis


下一篇:MyBatis 概念