百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Mybatis3系列 - 2. MyBatis3入门,XML配置基础

bigegpt 2024-08-03 11:47 1 浏览

上一节已经介绍了开始使用MyBatis的简单使用条件. 这节就开始做一个最简单的入门和一些核心概念的说明.

准备项目:

准备数据库

数据库使用MySQL. 开发必备吧, 使用学习安装都很方便.

-- 创建数据库create database mybatis3;-- 创建用户表create table t_user( uid varchar(32), -- 主键 loginid varchar(32), -- 登录主键 uname varchar(64), -- 用户名称 pwd varchar(128), -- 登录密码 flag varchar(2), -- 有效标识 1 有效 0 无效 primary key(uid));

-- 插入数据, 这里密码暂时使用明码. 因为这个不是本次教程的重点.
insert into t_user(uid, loginid, uname, pwd, flag)
values('1', '1', '测试', '123', '1');

创建一个maven项目

<groupId>com.xymiao.mybatis3</groupId>
<artifactId>mybatis3_01_introduction</artifactId>
<version>0.0.1-SNAPSHOT</version>

并加入MyBatis的依赖

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

截图为了更好的展示. 上面的代码为了更好的复制. 当然在最下面还会加入github的地址.



大概的介绍一下流程

首先我们考虑一下, 我们使用JDBC的时候, 是怎么连接数据库的. 需要什么信息.

看驱动连接方法:

public static Connection getConnection(String url, String user, String password) throws SQLException 

需要知道, 连接的url地址, 连接的用户和密码. 并且也需要对应的驱动.

所有的框架不管是MyBatis也好, 还是Hibernate也好最终都是封装jdbc, 最终让你使用更方便. 去掉那些繁琐的重复性的操作. 只是有实现方式不同.

Hibernate封装的更加面向对象, 相对于MyBatis就相对轻量一些. 从这里理解, 可以知道只要jdbc需要的MyBatis一样也需要, 特别是配置连接.

毕竟, 我要和你握手, 你必须在我身边, 这样才能达到我们握手的基础条件.


加入实体类

实体类是为了更好的操作数据, 但是实体类不是MyBatis的唯一映射方式.

public class TUser {
  	private String uid;
  	private String uname;
  	private String pwd;
  	private String flag; 
  	private String loginid;
   // ... 省略getter setter
   }

配置文件

编写一个简单的配置文件信息.

文件内容如下:

<?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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis3?useUnicode=true&characterEncoding=UTF-8" />
				<property name="username" value="root" />
				<property name="password" value="xymiao" />
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="mapper/TUserMapper.xml" />
	</mappers>
</configuration>


配置文件的简单说明:

configuration

根配置为: configuration 这个是mybatis-3-config.dtd进行格式定义的. 必须以configuration 开始

详细的配置约束信息可以到mybatis-3.5.3.jar -> org.apache.ibatis.builder.xml -> mybatis-3-config.dtd 查看

environments

数据库环境配置. 可以进行多个环境配置. 每个配置都在 environment 中, 里面本次包含 transactionManager, dataSource 配置.

default

default属性是选择使用哪个配置进行连接. 对应 environment 的 id, 可以随意定义, 只要default中的值在environment 中id存在就可以.

transactionManager

transactionManager是配置事务管理器的类型,mybatis中有JDBC和MANAGED两种, JDBC是方式事务, 需要手动管理提交和回滚. MANAGED 是托管事务, 提交不需要再单独的编写提交和回滚代码.

dataSource

数据源配置, 类型包括: POOLED(数据池连接方式), UNPOOLED(非数据池连接方式), JNDI(可以简单的理解为外部数据源)

mappers

每一个MyBatis的数据库持久范围层都可以被称为一个mapper. 主要是用来指定对应的实体类的配置文件. 这里使用resource. 还可以使用url 和 class进行配置. 也可以进行包(package)指定.

分别的使用方式如下:

url方式: 不推荐使用这种方式, 开发人员想要路径一致比较困难. 实际开发中基本不会使用这种情况.

<mapper url="file:///[项目路径]\mybatis3_01_introduction\src\main\resources\mapper\TUserMapper.xml" />
  [项目路径]: 改成项目对应的路径

class方式: 如果使用class的方式, 必须让xml的路径和接口路径一致. 否则会出现错误

<mapper class="com.xymiao.mybatis3.mapper.TUserMapper" />

package name 方式: 如果使用package 的方式, 必须让xml的路径和接口路径一致. 否则会出现错误

<package name="com.xymiao.mybatis3.mapper"/>

本次使用 resource 的方式. 后续在实际开发中可以会使用package比较多一些, 特别和配合SpringMVC之后.


考虑清楚, 如果这个业务由你来做,你认为需要有什么样的东西才能支撑这个框架运行. 然后再和源代码进行比较. 更快的学习知识点.

