首页 > 其他分享 >03. MyBatis的核心配置文件

03. MyBatis的核心配置文件

时间:2022-10-04 13:56:03浏览次数:52  
标签:username 03 配置文件 数据源 id MyBatis password public

一、MyBatis环境搭建

1.1、数据的准备

CREATE DATABASE IF NOT EXISTS db_test;
USE db_test;

CREATE TABLE IF NOT EXISTS t_user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	password VARCHAR(20),
	age INT,
	sex CHAR,
	email VARCHAR(30)
); 

1.2、导入jar包

  通过 maven 的方式导入 jar包,打包方式设置为 jar 包即可。

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

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

<!-- junit 测试程序 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

1.3、创建核心配置文件

  创建 MyBatis 的核心配置文件,习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。配置 MyBatis 的核心配置文件中的标签必须按照固定的顺序:

properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> objectWrapperFactory --> reflectorFactory --> plugins --> environments --> databaseIdProvider --> mappers

<?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>

    <!-- settings标签的内容是MyBatis极为重要的调整设置,它们会改变MyBatis的运行时行为 -->
    <settings>
        <!-- 指定MyBatis所有日志的具体实现,未指定时将自动查找 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!-- environments:配置多个连接数据库环境 -->
    <environments default="development">
        <!-- environment:配置某个具体的环境 -->
        <environment id="development">
            <!-- 设置事务管理方式 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 设置连接数据库的驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!-- 设置连接数据库的地址 -->
                <property name="url" value="jdbc:mysql://localhost:3306/db_test"/>
                <!-- 设置连接数据库的用户名 -->
                <property name="username" value="root"/>
                <!-- 设置连接数据库的密码 -->
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
        <!--
            指定 XxxMapper.xml 配置文件的路径
            resource属性自动会从类的根路径下开始查找资源
            url属性从绝对路径当中加载资源,一般很少使用,语法格式如下:file:///绝对路径
        -->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

1.4、创建实体类

package star.light.pojo;

public class User {
    // 数据库表当中的字段应该和pojo类的属性一一对应
    // 建议使用包装类,这样可以防止从数据库查出字段的值为null的问题
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Character sex;
    private String email;

    public User() {
    }

