mybatis学习(1)

news2025/2/23 18:46:58

使用mybatis也是有一段时间了,但是一直没有系统了解和学习,最近正好有空,索性花点时间熟悉下。

为什么是mybatis?

了解mybatis之前,需要知道什么是"数据库持久层",我的理解,就是将数据存储至存储介质设备(包括硬盘、磁带等)功能的框架。此处提及到数据库,那么最先联想到的就是直接SQL语句的增删改查功能,而早期JAVA语言中,用的最多的便是JDBC连接数据库操作,但是使用起来繁琐,并且如果切换数据库类型后,容易出现SQL语句不匹配的问题,这时候使用对象映射的方式,底层解决了不同数据库之间的语法兼容问题。类似的框架很多,hibernate也是其中的佼佼者,而今天我们主要学习下mybatis,之所以是用mybatis,主要因为她具备了一下优点:

  • 无需使用JDBC方式,减少了代码开发量
  • 非常简单的持久层框架,学习曲线低,容易上手
  • 语句与代码分离,SQL写在XML中,降低耦合
  • 提供各种强大的标签,方便注入使用,并支持对象ORM字段映射
  • 生态成熟,兼容多种数据库,并具有多种插件使用
  • 与spring框架能很好的集成

当然,网上提到了缺点:

  • 主要对于复杂的数据查询,需要手动编写,至于字段多这个问题,我觉得使用mybatis generater针对单表查询能提高不少效率,而针对特别复杂的查询,个人觉得项目中这部分的工作量还是较少的

安装mybatis

mybatis的地址:https://mybatis.github.io/mybatis-3/,帮助手册:https://mybatis.org/mybatis-3/zh/index.html。快速安装步骤如下:

一、安装依赖

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.11</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

二、添加配置

添加jdbc配置,jdbc.properties,配置信息如下:

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3388/db_ddyx?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.userId=root
jdbc.password=root

然后添加mybatis的配置文件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">
<!-- 注意顺序,否则报错:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)". -->
<!-- 具体标签使用请参考:https://mybatis.net.cn/configuration.html -->
<configuration>
    <!-- 引入配置文件,或者子元素中设置 -->
    <properties resource="jdbc.properties" />
    <!-- 配置信息 -->
    <settings>
        <!-- 打印查询日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <!-- 类型别名 -->
    <typeAliases>
        <typeAlias alias="User" type="tiny.mybatis2.models.User" />
    </typeAliases>
    <!-- 配置环境,可以支持多种不同的工作模式 -->
    <environments default="development">
        <!-- 配置开发环境 -->
        <environment id="development">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源,三种内建数据源:UNPOOLED、POOLED、JNDI -->
            <dataSource type="POOLED">
                <!-- 连接数据库的属性 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.connectionURL}"/>
                <property name="username" value="${jdbc.userId}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件 -->
    <mappers>
        <mapper resource="tiny.mybatis2.mapper/UserMapper.xml"/>
    </mappers>
</configuration>

当然上面只使用了常见的一些配置,如果需要查看详细的配置说明,可以查看官方文档,查看详情。

三、编写对象interface

在tiny.mybatis2.mapper包中,编写对应接口,代码如下:

package tiny.mybatis2.mapper;

import tiny.mybatis2.models.User;
import java.util.List;

public interface IUserMapper {
    /**
     * 获取所有用户
     * @return
     */
    List<User> findAll();

    /**
     * 获取某个用户
     * @param uid
     * @return
     */
    User findOne(String uid);
}

上面定义了最简单的对象操作方法,如果需要更复杂的方法,进行扩展即刻。

四、编写对象model

接下来编写映射对象,内容如下:

package tiny.mybatis2.models;

import java.io.Serializable;

public class User implements Serializable {
    private int uid;
    private String mobile;
    private String unick;

    @Override
    public String toString(){
        return getClass().getSimpleName() +
            "[" +
            "uid = " + uid +
            ", mobile = " + mobile +
            ", unick = " + unick +
            "]";
    }
}

此对象可以在映射文件中使用,作为返回类型。

五、编写映射XML文件

此处我们简单的编写了一个xml文件,位置为:tiny.mybatis2.mapper,内容如下:

<?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="tiny.mybatis2.mapper.IUserMapper">
    <select id="findAll" resultType="tiny.mybatis2.models.User">
        select * from g2_user
    </select>
    <select id="findOne" resultType="tiny.mybatis2.models.User" parameterType="string">
        select * from g2_user where uid = #{uid}
    </select>
</mapper>

上面为最简单的演示,如果需要更复杂的查询,可以查看帮助文档:帮助详情

六、测试调用

为了方便获取SqlSession,撰写了SqlSessionUtils工具类:

