IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 第7章 Mybatis的核心配置 -> 正文阅读

[Java知识库]第7章 Mybatis的核心配置

1.什么是SqlSessionFactory?
SqlSessionFactory是Mybatis中十分重要的对象,俗称会话工厂,它是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过xml配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。
2.通过xml配置文件构建出的SqlSession实例的代码如下:
InputStream inputStream=Resources.getResourceAstream(“配置文件位置”);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
注意:
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在,如果我们多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源很容易耗尽。为此,通常每一个数据库都只会对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单例模式。
3.什么是SqlSesion?
SqlSession是Mybatis框架中另外一个重要的对象,它是应用程序与持久层交互操作的一个单线程对象,主要作用是持久化操作。
注意:
(1)每一个线程都对应一个自己的SqlSession实例,并且该实例不能被共享,SqlSession也是线程不安全的,使用范围只允许一个方法或一次请求中。
(2)使用完SqlSession对象后要及时关闭,通常放在finally块中。
4.SqlSesion实际上封装了JDBC的连接。
5.为了简化开发,减少重复的冗余代码,通常使用工具类来创建SqlSession,具体如下:
MyUtils.java

public class Myutils {
    //声明静态SqlSessionFactory属性并且赋值为null
    private static SqlSessionFactory sqlSessionFactory=null;
    //静态代码块初始化SqlSessionFactory对象
    static {
        try{
            //使用Mybatis提供的Resources类加载Mybatis的配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            //构建SqlSessionFactory工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    //获取SqlSession对象的静态方法
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }

}

6.属性配置通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性,如mybatis配置文件数据库的连接属性可写为:
db.properties

jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = 12345678

7.Mybatis配置文件中的元素:
(1):是一个配置属性的元素,通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性;
例:db.properties
(2):主要用于改变Mybatis运行时的行为,例如开启二级缓存,开启延时加载等;
注意:一级缓存是默认开启的,同一个方法中第一次查数据库表,第二次查缓存,若缓存被清空了,则从数据库表中查询;
扩展:
a.清空缓存使用 sqlSession.commit();
b.开启二级缓存需要手动开启,缓存查询的对象需要实现序列化接口(即对应的Dao层的类实现Serialable接口)。第一步在Mybatis-config.xml中配置,第二步在XxxMapper.xml中配置。
(3):将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(jdbc类型),或者从数据库中取出结果时将jdbcType转换为javaType。
(4):为配置文件中的java类型设置一个别名,别名的配置与xml配置相关,其作用的意义是减少全限类名的冗余。
(5):事务管理器的配置;
(6):用于指定Mybatis映射文件的位置,一般有四种方式:
a.使用类路径引入:

<mappers>
	<mapper resource="com/wds/mapper/UserMapper.xml"/>
<mappers>

b.使用本地文件路径:

<mapper url="file:///D:/com/wds/mapper/UserMapper.xml"/>

c.使用接口类引入:

<mapper class="com.wds.mapper.UserMapper.xml"/>

d.使用包名引入:

<mapper name="com.wds.mapper"/>

具体的用法自行查找!!!
8.mapper映射文件的元素:
(1)select:映射查询语句,可以自定义参数,返回结果集;
(2)insert:映射插入语句,返回一个整数为插入的行数;
(3)update:映射更新语句,返回一个整数为更新的行数;
(4)delete:映射删除语句,返回一个整数为删除的行数;
(5)sql:用于定义一部分sql片段,其他的sql语句可以引用此sql;
(6)cache:给定命名空间的缓存配置;
(7)cache-ref:其他缓存空间的引用;
(8)resultMap:用来描述如何从一个数据结果集中加载对象,字段不完全匹配时;
9.mysql数据库是主键自增长的,oracle主键是非自增长的;
10.实例展示之resultMap:
(1)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">
<configuration>
    <properties resource="db.properties"/>
    <!--1.配置环境-->
    <environments default="mysql">
        <environment id="mysql">
            <!--只用JDBC的事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--2.映射文件-->
    <mappers>
        <mapper resource="com/wds/po/UserMapper.xml"/>
        <mapper resource="com/wds/po/CustomerMapper.xml"/>
    </mappers>
</configuration>

(2)db.properties

jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = 12345678

(3)log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.wds=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

(5)工具类Myutils.java

package com.wds.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.Reader;

public class Myutils {
    //声明静态SqlSessionFactory属性并且赋值为null
    private static SqlSessionFactory sqlSessionFactory=null;
    //静态代码块初始化SqlSessionFactory对象
    static {
        try{
            //使用Mybatis提供的Resources类加载Mybatis的配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            //构建SqlSessionFactory工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    //获取SqlSession对象的静态方法
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }

}

(6)User.java

package com.wds.po;

public class User {
    private Integer t_id;
    private String t_name;
    private String t_address;

    public Integer getT_id() {
        return t_id;
    }

    public void setT_id(Integer t_id) {
        this.t_id = t_id;
    }