    public User(Integer id, String username, String password, Integer age, Character sex, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

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

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

1.5、创建MyBatis的映射文件

  映射文件的命名应该为 表所对应的实体类的类名+Mapper.xml。一个映射文件对应一个实体类,对应一张表的操作。MyBatis映射文件用于编写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用来指定命名空间的,防止id重复 
    如果在多个Mapper文件中,SQL语句的id重复,这时可以在Java程序中写namespace.id
    实质上,本质上,MyBatis中的SQLId的完整写法为namespace.id
-->
<mapper namespace="userMapper">
   
</mapper>

1.6、封装SqlSessionUtil工具类

package star.light.util;

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;

public class SqlSessionUtil {
    private static SqlSessionFactory sqlSessionFactory;

    // 为了防止new对象,工具类的构造方法一般都是私有的
    // 工具类中所有的方法都是静态的,直接采用类型即可调用,不需要new对象
    private SqlSessionUtil(){}

    // 静态代码块在类加载的时候执行
    // SqlSesionUtil工具类在进行第一次加载的时候,解析MyBatis和核心配置文件,创建SqlSessionFactory对象
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取会话对象
     * @return 会话对象
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

二、MyBatis配置多环境

  <environments>标签用来配置多个数据库环境,它有个属性 default,用来指定默认使用的环境的id。默认环境是指当你使用MyBatis创建SqlSessionFactory对象时,没有指定环境的话,默认使用哪个环境。

  我们可以通过 <environments> 的子标签 <environment> 配置某个具体的环境,<environment>有个id属性用来表示连接数据库的环境的唯一标识,不能重复。一般,一个环境enbiromint对应一个数据库,一个数据库对应一个SqlSessionFactory对象

①数据库的准备

CREATE DATABASE IF NOT EXISTS db_template;
USE db_template;

CREATE TABLE IF NOT EXISTS t_user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	password VARCHAR(20),
	age INT,
	sex CHAR,
	email VARCHAR(30)
); 

②配置MyBatis核心配置文件

  在 MyBatis 和核心配置文件 mybatis-config.xml 中的 <environment>标签中添加如下信息:

<!-- 这是MyBatis的另一个环境,连接的数据库是db_template -->
<environment id="template">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_template"/>
        <property name="username" value="root"/>
        <property name="password" value="27185.Sakura"/>
    </dataSource>
</environment>

③配置Mapper映射文件

  在 UserMapper.xml 配置文件中添加如下内容:

<insert id="insertUser">
    insert into t_user(id,username,password,age,sex,email)
    values (#{id},#{username},#{password},#{age},#{sex},#{email})
</insert>

④测试程序:

package star.light.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.junit.Test;
import star.light.pojo.User;

import java.io.IOException;

public class MyBatisTest {

    @Test
    public void testEnvironment() throws IOException {
        // 获取SqlSessionFactory对象(采用默认的方式获取)
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 这种方式获取的默认环境
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行SQL语句
        User user = new User(null,"Sakura","Sakura",10,'女',"[email protected]");
        int affectedRowCount = sqlSession.insert("userMapper.insertUser", user);
        System.out.println("affectedRowCount = " + affectedRowCount);
        sqlSession.commit();
        sqlSession.close();

        // 这种方式通过环境id来指定的环境
        SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "template");
        SqlSession sqlSession1 = sqlSessionFactory1.openSession();
        User user1 = new User(null,"Mikoto","Mikoto",14,'女',"[email protected]");
        int affectedRowCount1 = sqlSession1.insert("userMapper.insertUser", user1);
        System.out.println("affectedRowCount1 = " + affectedRowCount1);
        sqlSession1.commit();
        sqlSession1.close();
    }
}

三、MyBatis的事务管理器

  <tranasctionManager>标签用来配置事务管理器,指定 MyBatis 具体使用什么方式去管理事务。它的 type属性 有两个值:JDBCMANAGED;type="JDBC" 表示使用原生的 JDBC 代码来管理事务;type="MANAGED" 表示 MyBatis 不再负责事务的管理,将事务的管理交给其它的 JavaEE容器 来管理,例如,Spring;type属性值不区分大小写,但是不能写其他值,只能是二选一。

  在 MyBatis 中提供了一个事务管理器接口,该接口有连个实现类:JdbcTransaction 和 ManagedTransaction;如果 type="JDBC",那么底层会实例化 JdbcTransaction对象;如果 type="MANAGED",那么底层会实例化 ManagedTransaction;

<!--
    transactionManager:设置事务管理方式
    属性:
        type = "JDBC | MANAGED"
            JDBC:MyBatis框架自己管理事务,自己采用原生的JDBC代码去管理事务
            MANAGED:MyBatis不再负责事务的管理了,事务的管理交给其它容器来负责,例如Spring
-->
<transactionManager type="JDBC"/>

四、MyBatis的数据源

  dataSource 被称为数据源,主要是为程序提供 Connection对象。但凡是给程序提供 Connection对象的都可以叫做数据源。数据源实际上是一套规范。JDK 中有这套规范,在 javax.sql.DataSource 下。我们也可以自己编写数据源组件,只要实现 javax.sql.DataSource接口 就行了。例如,你可以自己写一个数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。

  <dataSource>标签有一个属性 type 用来指定数据源的类型,就是指定具体使用什么方式来获取 Connection对象。type属性 有三个值可选:POOLED、UNPOOLED 和 JNDI;type="UNPOOLED" 表示不使用数据库连接技术,每一次请求过来之后,都是创建新的 Connection对象;type="POOLED" 表示使用 MyBatis 自己实现的数据库连接池;type="JDNI" 表示可以集成其它第三方的数据库连接池;JDNI 是一套规范,大部分的 WEB容器 都实现了 JNDI规范;JNDI 是 Java命名目录接口;

  • UNPOOLED类型的数据源可以配置以下属性:
    • driver:设置数据库连接驱动
    • url:设置连接的数据库地址
    • username:设置连接数据库的用户名
    • password:设置连接数据库的密码
    • defaultTransactionIsolationLevel:设置默认的连接事务隔离级别
    • defaultNetworkTimeout:等待数据库操作完成的默认网络超时事件
  • POOLED类型的数据源,除了可以配置 UNPOOLED类型 数据源的属性之外,还可以配置如下属性:
    • poolMaximumActiveConnections:在任意时间可存在的活动(正在使用)的连接数量
    • poolMaximumIdleConnections:任意时间可能存在的空闲连接数
    • poolMaximumCheckoutTime:在被强制返回之前,池中连接被检出(check out)时间,默认值:20000毫秒
    • poolTimeToWait:如果连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接,默认值:20000毫秒
    • poolMaximumLocalBadConnectionTolerance:如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnection 与 poolMaximumLocalBadConnectionTolerance 之和
    • poolPingQuery:发送到数据库的侦测查询,用来检验连接是否正常工作并准备接收请求。默认是 NO PING QUERY SET
    • poolPingEnable:是否启动侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行 SQL语句。默认是 false
    • poolPingConnectionsNotUseFor:配置 poolPingQuery 的频率,默认值是 0
  • JNDI类型的数据源的实现是为了能在WEB容器中使用,
    • initial_context:用来在 InitialContext 中寻找上下文。这是一个可选项,如果忽略,那么将会直接从 InitalContext 中查找 data_source属性
    • data_source:这是引用数据源实例位置的上下文

  正常情况下,使用连接池的话,池中有很多参数需要设置的。如果参数设置的好,可以让连接池的性能发挥的更好。具体连接池中参数的配置需要反复的根据当前业务情况进行测试。

<!--
    dataSource:配置数据源
    属性:
        type = "POOLED | UNPOOLED | JNDI",设置数据源的类型
            POOLED:表示使用MyBatis自己实现的数据库连接池
            UNPOOLED:表示不使用数据库连接池
            JNDI:表示使用第三方数据库连接池
-->
<dataSource type="POOLED">
    <!-- 设置连接数据库的驱动 -->
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <!-- 设置连接数据库的地址 -->
    <property name="url" value="jdbc:mysql://localhost:3306/db_test"/>
    <!-- 设置连接数据库的用户名 -->
    <property name="username" value="root"/>
    <!-- 设置连接数据库的密码 -->
    <property name="password" value="27185.Sakura"/>
    <!-- 设置连接池当中最多的正在使用的连接对象的上限,最多有多个个连接可以活动,默认值为10 -->
    <property name="poolMaximumActiveConnections" value="15"/>
    <!-- 设置超时时间,强行让某个连接空闲,默认值为20秒 -->
    <property name="poolMaximumCheckoutTime" value="10000"/>
    <!-- 设置打印日志的间隔时间,并且尝试获取连接对象,默认值为20秒 -->
    <property name="poolTimeToWait" value="1000"/>
    <!-- 最多空闲的数量 -->
    <property name="poolMaximumIdleConnections" value="5"/>
</dataSource>

  在测试程序中添加如下测试信息:

@Test
public void testDataSource() throws IOException {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));