package tiny.mybatis2.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;

public class SqlSessionUtils {
    public static SqlSession getSqlSession(){
        //-------- 从XML中构建SqlSessionFactory --------
        SqlSession session = null;
        try {
            SqlSessionFactory factory  = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
            //-------- 不使用XML构建SqlSessionFactory,参考官网 -------
            /*
            DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            Environment environment = new Environment("development", transactionFactory, dataSource);
            Configuration configuration = new Configuration(environment);
            configuration.addMapper(BlogMapper.class);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
            */
            //从SqlSessionFactory获取SqlSession
            session = factory.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return session;
    }
}

然后使用test文件调用:

package tiny.mybatis2;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import tiny.mybatis2.mapper.IUserMapper;
import tiny.mybatis2.models.User;
import tiny.mybatis2.utils.SqlSessionUtils;

import java.util.List;

public class TestDemo {
    @Test
    public void testFindAll() {
        SqlSession session = SqlSessionUtils.getSqlSession();
        IUserMapper userMapper = session.getMapper(IUserMapper.class);
        //测试数据
        List<User> users = userMapper.findAll();
        for(User item: users){
            System.out.println(item.toString());
        }
        session.close();
    }

    @Test
    public void testFindOne() {
        SqlSession session = SqlSessionUtils.getSqlSession();
        IUserMapper userMapper = session.getMapper(IUserMapper.class);
        User user = userMapper.findOne("10010680");
        if(user != null){
            System.out.println(user);
        }else{
            System.out.println("result is empty");
        }
    }
}

Run “TestDemo”,结果如下:

在这里插入图片描述
至此,mybatis的简单使用完毕,以上代码已上传至github上,传送门:点击打开。

下一篇,来学习一下如何集成mybatis进去到spring中,正常使用中,我们一般都会将mybatis和其它框架一起使用,现在很少自己手动去配置,当然之所以学习基础用法,也是在我们遇到比较复杂的场景之下,可以通过已掌握的知识深入定制,而达到我们的目的。

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

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

相关文章

Decoder与Encoder重要组件

Decoder与Encoder重要组件 大家知道&#xff0c;Netty从底层Java通道读到ByteBuf二进制数据&#xff0c;传入Netty通道的流水线&#xff0c;随后开始入站处理。在入站处理过程中&#xff0c;需要将ByteBuf二进制类型&#xff0c;解码成Java POJO对象。这个解码过程&#xff0c…

【Python基础篇020】网络编程初识

文章目录 &#x1f9a0;一、前言 &#x1f9a0;二、软件开发架构 &#x1f340;2.1、C/S架构 &#x1f340;2.2、B/S架构 &#x1f340;2.3、服务端与客户端 &#x1f9a0;三、ip与端口号 &#x1f340;3.1、IP地址与端口号常识 &#x1f340;3.2、MAC和IP的概念与不同…

实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码)

目录 数据增强 &#x1f4cc; 技术介绍 &#x1f4cc; 手动数据处理&增强 &#x1f4cc; 基于 TensorFlow 的数据增强 Dropout 随机失活 &#x1f4cc; 技术介绍 &#x1f4cc; 基于TensorFlow应用Dropout &#x1f4a1; L1 和 L2 正则化 &#x1f4cc; 技术介绍 …

Mybatis日志框架

文章目录一、 用日志打印代替sout1、sout有什么问题①问题1&#xff1a;I/O影响性能②问题2&#xff1a;无法统一管理③问题3&#xff1a;显得你很low2、使用日志框架的好处①设定级别&#xff0c;统一管理②灵活指定输出位置③自定义日志格式④基于日志分析问题二、最佳用法1、…

设计模式之【单例模式】全解,单例模式实现方式,暴力打破单例模式与解决方案,你真的认识单例模式吗?

文章目录什么是单例模式单例模式的应用场景处理有线程冲突的资源表示全局唯一类单例模式的实现方式1、饿汉式之静态常量2、饿汉式之静态代码块3、懒汉式之线程不安全方式&#xff08;不推荐&#xff09;4、懒汉式之加锁方式&#xff08;不推荐&#xff09;5、懒汉式之双重锁检查…

波司登的高端化后遗症

&#xff08;题图&#xff09; 文|螳螂观察 作者| 青月 受“三重”拉尼娜现象的影响&#xff0c;2022年冬天可能会因为阶段性冷空气的影响出现阶段性低温&#xff0c;且极端寒潮爆发的可能性大。 极端天气越来越多&#xff0c;年年冷冬&#xff0c;有望催化以羽绒服为代表的…

【uni-app从入门到实战】打包

