Java高效率复习-MyBatis[MyBatis]

news2024/11/20 20:18:38

前言

ORM是持久化映射框架,但是MyBatis的本质并不是ORM框架。

如何使用MyBatis执行数据库语句

依赖导入

首先如果是Maven工程,则导入JDBC的依赖以及MyBaits的核心依赖。

<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

这里顺手导入了单元测试的依赖,方便我们运行测试效果。
如果是普通的Java工程,则使用Jar包也是可以的,对于SSM框架的学习还是只建议使用Maven工程去学习。

配置文件

MyBatis需要核心配置文件,最简单的核心配置文件就是三大部分:
事务管理器

<transactionManager type="JDBC"/>

数据源

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

上面两个部分都是在环境标签元素里声明定义的

<environments default="development">
    <environment id="development">
    <!-- 包含着事务管理和数据源 -->
    事务管理...
    数据源...
    </environment>
</environments>

映射文件管理

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

上面只是单个Mapper文件的管理,可以改为package,也就是包级别的管理,不论是别名还是映射文件等等,都可以使用包级别的管理,如果使用了包级别的管理,则MyBatis会自动起别名,别名是类名的驼峰。
上面三大部分以及父标签都是在configuration标签中,该标签英译是配置。

<configuration>
	环境配置...
		事务管理...
		数据源...
	映射文件复数
		映射文件单数...	
</configuration>

定义Mapper映射文件

该文件第一行是一个mapper标签,该标签有一个属性就是namespace,该属性代表唯一命名空间。

<mapper 
namespace="com.atguigu.mybatis.
mappers.UserMapper">
</mapper>

该标签的命名空间应该和我们定义的Mapper接口的路径相同,这样方便后续的整合,也比较规范。
在mapper标签里,我们可以定义基本的增删改查标签

<insert id="insertUser">
    insert into t_user values(null,'admin','12456',23,'男','12345@qq.com')
</insert>
<update id="updateUser">
    update t_user set username = 'root',password = '123' where id = 3
</update>
<delete id="deleteUser">
    delete from t_user where id = 3
</delete>
<!-- 这里的resultType是别名类型,如果不是别名则要写全类名才行 -->
<select id="getUserById" resultType="user">
    select * from t_user where id = 1;
</select>
<select id="getAllUser" resultType="user">
    select * from t_user
</select>

上面的MapperXML文件并没有什么特殊的,就是唯一命名空间+SQL语句标签的id,让MyBatis来调用。

定义Mapper接口

该接口上面提到了,应该和MapperXML文件的唯一命名空间相同,也就是全类名等于XML文件的唯一命名空间,而该XML文件里定义的SQL语句标签的id则应该和该接口里的方法名相同。

public interface UserMapper {
    int insertUser();
    void updateUser();
    void deleteUser();
    User getUserById();
    List<User>getAllUser();
}

上面是个接口,方法名要和MapperXML文件里的SQL标签id的命名一样。

MyBatis的测试调用准备

经过上面的核心配置文件、MapperXML文件、Mapper接口的配置后,我们可以进行测试了。
在Maven工程的test目录下创建一个测试类,该类使用单元测试直接,此处的方法需要加载MyBatis核心配置文件(获取核心配置文件的输入流),然后通过MyBatis的SqlSessionFactoryBuilder来创建对象创建工厂类,然后再通过该类来获取实际的SqlSession对象,我们操作MyBatis的核心就是SqlSession类。

SqlSessionFactoryBuilder
	SqlSessionFactory
		SqlSession(构造器可传入布尔值)
			sqlSession.insert()...selectOne()...
			sqlSession.getMapper(Class.class)...
				sqlSession.commit()...如果构造器是true,此代码则无须声明
				sqlSession.close()...

上面的流程是固定的,所以建议写一个工具类来稳定获取SqlSession,前面两个类都是我们获取SqlSeesion的一个流程而已。
下面演示工具类。