    User user = new User(null,"Sakura","Sakura",10,'女',"[email protected]");

    for (int i = 0; i < 20; i++) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        int affectedRowCount = sqlSession.insert("userMapper.insertUser", user);;
        System.out.println("affectedRowCount = " + affectedRowCount);
        sqlSession.commit();
    }
}

五、properties标签的配置和使用

  在 <properties>标签中可以配置很多属性;

<!--
    properties标签中可以配置很多属性
-->
<properties>
    <!-- <property name="属性名" value="属性值"/> -->
    <property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/db_test"/>
    <property name="jdbc.username" value="com.mysql.cj.jdbc.root"/>
    <property name="jdbc.password" value="abc123"/>
</properties>

  也可以通过 <properties>标签的 resouce属性 或者 url属性 来引入外部配置文件

<!--
    properties可以通过resource属性或者url属性引入配置文件
        resource属性:从类的根路径下加载资源
        url属性:从绝对路径加载资源,file:///路径
-->
<properties resource="jdbc.properties"></properties>

  jdbc.properties 配置文件内容如下:

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

  此时,MyBatis 的核心配置文件中关于数据源的配置可以改为形式:

<!--
    dataSource:配置数据源
    属性:
        type = "POOLED|UNPOOLED|JNDI",设置数据源的类型
            POOLED:表示使用数据库连接池缓存数据库连接
            UNPOOLED:表示不使用数据库连接池
            JNDI:表示使用上下文中的数据源
    -->