小程序打包发布 1、小程序的打包发布很简单&#xff0c;只需要将程序运行到微信开发者工具中&#xff0c;然后点击右上角的上传按钮即可 我们这里的上传按钮不能点击是因为没有配置微信小程序AppID 打开项目的 manifest.json&#xff0c;选中微信小程序配置&#xff0c;填入微…

Java并发编程——线程间通信

线程间通信一、volatile 关键字二、等待/通知机制三、管道通信四、Thread.join一、volatile 关键字 为什么volatile关键字可以&#xff1f;因为之前说过了&#xff0c;此关键字能保证变量的可见性&#xff0c;也就是说变量一旦被修改&#xff0c;立马能被其他线程所感知 例子如…

拓端tecdat|R语言代做泰坦尼克号随机森林模型案例数据分析

全文链接&#xff1a;http://tecdat.cn/?p4281 原文出处&#xff1a;拓端数据部落公众号 视频&#xff1a;从决策树到随机森林&#xff1a;R语言信用卡违约分析信贷数据实例 从决策树到随机森林&#xff1a;R语言信用卡违约分析信贷数据实例&#xff0c;时长10:11 如果我们对…

Linux:环境变量

基本概念 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。 环境变量通常具有某些特殊用途&#xff0c;通常具有全局特性&#xff0c;可以被子进程继承下去 常见的环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中…

[Linux]----文件操作(复习C语言+文件描述符)

文章目录前言一、基础概念二、回顾C语言2.1 对文件进行写操作2.2 追加写文件2.3 读文件2.4 简易cat功能总结stdin&stdout&stderr打开文件的方式三、系统文件I/O接口介绍open介绍使用open接口closewriteread四、文件描述符先验证0,1,2就是标准的IO标准输入流标准输出流标…

基于寄生-捕食算法的函数寻优算法

文章目录一、理论基础1、寄生-捕食算法&#xff08;1&#xff09;初始化&#xff08;2&#xff09;筑巢阶段(鸟窝)&#xff08;3&#xff09;寄生阶段(乌鸦-布谷鸟)&#xff08;4&#xff09;捕食阶段(乌鸦-猫)2、PPA算法伪代码二、仿真实验与结果分析三、参考文献一、理论基础…

QCC51XX---QACT用户指南

更新记录链接:QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 QACT安装包不要放在有中文路径下,否则—直会安装报错。适用V7,V7.1 V7.2版本 打开QACT. 打开QACT. 点击 connection configuration 进去之后 点击1,然后点2,选择kalaccess.dll文件, workspace …

【C++】vector的模拟实现不会怎么办?看过来

&#x1f308;欢迎来到C专栏~~vector的模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort&#x1f393;&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1f914;&…

MySQL是如何保证主从一致的

一&#xff1a;什么是binlog Binary log(二进制日志)&#xff0c;简称Binlog。 Binlog是记录所以数据表结构变更以及表数据修改的二进制日志&#xff0c;不会记录select和show这类操作。Binlog是以事件形式记录&#xff0c;还包括语句所执行的消耗时间。Binlog是MySql Server自…

0082 时间复杂度,冒泡排序

/* * 排序也称排序算法&#xff08;Sort Algorithm&#xff09; * 排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 * * 排序分类 * 1.内部排序&#xff1a;将需要处理的所有数据都加载到内存存储器中进行排序&#xff08;使用内存&#xff09; * 插…

Keil MDK的sct分散加载文件详解

sct 分散加载文件简介 MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File&#xff0c;scatter loading)&#xff0c;链接器根据该文件的配置分配各个节区地址&#xff0c;生成分散加载代码&#xff0c;因此我们通过修改该文件可以定制具体节区的存…

Spring源码:Spring源码阅读环境搭建

本篇内容包括&#xff1a;Mac 环境下 gradle 的安装和配置、源码克隆、新建测试类&#xff0c;测试Spring源码 等内容&#xff01; 第一步&#xff1a;Mac 环境下 gradle 的安装和配置 1、下载安装包 # 到 GitHub 的 Spring 仓库选定 Spring 版本&#xff0c;查看对应版本 Sp…

Linux项目自动化构建工具make/makefile

1.背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计其数&#xff0c;其按类型&#xff0c;功能&#xff0c;模块分别放在若干目录中&#xff0c;makefile定义了一系列的规则来制定&#xff0c;那些文件需要先编译&a…

C艹笔记--面向对象程序设计

文章目录类与对象简介类与结构的区别定义成员函数继承继承小总结[C中::和:&#xff0c; .和->的作用和区别](https://zhuanlan.zhihu.com/p/165992745)符号::和&#xff1a;的作用和区别:::一般用来表示继承符号.和->的作用和区别#include#include""和#include…