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框架学习笔记的主要内容,如果未能解决你的问题,请参考以下文章