public class SqlSessionUtil {
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            sqlSession = sqlSessionFactory.openSession(true);

        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
        return sqlSession;
    }//咱们就别写必然的close了,因为要用,而不是获取一个熄火的sqlSession
}

MyBatis的执行测试

经过上面的流程,我们获取了MyBatis的核心操作对象:SqlSession对象。
我们通过SqlSession来调用我们在Mapper接口和Mapper配置文件声明的SQL语句,有两种方式:
第一种:使用原生的方法操作

int result = 
sqlSession.insert(MapperXML命名空间+SQL标签的id);

第二种:使用代理类产生接口实现类操作

UserMapper mapper = sqlSession.getMapper(Mapper接口类的class对象);
var mapper =  sqlSession.getMapper(Mapper接口类的class对象);

在实际的应用中,我们一般都使用的是第二种,而且后续还会有使用注解来实现操作,所以肯定是首选第二种方式,不过第二种方式的源码其实底层实现就是使用的第一种方式。

额外扩展:添加日志功能介绍

日志功能有很多框架,这里我们用的是log4j,日志的意义就是输出一些信息,信息中会有实际执行的sql语句,以及参数的信息。
在这里插入图片描述

添加流程:增加日志功能的依赖

我们现在pom文件里添加log4j的依赖:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

如果是java工程,则自己去下载其jar包,然后添加jar包依赖就行了,不过比较麻烦和可能有不显示的bug。

添加流程:增加日志功能的配置文件

该文件的文件名也是固定的,叫log4j.xml,该文件的内容也是固定的,我们先复制粘贴用着就行了,就别去纠结内容了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis"><level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

日志功能添加的总结

这个添加日志功能的流程确实简单,也就两步,但是核心配置文件肯定是不容易看懂的,不过在初学者阶段,就不要纠结太多固定并且常用的内容了,自己知道有这回事情就行了,日志功能在MyBatis的执行测试里充当着额外信息的提供者,是非常重要和必要的功能扩展,只有拥有了日志信息,我们在后续的关系关联查询中才能看出来不同设置带来不同的流程效果,因为可能它们的运行结果是相同的,但是流程是可能不一样并且差距很大的。

MyBatis的标签元素使用记录

为类声明别名

我们如果没有声明别名,则每次都需要使用全类名+id来定位,这样即麻烦又冗余,所以我们可以在核心配置文件中进行类型声明。
如果是接口类的别名,则在核心配置文件中增加标签元素typeAlias标签元素。

<!-- 要是不指定alias则就是默认是类名,不区分大小写 -->
<typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"></typeAlias>

有了该别名,我们在XML文件中将resultType或reusltMap那些要用到java类型的地方就可以替换成该声明的别名,十分的方便和实用。
如果是多个类都要起别名,并且这些类都在pojo包下等等情况,我们则可以用另一种形式来指定别名:

<!-- 该包下的全部类都将拥有默认的别名,不区分大小写 -->
<package name="com.atguigu.mybatis.pojo"/>

数据源的优化配置

这里意思就是,我们在dataSource中的property标签元素的优化,是这样的首先前面的name标签属性是不变的,value的赋值改为:${key}的形式,来赋值,该形式可以用properties文件,没错,在jdbc也这么使用过的。
但是在使用该语法前,需要在核心配置文件中添加properties元素标签,在resource属性中指定properties文件的路径,一般我们都用相对路径就行了,该文件普遍都和核心配置文件以及日志配置文件放在resources目录里。

<properties resource="jdbc.properties"/>

这里有一个标签顺序需要注意。properties 声明在environments和typeAliases前面,所以typeAliases是在properties 后面的,这里只是将三个标签元素,如果有其他标签元素,则顺序另谈,经过上面的标签元素设置,我们才可以去value值进行${value}形式的赋值。
jdbc文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=password

修改语法的dataSource子元素

<!-- 语法:${key}
其实和Map集合差不多 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

