MyBatis学习笔记---First

版权声明:Unruly https://blog.csdn.net/weixin_41660948/article/details/82080440

前言

  • Mybatis框架优点
    • 半自动化管理
    • 作用于DAO层
    • 动态、小巧灵活
  • Mybatis框架特点
    • 基于SQL语法、简单易学。
    • 便于调试、能了解底层封装过程。
    • SQL语句封装在配置文件中,便于管理,降低成语耦合。

数据持久化概念:持久化式程序数据在瞬时状态持久状态的之间的转化过程

----

瞬时状态 === 表示在内存中的文件,数据。通俗就是临时文件,用完就会被清理。

持久状态 === 表示储存在光盘,磁盘,数据库等等中的数据。可以一直携带~保存

----

什么是ORM:(Object Relational Mapping)即对象/关系映射

  • ORM(Object Relational Mapping)
    • 编写程序的时候,以面向对象的方式处理数据。(即:一个实体类对应一张表)
    • 保存数据的时候,却以关系型数据库的方式储存。(即:类属性对应数据库字段)
  • OBM解决方案包含下面四个部分
    • 在持久化对像执行增、删、改、查操作。
    • 对持久化对象提供一种查询语言或者API。
    • 对象关系映射工具。
    • 提供与是事务对象交互、执行检查、延迟加载以及其他优化。

结言:

MyBatis是ORM解决方案,基于OBM在对象模型和关系数据库之间搭建了一座桥梁。

实现这么一些持久化对象的操作。


MyBatis环境搭建

准备工作:

1、下载Mybatis的Jar包

(源码文件)

(中文的mybatisAPI文档,不懂时进行查看)

2、部署jar包到项目下 -- 放入项目的lib包中。

3、编写MyBatis核心配置文件。( 可在文档中复制。)

4、创建实体类-POJO。

5、DAO层-SQL映射文件(mapper.xml)

6、创建测试类

* 读取核心配置文件。

* 创建SqlSessionFactory对象,读取配置文件。

* 通过SqlSessionFactory工厂对象创建SqlSession对象。

* 通过SqlSession对象调用mapper文件进行数据操作。

 

核心配置文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 读取同目录下的info文件 -->
    <properties>
        <property name="dbName" value="root"></property>
        <property name="dbPass" value="linux"></property>
        <property name="dbPath" value="jdbc:mysql://localhost:3306/smbms"></property>
        <property name="jdbcPath" value="com.mysql.jdbc.Driver"></property>
    </properties>
    <!-- 设置日志文件输出 -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!-- 为类设置别名 --><!-- 为pojo包下的所有类设置别名 ,别名就是实体类的类名 -->
    <typeAliases>
        <package name="pojo"></package>
    </typeAliases>
    <!-- 设置Mybatis的运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理,采用JDBC事务管理 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <property name="username" value="${dbName}"></property>
                <property name="password" value="${dbPass}"></property>
                <property name="url" value="${dbPath}"></property>
                <property name="driver" value="${jdbcPath}"></property>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置SQL映射文件 -->
    <mappers>
        <mapper resource="dao/User/userMapper.xml"></mapper>
        <mapper resource="dao/Provider/providerMapper.xml"></mapper>
    </mappers>
</configuration>

SQL映射文件:

<?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文件相当于每个实现类 命名空间必须于我们所定义的接口一致 -->
<mapper namespace="dao.User.userMapper">

    <!-- 设置查询语句 id == 接口定义的方法  resultType是接口定义的返回类型-->
    <select id="count" resultType="int">
        select count(1) from smbms_user
    </select>

    <!-- 同上注意!!!!select!!!里面千万不能写注释 -->
    <select id="listAll" resultType="User">
        select userName from smbms_user
    </select>

</mapper>

具体的测试类:关联sql映射文件和核心文件

package test;

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 org.apache.log4j.Logger;
import pojo.User;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 描述:
 *
 * @author Unruly
 * @ClassName userTest
 * @create 2018-08-25 21:29
 */
public class userTest {
    private static Logger log = Logger.getLogger(userTest.class);
    public static void main(String[] args) {
        int count = 0;  // 接收值
        List<User> list = new ArrayList<User>(); // 接收列表
        SqlSession sqlSession = null;   // 声明sql会话对象
        try {
            /*
                创建sqlSession对象后要怎么办呢?
                    -- mybatis的核心对象是sqlsessionFactory对象。用于创建sql会话
                那么sqlsessionfactory对象怎么获取呢?
                    -- 用sqlsessionfactorybuilder对象的build的方法创建
                    -- build提供多重载。

                这里使用读取字节流的方式将核心配置文件读取进入输入流
                然后使用build方法加载核心配置文件创建sql会话工厂
                最后使用sql会话工厂的openSession(boolean commit); 默认true,自动提交
                创建sqlSession会话对象
                sqlSession会话对象有对sql语句执行的所有操作
             */
            // 1.读取流文件
            InputStream is = Resources.getResourceAsStream("Mybatis-config.xml");
            // 2.创建工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            // 3.打开数据库会话
            sqlSession = factory.openSession();
            // 4.执行sql映射文件的sql语句
            count = sqlSession.selectOne("dao.User.userMapper.count");
            list = sqlSession.selectList("dao.User.userMapper.listAll");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }

        /* 测试输出结果 */
            log.info("总数测试 ============ count = "+count);
         for(User user : list){
            log.info("数据测试 =============== 姓名:"+user.getUserName());
         }
    }
}