    public String getT_name() {
        return t_name;
    }

    public void setT_name(String t_name) {
        this.t_name = t_name;
    }

    public String getT_address() {
        return t_address;
    }

    public void setT_address(String t_address) {
        this.t_address = t_address;
    }

    @Override
    public String toString() {
        return "User{" +
                "t_id=" + t_id +
                ", t_name='" + t_name + '\'' +
                ", t_address='" + t_address + '\'' +
                '}';
    }
}

(7)映射文件UserMapper.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.wds.po.User">
    <resultMap id="resultMap" type="com.wds.po.User">
        <id property="t_id" column="id"/>
        <result property="t_name" column="name"/>
        <result property="t_address" column="address"/>
    </resultMap>
    <select id="findAllUsers" resultMap="resultMap">
        select  * from tb_user
    </select>

</mapper>

(8)测试类MybatisTest.java
此处代码和上一章一样,只是增加了findAllUsers()来测试resultMap

package com.wds.test;

import com.wds.po.Customer;
import com.wds.po.User;
import com.wds.utils.Myutils;
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.junit.Test;

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

public class MybatisTest {
    @Test
    /**
     * 单个客户数据的精确查询
     */
    public void findCustomerById() throws Exception{
        //1.读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2.根据配置文件构建会话工厂SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.根据sqlSessionFactory会话工厂创建对象SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.sqlSession执行sql语句,返回结果
        //第一个参数是sql的id,第二个参数是传入给sql的占位符的参数
        Customer customer = sqlSession.selectOne("com.wds.po.Customer.findCustomerById",1);
        //5.输出结果
        System.out.println(customer.toString());
        //6.关闭sqlSession
        sqlSession.close();
    }

    /**
    根据客户名称模糊查询用户列表
     */
    @Test
    public void findCustomerByName() throws Exception{
        //1.读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2.根据配置问价构建会话工厂SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.根据sqlSessionFactory创建会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行sqlSession
        List<Customer> customers = sqlSession.selectList("com.wds.po.Customer.findCustomerByName","j");
        //5.输出结果
        for(Customer customer:customers){
            System.out.println(customer.toString());
        }
        //6.关闭流
        sqlSession.close();
    }
    /**
     * 添加客户
     */
    @Test
    public void addCustomer() throws Exception{
        //1.读取配置问价
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2.根据配置文件创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.根据会话工厂创建会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行SqlSession
        //4.1 创建客户对象
        Customer customer = new Customer();
        customer.setUsername("东生");
        customer.setJobs("coder");
        customer.setPhone("18139954468");
        //4.2 执行添加方法
        //4.3第一个参数是sql的id,第二个是传给sql的占位符参数
        int num = sqlSession.insert("com.wds.po.Customer.addCustomer", customer);
        if(num>0){
            System.out.println("插入操作执行成功!!!");
        }else
        {
            System.out.println("执行失败!!!");
        }
        //4.4执行事务,提交事务
        sqlSession.commit();
        //5.关闭流
        sqlSession.close();
    }

    /**
     * 更新客户
     */
    @Test
    public void updateCustomer() throws Exception{
        //1.读取配置问价
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2.根据配置文件创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.根据SqlSessionFactory创建会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行操作
        //4.1创建对象
        Customer customer = new Customer();
        customer.setId(1);
        customer.setUsername("吕憨憨");
        customer.setJobs("doctor");
        customer.setPhone("110256");
        int num = sqlSession.update("com.wds.po.Customer.updateCustomer",customer);
        if(num>0){
            System.out.println("您的修改已经成功!!");
        }
        //4.3提交事务
        sqlSession.commit();
        //5.关闭
        sqlSession.close();
    }

    /**
     * 删除客户操作
     */
    @Test
    public void deleteCustomer() throws Exception{
        //1.读取配置问价
//        String resource = "mybatis-config.xml";
//        InputStream inputStream = Resources.getResourceAsStream(resource);
//        //2.根据配置问价创建会话工厂
//        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        //3.根据会话工厂创建会话对象
//        SqlSession sqlSession = sqlSessionFactory.openSession();
        SqlSession sqlSession = Myutils.getSession();
        //4.执行操作
        int num = sqlSession.delete("com.wds.po.Customer.deleteCustomer",5);
        if(num>0){
            System.out.println("删除操作执行成功!!!");
        }else{
            System.out.println("删除操作执行失败!!!");
        }
        //提交事务,增删改都需要事务
        sqlSession.commit();
        //5.关闭会话
        sqlSession.close();
    }

    /**
     * 测试resultMap
     */
    @Test
    public void findAllUsers(){
        SqlSession sqlSession = Myutils.getSession();
        List<User> users = sqlSession.selectList("com.wds.po.User.findAllUsers");
        for (User s:users ){
            System.out.println(s.toString());
        }
        sqlSession.close();
    }


}

11.resultMap测试结果:
在这里插入图片描述
数据库表tb_user
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:43:31  更:2021-10-04 12:45:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:15:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码