Mappers文件配置和一些设置

我们如果是单个配置的话,就是在Mappers里定义一个mapper,然后mapper的resource指定Mapper文件的路径,如果有很多个Mapper文件都需要加载管理,则这种写法是行不通的。
单个Mapper文件引入的写法

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

通过包级进行引入加载管理

<mappers>
    <!--
    使用包的方式引入映射文件,需要必须满足两个条件:
    1、mapper接口和映射文件所在的包必须一致
    2、mapper接口的名字和映射文件的名字必须一致
    资源文件肯定创建不了包(package)因为不是java级的嘛
    不过包在磁盘上的本质就是一个目录,所以我们这里创建目录即可
    包语法:com.atguigu...
    目录语法:com/atguigu...
    创建完毕后,将mapper文件移动到该目录里,往后都是这样写的,mappers文件夹就可以删除掉了
    -->
    <package name="com.atguigu.mybatis.mappers"/>
</mappers>

在这里插入图片描述
java是存放我们的java程序源码的,resources是存放我们的配置文件的,它们编译后都放在了同一个文件里,在Maven中,tagert表示编译目录,这里面存放了类编译和Jar包依赖等等,我们打开tagert的这个目录来验证它们编译后被放在了一起的理论。
在这里插入图片描述
所以这也是上面使用包引入的必须条件。

在IDEA里创建文件模板

我们每次创建核心配置文件或者Mapper文件时,这些文件的基本必要内容都是我们需要去官方或者其他网站上获取的,这样很麻烦,我们可以在IDEA里创建文件模板来进行保存,每次使用直接创建该文件模板的文件即可。
流程演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的name只是模板的名字,我们在新建该模板文件时的文件名依然是要自己指定的,java是文件后缀,我们这里要改成xml
文件代码模板记录
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="jdbc.properties"/>
    <typeAliases>
        <package name=""/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
    <mappers>
        <package name=""/>
    </mappers>
</configuration>

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

上面的两个文件其实就是文件必备约定等等设置和官方定义的必要根标签元素。

MyBatis获取参数的五种情况

MyBatis通过#{}或者${}来获取参数,两者区别不大,只是${}需要手动添加单引号,不过在某些场景,只能使用${},用的最多的还是#{},#{}表示的是占位符,${}则直接是直接量或者引用的值。

第一种

该情况是如果SQL语句只设置了一个字面量,那么此时不论是#{}还是${}的名称都随意设置

select * from t_user where username = ${'abc'}

第二种

如果有多个字面量,则需要使用MyBatis提供的两种参数获取方式,第一种是arg0、arg1…的方式来获取,根据声明顺序排序,第二种是param1、param2…的方式来获取,该方式和第一种没有区别,只是MyBatis分两种形式所保存的Map集合。

<!-- select * from t_user where username  = #{arg0} and password = #{arg1} -->
select * from t_user where username  = #{param1} and password = #{param2}

第三种

第三种则是自定义一个Map数组,然后把这个Map数组作为参数传递进去,此时我们就可以根据自定义的Map数组的key来取value的值。

Map<String,Object>map = new HashMap();
map.put("username","admin");
map.put("password","123456");
select * from t_user where username  = #{username} and password = #{password}

这种只是自定义了key而已。

第四种

第四种则是使用实体对象,就是把类对象作为参数,获取参数的方式就是获取类的属性,类属性相当于成员变量+setter+getter的JavaBean规范。

User user = 
new User(null,"root","123456",33,"女","123@qq.com"); 
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})      

上面的#{}里的变量应该是POJO里定义的属性。

第五种

第五种使用了注解,该注解为@Param()。该注解的本质就是,当MyBatis将我们传入的参数保存时不再以arg或param的形式保存,而是以我们注解里声明的名称作为key来保存value的值,也就是说还是保存在了Map里,但是key是我们定义注解的值。

User checkLoginByParam(@Param("username") String username,@Param("password") String password);