MyBatis基本要素-核心类和接口

  • MyBatis的核心接口和类
  • Mybatis-config.xml 系统核心配置文件
  • Mapper.xml SQL映射文件
    • SqlSessionFactoryBuilder ( 用于加载核心文件,建立sql会话工厂 )
      • 用过即丢,其生命周期只存在方法体内。
      • 可重用其创建多个SqlSessionFactory实例。
      • 负责构建核心SqlSessionFactroy,并提供多个builder的重载。
    • SqlSessionFactory ( 用户创建sql会话对象的工厂 )
      • SqlSessionFactroy是每个Mybatis应用核心。
      • 作用:创建SqlSession实例。
        • --->SqlSession session = sqlSessionFactory.openSession(boolean)
      • 作用域:Application。
      • 模式单例:存在于整个应用运行时,并且同时只存在一个实例对象。
    • SqlSession ( 用于执行sql映射文件的sql语法 )
      • 包含了执行sql语句的所有方法。
      • 生命周期对应于一此数据库会话,会话结束必须关闭。
      • 线程级别,不能共享。
      • 在SqlSession里可以执行多次SQL语句,但一旦关闭就要重新创建。

优化代码测试

Sql映射文件:

<?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用于区分不同的mapper,全局唯一 -->
<mapper namespace="dao.Provider.providerMapper">
    <!--
        id表示唯一标识 resultType表示返回的类型
        当我们定义了接口的时候,那么所对应的接口相当于映射器
        那么此使id = 接口定义的方法名称
        以便使用getMapper()方法之后的方法能映射到此sql映射文件的节点方法
    -->
    <select id="count" resultType="int">
        select count(1) from smbms_provider;
    </select>

    <!--
        查询学生列表集合 因为在核心配置文件使用了pageck别名包,
        所以这里的类的别名就是实体本名-Provider
        否则:resultType必须为完整包-类名称
        pojo.Provider
    -->
    <select id="selectAll" resultType="Provider">
        select * from smbms_provider
    </select>
</mapper>

 

工具类:(因为factory只需要一个,但是sqlSession需要频繁打开,所以建立工具类)

package Utils;

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;

/**
 * 描述:
 *
 * @author Unruly
 * @ClassName MybatisUtil
 * @create 2018-08-25 11:35
 */
public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    /*
     * 加载静态块读取mybatis核心文件,创建sql会话工厂。
     */
    static {
        try {
            // 读取文件进入输入流
            InputStream is = Resources.getResourceAsStream("Mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建sqlSession对象的方法 带参
     * @param commit 表示是否自动提交事务:true自动提交、false关闭自动
     * @return 返回一个sqlSession对象
     */
    public static SqlSession createSqlSession(boolean commit){
        return sqlSessionFactory.openSession(commit);
    }

    /**
     * 创建sqlSession对象的方法 无参 自动提交事务
     * @return 返回一个sqlSession对象
     */
    public static SqlSession createSqlSession(){
        return sqlSessionFactory.openSession();
    }

    /**
     * 关闭sqlSession对象的方法
     * @param sqlSession 一个SQL会话对象
     */
    public static void closeSqlSession(SqlSession sqlSession){
        if (sqlSession!=null){
            sqlSession.close();
        }
    }
}

优化简便后的测试类:

package test;

import Utils.MybatisUtil;
import dao.Provider.providerMapper;
import dao.User.userMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import pojo.Provider;

import java.util.ArrayList;
import java.util.List;

/**
 * 描述:
 *
 * @author Unruly
 * @ClassName providerTest
 * @create 2018-08-25 20:26
 */
public class providerTest {
    private static Logger log = Logger.getLogger(providerTest.class);
    public static void main(String[] args) {
        int count = 0;// 接收方法返回值
        List<Provider> list = new ArrayList<Provider>(); // 接收
        SqlSession sqlSession = null; // 创建sqlSession对象
        /*
           因为sqlsessionfactory对象是一个工厂,采用单例模式
           生命周期处于应用运行期间,所以我们只需要一个sql会话工厂对象
           因为使用工具类创建这个对象达到优化代码的效果。
        */
        try {
            // 通过工具类创建sqlSession对象
            sqlSession = MybatisUtil.createSqlSession();
            // 通过接口映射器来执行sql映射文件执行sql映射文件的count方法
            count = sqlSession.getMapper(userMapper.class).count();
            list = sqlSession.getMapper(providerMapper.class).selectAll();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // sqlSession对象声明周期再一次数据库访问期间
            // 用完必须关闭,sqlSession对象Servlet中的request
            MybatisUtil.closeSqlSession(sqlSession);
        }

        log.info("测试=========count = "+count);
        for (Provider p : list){
            log.info("查询测试============providerName:"+p.getProName());
        }
    }
}

基本要素-核心配置文件

  • Configuration 配置 === 所有元素的根节点
    • properties 可以配置在Java属性配置文件中
    • settings 修改MyBatis在运行时的行为方式
    • typeAliases 为Java类型命名一个别名(简称)
    • typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境
      • environment 环境变量
        • transactionManager 事务管理
        • dataSource 数据源
    • mappers 映射器
      • mapper sql映射文件资源

注意:MyBatisConfig配置文件有一定顺序不能乱否则报错。

配置properties的两种方式:

1、引用外部properties文件

<properties resource = "info.properties"></properties>

2、在XML文件中直接引用

<properties resource = "info.properties">

         <properties name="dbName" value="root">

         <properties name="dbPass" value="linux">

         <properties name="dbPath" value="jdbc:mysql://localhost:3306/datasource">

         <properties name="jdbcPath" value="com.mysql.jdbc.Driver">

</properties>

3、同时引用和设置。

(但是这里引用的文件的优先级>内容设置的properties)

(也就是说外部文件的属性值,会覆盖xml内设置的)

猜你喜欢

转载自blog.csdn.net/weixin_41660948/article/details/82080440