Mybatis框架学习笔记

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis框架学习笔记相关的知识,希望对你有一定的参考价值。

本篇Mybatis框架学习笔记;紧跟之前的学习
Mybatis框架学习笔记(1)—>小智RE0

在mybatis框架核心配置文件中需要学习的配置
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

1.初步了解事务

transactionManager在昨天配置时,仅解释它是对事务进行管理的

那么,事务到底是啥呢?
初步理解的话,事务就是 一次对数据库操作的若干个流程的管理;

就用经典的转账问题来说吧;
要向 转1000元;那么这看似是一件事;
分开的话,实际有两步,首先把的账户中减去1000元;然后向的账户中添加1000元;这两件事会组成一次事务,

昨天在进行这个添加用户操作的时候呢,有一个步骤是提交事务;

要是,我把这一步取消呢;

方法也执行了,没报错

去数据库看看;数据就没有存进去

注意

在sqlSession 执行commit( ) 方法提交事务时;这一步是要通知数据库,执行的没有问题,可以在数据库中执行语句存储数据啦;
但是,要是事务没提交的话,数据库就收不到通知啊,他怎么去存储数据呢.


2.将数据库的连接驱动,url…提取出来,放到资源文件中;

像昨天这样子直接在配置文件中去写这几个,关于数据库驱动连接参数;也是可以的;

但是,这个项目已经发布了,后期你还想改里面的配置文件,万一改错了一个位置,也是比较麻烦的;
那么,把这部分参数提取为资源文件;然后这边取值就行了;需要改动的时候,可以直接改资源文件;也是比较方便的

Ok,在resources目录下创建 database.properties 资源文件

注意,昨天在xml文件中url后面的几个参数连接的&要用&;但是这里不用哦

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day20211024_study_mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=123456

然后,在核心配置文件mybatis-config.xml中;直接用properties去引用资源文件即可;

<!--引入外部的资源文件-->
    <properties resource="database.properties">
    </properties>

然后,在数据源dataSource中引用资源文件里面的参数名字就行了

<?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="database.properties">
    </properties>

    <!--配置别名-->
    <typeAliases>
        <!--为实体类User配置别名为user-->
        <typeAlias type="com.xiaozhi.pojo.User" alias="user"/>
    </typeAliases>

    <!-- environments 环境配置 , 这里的default来指定默认使用的环境变量 -->
    <environments default="development">
        <!-- environment 环境变量 ;可以写多个,尽量保证id不重名就行-->
        <!--开发的环境变量-->
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC">
            </transactionManager>
            <!--dataSource:数据源-->
            <dataSource type="UNPOOLED">
                <!--数据库驱动,url连接,数据库账户,密码-->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}"/>
                <property name="username" value="${username}" />
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--配置mapper映射-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

Ok,现在去测试执行一下;这里提交事务开启了哦

package com.xiaozhi.test;

import com.xiaozhi.mapper.UserMapper;
import com.xiaozhi.pojo.User;
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.Reader;

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-24 22:34
 */
public class TestByXiaoZhi {
    public static void main(String[] args) throws IOException {
        //先创建用户对象;
        User user = new User("小智のRE0","qqqqweq","陕西汉中");

        //第一步:用字符流的方式去读取核心配置文件mybatis-config.xml;
        //注意;导包的时候-->用 ibatis 下的包,不要导错了;
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");

        //第二步;创建sqlSessionFactory对象;
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);

        //第三步 SqlSession对象;
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //第四步,得到UserMapper映射接口的代理对象;  org.apache.ibatis.binding.MapperProxy@22635ba0
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //第五步,执行方法;
        userMapper.addUser(user);

        //第六步;提交事务;
        sqlSession.commit();

        //第七步;关闭sqlSession会话;
        sqlSession.close();
    }
}

执行成功,那么也就说明这里外部资源配的没问题;

3.简易将执行语句提取工具类

SqlSessionFactory对象创建时的开销是比较大的;那么肯定不能一直去创建它,那就提取一份出来;创建一次就Ok;也不用考虑关闭它.;一个应用程序需要一个就够了

创建工具类 MyBatisUtils

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

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-25 20:21
 * 简易工具类;
 */
public class MyBatisUtils {
    //sqlSessionFactory提取出来;
    private static SqlSessionFactory sqlSessionFactory=null;