这种方法不需要写arg或param这种可读性差的字面量,也不用手动做map放进去,而无须必须创建一个对象去赋值。
第五种是最常用和实用的方式了。

//命名参数,MyBatis封装参数时,根据我们注解的命名进行封装
User admin = mapper.checkLoginByParam("admin", "123456");

p26

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Struts2漏洞 - Struts2-015 Struts2-016 Struts2-045

文章目录Struts2简介Struts2历史漏洞Struts2历史漏洞发现Struts2框架识别Struts2历史漏洞利用Struts2-015漏洞简介影响范围环境搭建漏洞复现Struts2-016漏洞简介影响范围环境搭建漏洞复现Struts2-045漏洞简介影响范围环境搭建漏洞复现Struts2简介 Apache Struts是美国阿帕奇&a…

制造管理系统在企业生产中的应用——百数制造系统

随着经济全球化程度的加深&#xff0c;企业对信息化的需求大大增加&#xff0c;对信息的集成度和管理要求也更加严格&#xff0c;信息化已经成为制造企业持续提升核心竞争力的必然趋势。数字化的制造管理系统在多年前一出现就赢得不少企业管理者的认可&#xff0c;再加上数字化…

Spark的宽窄依赖

依赖关系 RDD会不断进行转换处理&#xff0c;得到新的RDD 每个RDD之间就产生了依赖关系 窄依赖 一个Stage内部的计算都是窄依赖的过程&#xff0c;全部在内存中完成 定义&#xff1a;父RDD的一个分区的数据给子RDD的一个分区【不需要调用Shuffle的分区器】 特点&#xff1a; …

浅谈ReentrantLock的公平锁和非公平锁的区别

前言 最近在看java并发编程这本书&#xff0c;已经看了点ReentrantLock的源码&#xff0c;以及之前有面试官问&#xff0c;公平锁和非公平锁有啥区别&#xff0c;我就只是从源码层面说了一下区别&#xff0c;但在性能上也有区别&#xff0c;今天就来说道说道。 公平与非公平 …

Exponentiation

Exponentiation is a mathematical operation, written as bn, involving two numbers, the base b and the exponent or power n, and pronounced as “b (raised) to the (power of) n”.[1] When n is a positive integer, exponentiation corresponds to repeated multipli…

Mac卸载mysql并重新安装mysql

一、Mac卸载mysql 1、在系统偏好设置找到MySQL服务—>停止 2、打开终端 sudo rm /usr/local/mysql sudo rm -rf /usr/local/var/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/My* vim /etc/ho…

财务分析和经营分析有什么区别和联系

财务分析是基础&#xff0c;经营分析是建立在财务分析基础之上的专项分析。财务分析做诊断&#xff0c;经营分析要治病。财务分析旨在通过财务指标发现和洞察问题&#xff0c;经营分析针对财务分析发现的问题进行深入的重点分析&#xff0c;以解决最终问题为目标。 财务分析 -…

世界上最伟大最邪恶的软件发明

有这么一个伟大而“邪恶”的软件发明&#xff0c;它被安装在超过10亿台电脑中&#xff0c;每天被使用超过3000万次。世界上几乎每个组织都在使用它&#xff0c;不仅有大大小小的公司&#xff0c;还有企业家、艺术家、非营利组织、学校、政府和宗教领袖&#xff0c;它已经成了公…

Allegro如何翻转PCB视图操作指导

Allegro如何翻转PCB视图操作指导 Allegro可以翻转PCB的视图,利于查看和检查,如下图 翻转前:器件和走线在bottom层 翻转后:走线和器件仍然在bottom层,但是视图翻转了 具体操作如下

高等数学(第七版)同济大学 习题11-2 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题11-2 函数作图软件&#xff1a;Mathematica 1.设L为xOy面内直线xa上的一段&#xff0c;证明&#xff1a;∫LP(x,y)dx0.\begin{aligned}&1. \ 设L为xOy面内直线xa上的一段&#xff0c;证明&#xff1a;\int_{L}P(x, \ …

