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

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

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

上一节已经介绍了开始使用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


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

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...