MyBatis学习:MyBatis中简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务

本文主要是介绍MyBatis学习:MyBatis中简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、本篇博客的背景和目的

目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,稍详细介绍了MyBatis框架,初步建立了一个使用MyBatis和MySQL的Maven项目。本篇博文记录一下简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务。

2、我的上一篇博文

我本专栏的上一篇博文详细记录了仅使用MyBatis+MySQL创建一个简单Maven项目的过程和代码,有兴趣的读者可以转到下面的链接上去:

MyBatis学习:仅使用MyBatis+MySQL创建一个Maven项目_你是我的日月星河的博客-CSDN博客icon-default.png?t=M666https://blog.csdn.net/weixin_46281472/article/details/125830619

3、MyBatis中配置使用STDOUT_LOGGING日志

首先说一下什么是日志?为什么使用日志?

日志,我本人初次听到这个词,还是看小说的时候,在有关航海的内容中看到的这个词。船长需要记录航海日志,也就是航海过程中发生了什么,船航行的情况。

同样的道理,在我们软件程序中的日志概念,也是指记录软件运行的过程发生了什么。

日志有什么作用呢?日志可以打印在控制台上面,也就是在控制台上显示程序经过了那些执行步骤。我们程序员看这些打印出来的执行步骤,可以指导程序执行到哪一步了,执行了那些步骤,每一个执行步骤之间的关系等.......。查看日志,也可以帮助程序员更快的排查程序中的错误。

MyBatis中的STDOUT_LOGGING日志:

MyBatis作为一个持久层框架,它允许我们配置日志,打印出这个框架内部执行的情况,这些都在官网有专门的介绍,下面我截取一张图:

 可以看到,MyBatis支持5中日志方式,Log4j在新版本中废弃了,不知道目前市面上使用情况怎么样。无论是使用SLF4J还是Log4j,Log4j2,都需要配套写properties配置文件。本篇博文我不涉及这三类

看图片中的最后两行,我们可以通过MyBatis的总配置文件配置日志功能。使用STDOUT_LOGGING这个值是比较简单的,只需要在XML配置文件中写上图片中示例那样的代码就可以了。

下面是我的示例代码(这里我使用的还是我上一篇博文写的项目代码):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    下面设置一下日志,一定要在最上面, 其实我们可以按着Ctrl键,鼠标左击configuration标签,进去看它规定的标签顺序--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager>
<!--            下面是配置一下数据源,其实后面我们就不这样配置了,都在.yml文件中配置--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=Hongkong&amp;allowMultiQueries=true"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>
<!--   用于指定其它mapper.xml文件的位置,也就是路径这个路径是从target/classes根路径开始的,也即是com/**/**/这样的使用注意:使用 / 分隔路径;一个mapper标签指定一个文件;--><mappers><mapper resource="com/dcy/dao/StudentDao.xml"></mapper></mappers>
</configuration>

注意看我代码中的注释:settings标签放在最上面。

下面是我运行Main方法进行测试执行SQL语句,在控制台打印的日志信息截图(执行的代码还是我上一篇博文中Main方法的代码):

解释一下上面的日志信息: 首先是打开了JDBC连接,然后创建了连接对象477376212。然后设置了自动提交为false,也就是关闭了自动提交事务。然后准备好了我们代码中执行的SQL语句。然后准备好了参数:1004,是字符串的形式。最后返回了执行结果。最后重新设置了自动提交事务。关闭了数据库连接,将连接放回了连接池。

4、简单使用占位符#

MyBatis中的占位符是使用在mapper.xml配置文件中的SQL语句里面的。基于这样的需求:我们有时候执行SQL语句,需要SQL语句里面有查询条件或者插入一条信息的时候,需要我们像传参一样将条件信息或要插入的信息传递给SQL语句,不能将SQL语句写死。所以,就出现了占位符这样的一个概念。