【运维有小邓】Active Directory的NTFS权限报表程序

使用此简化的NTFS权限工具分析和优化共享权限和访问控制列表&#xff08;ACL&#xff09;。 ADManager Plus是我们的Active Directory管理和报表解决方案&#xff0c;可以兼用作共享文件夹权限报表工具。它提供预定义的报表&#xff0c;以查看&#xff0c;分析和修改NTFS并共享…

CSS -- 07. CSS3新特性汇总(属性选择器,结构伪类,伪元素,过渡效果,动画,2D3D转换效果)

文章目录CSS 3的新特性1 CSS 3的现状2 属性选择器3 结构伪类选择器3.1 选择第n个孩子3.2 nth-child(n)3.3 nth-of-type()3.4 nth-child和nth-of-type的区别3.5 结构伪类选择器小结4 伪元素选择器4.1 案例&#xff1a;经过盒子显示遮罩层4.2 伪元素清除浮动5 CSS 3盒子模型6 CSS…

比较叶绿体基因组提供海草适应性进化新见解

一、摘要 海草是生活在热带和亚热带地区的海洋开花植物&#xff0c;所有海草物种都是从陆地单子叶植物进化而来的&#xff0c;是研究植物对海洋环境适应的重要材料。本研究对三个鳗草属海草的叶绿体基因组&#xff08;cpGenomes&#xff09;进行测序&#xff0c;分析、比较三者…

Python图形用户界面(GUI)编程之wxPython入门

图形用户界面主要是方便用户操作&#xff0c;Python开源的GUI类库还是蛮多的&#xff0c;这里介绍一款在Python语言中的一套优秀的GUI图形库&#xff0c;而且是跨平台的&#xff0c;现今支持的平台有&#xff1a;32/64位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac …

如何解密PDF文件?这些解密方法快来收藏

有时候我们为了确保PDF文档不被他人随意查看&#xff0c;会对文档进行加密操作。但如果需要给某位同事查看的话&#xff0c;就需要每次输入密码才能查看文档&#xff0c;那你们知道PDF文档解密怎么弄吗&#xff1f;今天给大家分享几种实用的PDF解密技巧&#xff0c;有需要的小伙…

同为(TOWE)远程智能防雷预警监测——交直流遥信防雷配电柜

当前&#xff0c;社会各领域中各类先进的电子仪器广泛分布于每一个角落&#xff0c;由于高精尖电子设备的高度集成化&#xff0c;其耐压水平普遍较低&#xff0c;导致雷电流、浪涌侵入设备的风险越来越高&#xff0c;故需要在重要设备前端加装浪涌保护器&#xff08;SPD&#x…

vue3项目打包部署到Tomcat(亲测有效)

首先&#xff0c;要确保电脑上已经安装了jdk&#xff0c;还有Tomcat&#xff0c;而且都安装正确。 jdk下载与安装教程&#xff08;win10&#xff09; Tomcat 9.0 安装及配置教程(win10系统) Vue项目在VScode里面可以通过npm run serve可以正常运行。 下面是打包部署到tomca…

单体优先的微服务架构

作者&#xff1a;Martin Fowler 译者&#xff1a;林宁 当听说有团队在使用微服务架构时候&#xff0c;我注意到了一些规律&#xff1a; 几乎所有成功应用微服务的系统&#xff0c;都来自于一个过大单体项目拆分而来。几乎所有我听到过一开始就选择使用微服务架构的系统&#x…

【软件测试】测试开发?开发一个自动化测试系统如何做?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 当我们开始分析一个…

ADI Blackfin DSP处理器-BF533的开发详解67:PCM的播放(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了打开代码工程目录下的“test.snd”文件&#xff0c;并读取 6MB 的数据到内存中&#xff0c;然后将内存中的数据进行循环…