<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}"/>
    <!-- 设置连接池当中最多的正在使用的连接对象的上限,最多有多个个连接可以活动,默认值为10 -->
    <property name="poolMaximumActiveConnections" value="15"/>
    <!-- 设置超时时间,强行让某个连接空闲,默认值为20秒 -->
    <property name="poolMaximumCheckoutTime" value="10000"/>
    <!-- 设置打印日志的间隔时间,并且尝试获取连接对象,默认值为20秒 -->
    <property name="poolTimeToWait" value="1000"/>
    <!-- 最多空闲的数量 -->
    <property name="poolMaximumIdleConnections" value="5"/>
</dataSource>

标签:username,03,配置文件,数据源,id,MyBatis,password,public
From: https://www.cnblogs.com/nanoha/p/16753655.html

相关文章

  • 03-Active Directory的使用与验证
    温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:​​https://github.com/fayson/cdhproject​​提示:代码块部分可......
  • 03_重识音频
    目录PCM采样采样率采样定理量化位深度编码其他概念声道(Channel)比特率信噪比音频的编码与解码编码(Encode)解码(Decode)常见的音频编码和文件格式无损Monkey'sAudioFLACALAC有......
  • <resultMap >继承 解决 Mybatis 统计类查询需求
    在使用Mybatis过程中,有需要通过SQL直接计数或求和的需求,需要自定义<resultMap>,而这些<resultMap>往往会与数据库映射直接生成的<resultMap>有关联,会用到resultMap继承,这......
  • C++之字符串分割案例---数据分析-03
    stringdata="我叫李宇博,我今年13岁,我家住在不知道,今天是星期天," "我喜欢吃粑粑,我喜欢做打篮球,我的学校是太康三中,我的生日是1月1号," "我的语文成绩是:0分,我的......
  • 003-Redis 中的 BitMaps
    1.BitMap1.1bitcount1.1.1基本信息BITCOUNTkey[startend]summary:Countsetbitsinastringsince:2.6.0Countthenumberofsetbits(populationcounti......
  • 03 导师不敢和你说的水论文隐藏技巧,模型复现后,性能低了怎么办?
    博客配套视频链接:​​https://www.bilibili.com/video/BV1CP411G7VX/?spm_id_from=333.788​​b站直接看0:10这只是其中一种解释:对于AI模型,用不同的显卡跑,结果很大可能......
  • MybatisPlus学习之MyBatisX插件比代码生成器还好用的哦2
    MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表联查,我们就需......
  • #yyds干货盘点#【愚公系列】2022年10月 Go教学课程 038-异常处理
    一、异常处理1.什么是异常处理异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为......
  • mybatisplus不支持sum,但支持这个
    我们知道,要对数据求和,写sql很简单:selectsum(exp)fromtable_name我们在用mybatisplus做求和计算的时候,mybatisplus的Wrapper不支持sum函数。这种情况下,我们就无法使用lamb......
  • Mybatis获取参数的两种方式
    1、MyBatis获取参数值的两种方式:${}和#{}${}的本质是字符串拼接,#{}的本质是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手......