下面直接看我的代码,首先是mapper.xml里面的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.dcy.dao.StudentDao">
<!--
select标签表示的是查询操作,里面是查询语句。
id属性的值是SQL语句的唯一标识,是一个自定义的字符串。
按照编码规范,这里统一推荐使用dao接口中对应的方法名称。
resultType属性是表示执行SQL语句后,结果对应那个类型的JAVA对象。resultType的值是某个实体类的全限定名称。
比如:com.dcy.domain.Student
--><select id="selectStudentById" resultType="com.dcy.domain.Student">
<!--select id,name,email,age from student where id=1001-->
select id,name,email,age from student where id=#{studentId}</select>
</mapper><!--最上面的四行代码是固定的。1、http://mybatis.org/dtd/mybatis-3-mapper.dtd  这个是约束文件。约束文件也就是规定了这个XML文件中可以使用那些标签,标签之间的嵌套顺序是什么,标签中可以有哪些属性。这是一个约束文件的链接,我们可以在浏览器中访问,最后下载下来的。2、<mapper>标签是根标签,其中的namespace属性是必须有的,不能为空,并且在整个项目中是唯一的。推荐使用这个文件所对应Dao接口的全限定路径,也就是com.**.**.**这样的形式它的作用是参与识别SQL语句的。3、在mapper标签里面就可以写select,insert,update,delete标签,里面就写对应的SQL语句就可以了。当然,里面还可以写resultMap标签,就是对应属性名和数据表列名的。这个后面详细说。-->

在SQL语句中,在查询条件里面使用了占位符#,studentId类似于方法的形参名。

然后我们在Main方法中进行测试的代码如下:

