Mybatis学习(一)——概述

一、什么是Mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

二、mybatis 最重要的三个类

每个Mybatis 都是以SqlSessionFactory 为中心的,他可以通过SqlSessionFactoryBuilder来构建

InputStream in = Resources.getResourceAsStream(configFile);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);

1.SqlSessionFactoryBuild

局部的对象,仅在于加载XML配置文件,从XML 配置文件读取MyBatis 的配置:事务、连接池、datasource、mybatis 的sql映射文件的路径。
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。

SqlSessionFactory

建议全局只出现一份SqlSessionFactory的实例,建议用单例模式来实现。
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此  SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。
绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理范围中,比如 Serlvet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

三、mybatis 加载映射文件的三种方式

1.通过资源路径加载
如果你的映射文件在资源文件夹下,那么就可一通过这种方式来加载文件

<mapper resource="mapper1/studentMapper.xml"/>
//resource 后面的参数资源文件下的路径

2.通过加载接口类来加载映射文件
如果你的配置映射文件和接口文件在同一个包下且同名,就可以这样加载映射文件

<mapper class = "com.tulun.dao.OrderMapper"/>
//class 后面的参数是接口的全路径

3.批量加载类接口和映射文件
这种方式可以扫描整个包的mapper 文件,需要映射文件和接口文件在一个包里且同名

<package name = "com.tulun.dao"/>
 //name 后面的参数是映射文件所在的包名

四、一个简单的小例子

需求:通过id 查找一个学生的信息
这是我们的数据表,student(d_id 指的是部门 id)
在这里插入图片描述
对应这张表,我们需要一个javaBean

public class Student {
    private Integer id;
    private String name;
    private String passward;
    private Dept  dept;

    public Student(){

    }
    public Student(Integer id ,String name,String passward) {
        this.id = id;
        this.name = name;
        this.passward = passward;
    }

    public Student(Integer id ,String name,String passward,Dept dept) {
        this.id = id;
        this.name = name;
        this.passward = passward;
        this.dept = dept;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDid(Dept dept) {
        this.dept = dept;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPassward() {
        return passward;
}

    public void setPassward(String passward) {
        this.passward = passward;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + passward + '\'' +
                '}';
    }
}

我们需要一个接口以及一个接口映射文件

public interface StudentMapper {

    /**
     * 通过指定的id 查找一个学生
     * @param id
     * @return
     */
    public Student getStuById(Integer id);
}

映射文件

<?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.tulun.dao.StudentMapper">
    <select id="getStuById" resultType="com.tulun.bean.Student">
      select * from student where id = #{id}
  </select>
</mapper>

我们需要写一个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>
    
    <!--
    setting 是一个全局的配置文件
    -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
            <setting name="logImpl" value="STDOUT_LOGGING" />
        </settings>
    <!--配置运行的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- allowMultiQueries :允许以;作为SQL语句的分隔符 -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
<!--
        将我们写好的sql映射文件注册到全局文件
        -->
    <mappers>
        <mapper resource="mapper1/studentMapper.xml"/>
    </mappers>
</configuration>
public class Mybatisutils {
    /**
     * 1.根据XML文件(全局映射文件),获取SqlSessionFactory对象
     * 有数据源一些运行环境信息
     * 2.SQL映射文件:配置了每一个SQL以及SQL的封装规则
     * 3.将SQL 映射文件注册到全局配置文件中
     * 4.写代码:
     * 1.根据全局配置文件得到SqlSessionFactory对象
     * 2.使用SqlSessionFactory获取到SqlSession对象来执行增删改查
     * 一个SqlSession就代表和数据库的一次会话,用完关闭
     * 3.使用sql的唯一标识来告诉mybatis执行那个sql
     */
    public SqlSession getsession() throws IOException {
        String resource = "mybatis-conf.xml";
        //通过Resource 获取mybatis 流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //获取SqlSessionFactory 实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //我们就可以从中获得 SqlSession 的实例了。
        // SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
        // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
}

这个例子就完成啦,我们来测试一下这个。

 public static void main(String[] args){
            Mybatisutils mybatisutils = new Mybatisutils();
            SqlSession session = null;
            try {
               session = mybatisutils.getsession();
               StudentMapper studentMapper = session.getMapper(StudentMapper.class);
                //单个参数查找测试
            Student student  = studentMapper.getStuById(1);
            System.out.println(student); 
                //手动提交
                session.commit();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(session != null){
                    session.close();
                }

            }
        }

在这里插入图片描述
我们总结一下:
1.写与数据表相对应的javaBean
2.写操作数据库的接口
3.写接口的映射文件,映射文件里面包含操作数据库需要得到SQL语句
4.写Mybatis 配置文件,配置文件里面配置了数据源,事务以及映射文件的路径
5.加载配置文件,获取接口实例。执行相应的操作

猜你喜欢

转载自blog.csdn.net/Alyson_jm/article/details/91890148