Mybatis(一)

1. ORM

面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。

ORM就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据)–> 对象(object)
  • 字段(field)–> 对象的属性(attribute)
    在这里插入图片描述

2. Mybatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

3. 使用Mybatis

3.1. 新建类和数据库

使用maven新建一个java项目,将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.6</version>
</dependency>

新建一个Person类,属性有id,name,age

public class Person {
    private int id;
    private String name;
    private int age;
//getter()、setter()、构造方法与toString()方法略
}

在数据库中新建一个person表
在这里插入图片描述

3.2. 建立映射

在resources目录下创建一个mapper目录,专门用于存放sql映射文件,在目录中创建一个PersonMapper.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="com.santiago.mybatis.PersonMapper">
    <select id="queryPersonById" resultType="com.santiago.mybatis.Person" parameterType="int">
        select * from Blog where id = #{id}
    </select>
</mapper>

其中namespace值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
resultType属性指明查询返回的结果集类型,路径名要写完整,#{id}相当于jdbc中的,可以动态传入id值,parameterType决定传入数值类型

3.3. 配置

在resources目录下创建一个conf.xml文件,

  • environments中可以写多个environment,通过environments的default值和enviorment的id值确定Mybatis运行时的数据库环境,也可以在测试类中的build()函数中指定environments的default值.
  • dataSource为数据源类型,有三种
    • POOLED:使用数据库连接池(一般选用这种方式)
    • UNPOOLED:传统的JDBC方式,每次访问数据库都需要打开关闭操作,比较浪费资源
    • JNDI:从tomcat中获取一个内置的连接池
  • transactionManager:事务的提交方式
    • JDBC:利用JDBC的方式处理事务(commit rollback close)
    • MANAGED:将事务交由其他组件去托管(spring,jobss)

内容如下所示

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--配置数据库信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    <!--加载映射文件-->
        <mapper resource="mapper/PersonMapper.xml"/>
    </mappers>
</configuration>
3.4. 编写数据访问类

在com.santiago.mybatis包下新建TestMybatis.java,

注意:指定Mybatis运行时的环境为test,则选择environment的id值为test的环境运行
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream,"test");

内容如下所示

package com.santiago.mybatis;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class TestMybatis {
    public static void main(String[] args) {
    	//方式一
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream stream = Person.class.getClassLoader().getResourceAsStream("conf.xml");
        //构建sqlSession的工厂
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        //指定Mybatis运行时的环境为development,则选择environment的id值为development的环境运行
        //SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream,"development");
		
		//方式二
        //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
        //Reader reader = Resources.getResourceAsReader(resource);
        //构建sqlSession的工厂
        //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

        //创建能执行映射文件中sql的sqlSession
        SqlSession session=ssf.openSession();

        /**
         * 映射sql的标识字符串,
         * com.santiago.mybatis.PersonMapper是PersonMapper.xml文件中mapper标签的namespace属性的值,
         * queryPersonById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         * 根据namespace和id确定唯一的sql语句
         */
        String statement = "com.santiago.mybatis.PersonMapper.queryPersonById";
        Person person = session.selectOne(statement, 1);
        System.out.println(person);
        session.close();
    }
}

执行结果如下所示
在这里插入图片描述
执行过程解释:
MyBatis源码分析-SQL语句执行的完整流程
在这里插入图片描述
执行流程:

  1. 加载Mybatis配置文件,根据配置文件中的信息(事务管理器、数据源)创建SqlSessionFactory,并加载映射文件
  2. 获取一个SqlSession(用来完成增删改查功能),然后开启
  3. Executor生成Sql动态语句并查询缓存
  4. 如果没有缓存信息,StatementHandler进行SQL查询参数的设置,设置完之后返回一个Statement
  5. 然后Handler针对一条Statement语句进行实际的SQL查询操作和结果集的封装
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值