    static {
        Reader reader = null;
        try {
            //读取资源配置文件; -->注意导包为import org.apache.ibatis.io.Resources;
            reader = Resources.getResourceAsReader("mybatis-config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取sqlSessionFactory对象;
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }

    //获取sqlSession;
    public  static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

OK,试试;

package com.xiaozhi.test;

import com.xiaozhi.mapper.UserMapper;
import com.xiaozhi.pojo.User;
import com.xiaozhi.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-25 22:40
 */
public class Test3 {
    public static void main(String[] args) {
        //创建用户对象;
        User user = new User("小明","qwerdsa","陕西汉中");

        //使用工具类创建sqlSession;
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //获取代理对象;
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用方法;这里实际上会执行sql语句;
        mapper.addUser(user);
        //事务提交;
        sqlSession.commit();
        //关闭sqlSession;
        sqlSession.close();
    }
}

执行;使用成功

4.在框架中引入日志使用(本次学习主要使用log4j)

这个添加用户方法的话,他没返回值啊,控制台也看不出啥效果;那就给它加个打印日志吧;

当然,先去在maven项目的核心配置文件pom.xml中导入log4j的依赖jar坐标

<!--log4j日志包-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

然后,在resources目录下创建log4j.properties文件
注意文件的输出地址;我这的写入地址时是E盘下的logs文件夹

log4j.rootLogger = debug,stdout,D
#System out Console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

#System out File
log4j.appender.D = org.apache.log4j.FileAppender
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ] -[%l] %m%n

还有,去mybatis框架的核心配置文件mybatis-config.xml下配置日志;注意<settings>标签的位置哦
可以配置的值

SLF4J | LOG4J | LOG4J2 JDK_LOGGING
COMMONS_LOGGING STDOUT_LOGGING NO_LOGGING

本次使用的是LOG4J

<?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="database.properties">
    </properties>

    <settings>
        <!--配置日志-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>


    <!--配置别名-->
    <typeAliases>
        <!--为实体类User配置别名为user-->
        <typeAlias type="com.xiaozhi.pojo.User" alias="user"/>
    </typeAliases>

    <!-- environments 环境配置 , 这里的default来指定默认使用的环境变量 -->
    <environments default="development">

        <!-- environment 环境变量 ;可以写多个,尽量保证id不重名就行-->
        <!--开发的环境变量-->
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC">
            </transactionManager>
            <!--dataSource:数据源-->
            <dataSource type="UNPOOLED">
                <!--数据库驱动,url连接,数据库账户,密码-->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}"/>
                <property name="username" value="${username}" />
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

        <!--模拟测试的环境变量;-->
        <environment id="test">
            <!--事务管理-->
            <transactionManager type="JDBC">
            </transactionManager>
            <!--dataSource:数据源-->
            <dataSource type="UNPOOLED">
                <property name="driver" value="" />
                <property name="url" value=""/>
                <property name="username" value="" />
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <!--配置mapper映射-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

执行试试

package com.xiaozhi.test;

import com.xiaozhi.mapper.UserMapper;
import com.xiaozhi.pojo.User;
import com.xiaozhi.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-25 23:00
 */
public class Test4 {
    public static void main(String[] args) {
        //创建用户对象;
        User user = new User("阿杰","431231w","陕西汉中");

        //使用工具类创建sqlSession;
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //获取代理对象;
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用方法;这里实际上会执行sql语句;
        mapper.addUser(user);
        //事务提交;
        sqlSession.commit();
        //关闭sqlSession;
        sqlSession.close();
    }
}

控制台打印信息

电脑文件打印信息

5.Junit单元测试

有时候,考虑到发布的web项目调试时比较麻烦,比如说,你只是向试试某个sql的执行是否可行;但是要一层层的打开项目去调试,这样不论是时间上,还是任务量上,比较麻烦;
那么,就得试试不启动项目;直接先进行小测试;

当然,先去maven的核心配置文件pom.xml中导入依赖的jar坐标

<!--junit单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <!--这里的test标识,即表示它不会被打包-->
    <scope>test</scope>
</dependency>

test测试目录下的java目录下创建

package com.xiaozhi.mytest;

import com.xiaozhi.mapper.UserMapper;
import com.xiaozhi.pojo.User;
import com.xiaozhi.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

/**
 * @author by CSDN@小智RE0
 * @date 2021-10-25 23:14
 */

//本地测试
public class Test01 {

    //不用main方法;直接在要测试的方法上使用 @Test注解即可;
    @Test
    public void testAddUser(){
        //创建用户对象;
        User user = new User("点金手","431231w","四川成都");

        //使用工具类创建sqlSession;
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //获取代理对象;
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用方法;这里实际上会执行sql语句;
        mapper.addUser(user);
        //事务提交;
        sqlSession.commit();
        //关闭sqlSession;
        sqlSession.close();
    }
}

OK,有运行日志;

SQL也执行成功了;

以上是关于Mybatis框架学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis框架学习笔记

Mybatis框架学习笔记

Mybatis 学习笔记

Mybatis框架学习笔记

Mybatis框架学习笔记

mybatis学习笔记(一) for 概念