package com.dcy;import com.dcy.domain.Student;
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;public class Starter {public static void main(String[] args) throws IOException {/*myBatis的核心类是SqlSessionFactory就是需要我们加载一下主配置文件,有点像我们使用SpringMVC加载spring.xml配置文件或者BeanFactory对象一样。这些在官网是有的。*///定义主配置文件的目录,从类路径开始:com/**/**这样的,如果是在resources目录下,那就是 **/**/String config="mybatis.xml";//下面读取主配置文件,使用MyBatis框架中的Resources类InputStream inputStream = Resources.getResourceAsStream(config);//下面创建SqlSessionFactory对象,使用的是SqlSessionFactoryBuilder类,需要用到上面的inputStream参数SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//MyBatis最终执行SQL语句,使用的是SqlSession类中的方法。SqlSession实例的获得,依靠的是SqlSessionFactory类。//下面获取SqlSession对象,SqlSession是接口SqlSession session = sqlSessionFactory.openSession();//指定要执行的SQL语句的id//SQL语句的id=namespace+"."+SQL语句所在标签的id属性的值String SQLID="com.dcy.dao.StudentDao"+"."+"selectStudentById";//通过SqlSession对象的方法执行SQL语句
//        Student student = session.selectOne(SQLID);  //这个是没有使用占位符,没有传参的Student student=session.selectOne(SQLID,"1004");//这个我们给了SQL语句参数,XML里面使用了占位符#System.out.println(student);//最后我们关闭SqlSession对象session.close();}
}

我们在执行SQL语句的时候,除了给执行方法SQL语句的“地址”以外,还给了SQL语句中需要的参数,这个参数是会替换  #{studentId}  的。

关于占位符的知识,这里只是简单的使用了一下,我本专栏后面的博文中还会详细记录到的。

5、MyBatis的自动提交事务和手动提交事务的概念

自动提交事务:当你的SQL语句执行完毕以后,就会提交事务。这个时候数据的更新操作就直接保存到数据库了。

手动提交事务:在你需要提交事务的位置,写上代码,执行方法,提交事务或者回滚事务。

MyBatis默认使用的是手动提交事务,我们可以通过XML配置文件将事务提交的类型设置为自动提交事务。

如果是手动提交事务,如果我们执行了一个insert或者是update语句,忘记了写代码执行方法来提交事务,那么这条数据就不会被插入到数据库中。这个是需要注意的,我下面会记录到。

6、手动提交事务

我们在mapper.xml文件中写一条insert语句,然后使用Main方法测试执行一下,没有提交事务,代码如下(预期结果应该是会执行成功,但是不会写入到数据中):

XML文件中的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.dcy.dao.StudentDao">
<!--
select标签表示的是查询操作,里面是查询语句。
id属性的值是SQL语句的唯一标识,是一个自定义的字符串。
按照编码规范,这里统一推荐使用dao接口中对应的方法名称。
resultType属性是表示执行SQL语句后,结果对应那个类型的JAVA对象。resultType的值是某个实体类的全限定名称。
比如:com.dcy.domain.Student
--><select id="selectStudentById" resultType="com.dcy.domain.Student">
<!--select id,name,email,age from student where id=1001-->
select id,name,email,age from student where id=#{studentId}</select><insert id="insertStudent">insert into student values (1005,'丽风姿','haha@qq.com',22)</insert>
</mapper><!--最上面的四行代码是固定的。1、http://mybatis.org/dtd/mybatis-3-mapper.dtd  这个是约束文件。约束文件也就是规定了这个XML文件中可以使用那些标签,标签之间的嵌套顺序是什么,标签中可以有哪些属性。这是一个约束文件的链接,我们可以在浏览器中访问,最后下载下来的。2、<mapper>标签是根标签,其中的namespace属性是必须有的,不能为空,并且在整个项目中是唯一的。推荐使用这个文件所对应Dao接口的全限定路径,也就是com.**.**.**这样的形式它的作用是参与识别SQL语句的。3、在mapper标签里面就可以写select,insert,update,delete标签,里面就写对应的SQL语句就可以了。当然,里面还可以写resultMap标签,就是对应属性名和数据表列名的。这个后面详细说。-->

Main方法中的测试代码:

package com.dcy;import com.dcy.domain.Student;
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;public class Starter {public static void main(String[] args) throws IOException {/*myBatis的核心类是SqlSessionFactory就是需要我们加载一下主配置文件,有点像我们使用SpringMVC加载spring.xml配置文件或者BeanFactory对象一样。这些在官网是有的。*///定义主配置文件的目录,从类路径开始:com/**/**这样的,如果是在resources目录下,那就是 **/**/String config="mybatis.xml";//下面读取主配置文件,使用MyBatis框架中的Resources类InputStream inputStream = Resources.getResourceAsStream(config);//下面创建SqlSessionFactory对象,使用的是SqlSessionFactoryBuilder类,需要用到上面的inputStream参数SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//MyBatis最终执行SQL语句,使用的是SqlSession类中的方法。SqlSession实例的获得,依靠的是SqlSessionFactory类。//下面获取SqlSession对象,SqlSession是接口SqlSession session = sqlSessionFactory.openSession();//指定要执行的SQL语句的id//SQL语句的id=namespace+"."+SQL语句所在标签的id属性的值String SQLID="com.dcy.dao.StudentDao"+"."+"insertStudent";//通过SqlSession对象的方法执行SQL语句
//        Student student = session.selectOne(SQLID);  //这个是没有使用占位符,没有传参的Integer row=session.insert(SQLID);//这个我们给了SQL语句参数,XML里面使用了占位符#System.out.println("影响的行数是"+row);//最后我们关闭SqlSession对象session.close();}
}

控制台执行结果,包括日志:

不出所料,这样即使执行成功了,数据库中的数据也是没有得到更新的,这里我不截取数据库的内容了。 

我们对Main方法做一下改变,就是在执行SQL语句的方法后面加上代码:session.commit(),意思就是提交一下事务,这样就可以更新到数据库了。修改后Main方法代码如下:

package com.dcy;import com.dcy.domain.Student;
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;public class Starter {public static void main(String[] args) throws IOException {/*myBatis的核心类是SqlSessionFactory就是需要我们加载一下主配置文件,有点像我们使用SpringMVC加载spring.xml配置文件或者BeanFactory对象一样。这些在官网是有的。*///定义主配置文件的目录,从类路径开始:com/**/**这样的,如果是在resources目录下,那就是 **/**/String config="mybatis.xml";//下面读取主配置文件,使用MyBatis框架中的Resources类InputStream inputStream = Resources.getResourceAsStream(config);//下面创建SqlSessionFactory对象,使用的是SqlSessionFactoryBuilder类,需要用到上面的inputStream参数SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//MyBatis最终执行SQL语句,使用的是SqlSession类中的方法。SqlSession实例的获得,依靠的是SqlSessionFactory类。//下面获取SqlSession对象,SqlSession是接口SqlSession session = sqlSessionFactory.openSession();//指定要执行的SQL语句的id//SQL语句的id=namespace+"."+SQL语句所在标签的id属性的值String SQLID="com.dcy.dao.StudentDao"+"."+"insertStudent";//通过SqlSession对象的方法执行SQL语句
//        Student student = session.selectOne(SQLID);  //这个是没有使用占位符,没有传参的Integer row=session.insert(SQLID);//这个我们给了SQL语句参数,XML里面使用了占位符#session.commit();//提交一下事务System.out.println("影响的行数是"+row);//最后我们关闭SqlSession对象session.close();}
}

这样,刷新一下数据库,可以在数据库中看到数据了。

7、我的下一篇博文

这篇关于MyBatis学习:MyBatis中简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206713

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;