配置Mapper

实体类有了, 配置文件也配置了. 现在我们看一下实体类的映射文件Mapper.->TUserMapper.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="com.xymiao.mybatis3.mapper.TUserMapper">
  	<select id="selectUser"
		resultType="com.xymiao.mybatis3.pojo.TUser">
  		select * from t_user where uid = #{uid}
	</select>
</mapper>

因为本次使用的是xml的配置方式, 所以对应的接口文件也需要加入. 加入: TUserMapper.java文件.

package com.xymiao.mybatis3.mapper;
import com.xymiao.mybatis3.pojo.TUser;
public interface TUserMapper {
  	TUser selectUser(String uid);
}

namespace:

在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。

命名空间的作用有两个,一个是利用更长的完全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。


现在我们基本上包含了我们能够访问数据库的基本配置信息.

MyBatis的配置文件: mybatis-config.xml MyBatis的配置文件

实体类: com.xymiao.mybatis3.pojo.TUser.java 映射与数据的数据模型

mapper文件: com.xymiao.mybatis3.mapper.TUserMapper.java 用来操作数据库

mapper.xml配置: mapper/TUserMapper.xml

所以, 我们需要进行一个测试类, 进行测试. 验证我们的编写是否正确.


编写测试 SqlSessionFactoryTest.java

首先需要注意; 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

代码如下:

现在可以直接执行该函数, 测试是否有异常, 如果没有任何提示错误, 就说明没有问题. 接着我们就编写具体的数据查询操作. MyBatis的数据SQL执行命令CURD, 都是由SqlSession进行操作. 既然有了SqlSessionFactory就可以很容易的获得SqlSession. 打开SqlSessionFactory接口, 我们查看其方法.

你会发现获得SqlSession的方法很多个. 我们使用默认的不带参数的.

代码如下:

SqlSession session = sqlSessionFactory.openSession();

因为该方法可能会出现异常, 这里直接使用try的方法访问. 这里我们需要获得我们要操作的mapper接口, 因为MyBatis的更新换代, 也出现了不同的方法进行查询数据, 先说第一种方式, 老的访问方式.

使用session的selectOne方法获取select的一条数据. 传入对应的mapper全名和对应的方法, 并传入对应的参数.

为什么通过传入对应的namespace + 方法或者并称作: 完全限定名, 就可以访问呢? 因为在MyBatis的一开始就把对应的mapper信息放到(Configuration)缓存中, 程序所有的执行不可能凭空出现, 一点是有地方进行了初始化才能进行执行并达到你要的效果. map.put("key", "封装的mapper相关信息!"); 模拟一下而已. key就是: com.xymiao.mybatis3.mapper.TUserMapper.selectUser, 这样就做到根据传入的字符串找到了需要处理的结果.


并且这里的selectOne其实也是执行了selectList 只不过取出来第一个值而已. 并且当数据大于1的时候, 就会报出异常.

最终输出对应的结果集.

当然既然说了第一种不推荐就有第二种写法:

这里看起来就舒服了很多根据反射机制, 通过执行是那个class. 进行反向得到需要操作的mapper文件. 这样我们就可以操作对应的方法. 得到对应的结果集. 这种出错率更加少一些. 看起来也更加舒服. 当然执行测试看到的效果也是一样的.

全部的代码如下:

package com.xymiao.mybatis3;
import java.io.IOException;
import java.io.InputStream;
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 com.xymiao.mybatis3.mapper.TUserMapper;
import com.xymiao.mybatis3.pojo.TUser;
public class SqlSessionFactoryTest {
  	public static void main(String[] args) throws IOException {
      		// 配置文件地址 根据/resources的root查找
      		String resource = "mybatis-config.xml";
      		InputStream inputStream = Resources.getResourceAsStream(resource);
      		// 创建一个session工厂.
      		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      		// 第一种方式, 推荐使用第二种
      		try (SqlSession session = sqlSessionFactory.openSession()) {
            		TUser tUser = (TUser) session.selectOne("com.xymiao.mybatis3.mapper.TUserMapper.selectUser", "1");
            		System.out.println(tUser);
           }
      		// 第二种方式, 推荐使用这种
      		try (SqlSession session = sqlSessionFactory.openSession()) {
            			TUserMapper mapper = session.getMapper(TUserMapper.class);
            			TUser tUser = mapper.selectUser("1");
            			System.out.println(tUser);
          }
      	}
}

到这里简单的一个基于xml配置MyBatis简单的应用已经成功. 接下来会讲解使用注解的方式如何实现以上的功能.


完整的代码已经上传到github.

github地址: https://github.com/xymiao/mybatis3

位于: https://github.com/xymiao/mybatis3/tree/master/mybatis3_01_introduction


希望能够给你带来一定的帮助. 感谢阅读. 来个关注不迷路.

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...