MyBatis 快速学习01:第一个程序

2023-11-04

目录

MyBatis简介

什么是MyBatis

为什么需要MyBatis

MyBatis框架部署

项目目录结构

搭建实验数据库

创建maven项目

添加mybatis依赖

编写mybatis配置文件

编写MyBatis工具类

创建实体类

编写DAO接口

编写mapper配置文件

注册mapper文件

测试

maven静态资源导出问题


MyBatis简介

什么是MyBatis

MyBatis中文网https://mybatis.net.cn/

  • MyBatis是一款优秀的持久层框架

  • MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程

  • MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java实体类映射成数据库中的记录

持久化

持久化就是将程序数据在持久状态和瞬时状态间转换的机制

  • 把数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中,或保存在磁盘文件、XML数据文件中等。

  • JDBC、文件IO就是一种持久化机制。

为什么需要持久化?内存缺陷所致

  • 内存断电后数据会丢失,但有一些对象是不能丢失的,如银行账号。

  • 即使对象不需要永久保存,也会因内存容量限制不能一直保存在内存中。

持久层

  • 完成持久化工作的代码块(Java中的DAO层)。

  • 用来操作数据库存在的。

为什么需要MyBatis

  • 帮助开发者将数据存入数据库、从数据库取出数据。

  • 简化JDBC操作,通过框架减少代码量,提高开发效率。

  • MyBatis是一个半自动化的ORM框架

    ORM (Object Relation Mapping) 对象关系映射,将Java中的一个对象与数据表中的一行数据一一对应。ORM框架提供了实体类与数据表的映射关系,通过映射文件的配置实现对象的持久化。

  • MyBatis特点:

    • 简单易学:通过文档和源代码可以比较完全的掌握其设计思路和实现。

    • 灵活:不会对程序或者数据库的现有设计产生影响,sql语句写在XML文件中便于管理和优化。

    • 解除sql与程序代码的耦合:通过DAO层将业务逻辑和数据访问逻辑分离,使系统设计更清晰,提高可维护性。

    • 支持XML和注解配置方式自定义完成ORM操作,实现结果映射。

MyBatis框架部署

项目目录结构

搭建实验数据库

CREATE DATABASE `mybatis`;
USE `mysql`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`, `name`, `pwd`) 
VALUES (1, '阿大', '123456'),(2, '二郎神', 'abcdef'),(3, '三圣母', '654321');

创建maven项目

  • Java项目

  • Web项目

添加mybatis依赖

在pom.xml中添加依赖

<dependencies>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>

编写mybatis配置文件

<?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"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSl=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="admin123"/>
            </dataSource>
        </environment>
    </environments>
​
</configuration>

编写MyBatis工具类

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 MyBatisUtil {
​
    private static SqlSessionFactory sqlSessionFactory;
​
    //读取配置文件
    static {
        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    //获取sqlsession连接
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
​
}

创建实体类

public class User {
    private int id;
    private String name;
    private String pwd;
​
    //无参构造
    public User() {
    }
    //有参构造
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
​
    //toString
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
    
    //get/set方法
    public int getId() {
        return id;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getPwd() {
        return pwd;
    }
​
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

编写DAO接口

import java.util.List;
public interface UserDAO {
​
    public List<User> queryAll();
​
}

编写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="com.qgc.dao.UserDAO">
    <resultMap id="useMap" type="com.qgc.pojo.User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="pwd"/>
    </resultMap>
    <!-- 查询全部用户 -->
    <select id="queryAll" resultMap="useMap">
        select * from user;
    </select>
​
</mapper>

注册mapper文件

在mybatis-config.xml文件中

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSl=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="admin123"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 注册mapper文件 -->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"></mapper>
    </mappers>

</configuration>

测试

<!-- 添加junit依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
import com.qgc.pojo.User;
import com.qgc.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
​
import java.util.List;
​
public class UserDAOTest {
​
    @org.junit.Test
    public void queryAll() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
        
        List<User> queryAll = userDAO.queryAll();
        
        for (User user : queryAll) {
            System.out.println(user);
        }
        
        sqlSession.close();
    }
}

控制台输出:

maven静态资源导出问题

 我们写的配置文件一般多在resources,但有时为了方便管理,不止在resources中写入配置文件,也可能在src文件里面进行配置文件的置入,而当我们将配置文件写入到src文件时则无法导出到target,而导致程序发生错误

 在pom.xml中加入以下代码

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

学习了MyBatis之后,再也不用写原生的JDBC代码了(2022-2-16)

【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis 快速学习01:第一个程序 的相关文章

  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • vue文件下载

    1 创建下载按钮
  • pidstat命令详解

    一 命令介绍 pidstat是sysstat工具中的一个命令 用于监控进程的cpu 内存 线程 IO及上下文切换等系统资源的占用情况 格式 pidstat options
  • SpringCloud-注册中心简单了解与使用

    前言 什么是SpringCloud 什么是微服务 能干什么 为什么要用SpringCloud 注册中心 什么是SpringCloud 大家都知道SpringCloud是一种微服务架构 模式 SpringCloud简单来说就是微服务架构技术落
  • ArrayList非线程安全记录

    一 问题描述 线上一个查询服务 偶尔会报一次查询出来的结果集合包含null 二 问题排查 在多线程查询过程中 使用了ArrayList 多线程查询出来后执行ArrayList add 然而ArrayList并不是线程安全的集合 会导致nul
  • linux红帽8怎么安yum,RedHat Linux 8本地Yum源配置方法

    1 挂载系统光盘到 mnt cdrom目录 mkdir p mnt cdrom mount dev sr0 mnt cdrom 2 设置系统启动后将光盘自动挂载到 mnt cdrom echo dev sr0 mnt cdrom iso96
  • 电商数据分析实战第一篇——客户消费行为分析

    一 分析背景 为了提高店铺的收益 进行准确的客户运营策略 使用店铺201910至202002的销售数据进行分析 根据客户的消费趋势 消费习惯把握客户的消费现状和心理 挖掘出高价值用户群体 完善销售运营策略 简单说明一下 客户分析包括基本属性
  • Upload LABS Pass-8

    第八关在后端使用了黑名单 并过滤了大小写 点以及空格 但并未过滤数据流 我们使用代理拦截请求 在文件后缀名中添加数据流 绕过黑名单 准备一个 8 php 文件 内容为一句话木马 上传 8 php 文件 并使用代理 此处使用 Burp Sui
  • JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中 使用到JSON进行数据的传递 特别是从前端传递到后台 前台可以直接采用ajax的data函数 按json格式传递 后台Request即可 但有的时候 需要传递多个参数 后台使用request进行接收 有时传递了几个数值 还好
  • 嵌套和递归使用模板类

    嵌套和递归使用模板类 模板栈 模板数组 栈中嵌套数组 数组中嵌套栈 数组中嵌套数组 模板栈 pragma once include
  • 计算机网络——网络层

    这篇文章是计算机网络系列文章的第三篇 计算机网络 物理层 计算机网络 数据链路层 计算机网络 网络层 计算机网络 传输层 计算机网络 应用层 序言 计算机网络中的网络层在当今的社会起到了什么作用 现在的互联网通信 远程办公和远程教育 电子商
  • 基于Dragonboard 410c进行开发的远程遥控机器人(三)

    前面说过 买的camera的夹层板要直接连到410c开发板上 这样96boards 就没有接口去连接了 无奈 智能自己飞线了 开始还担心 这样连接板子会不会出问题 经过最终的验证 发现是可以的 完全没有影响 接下来看一下最后的验证 图 远程
  • 安卓keytool获取不到签名文件的MD5

    目前通过 keytool list v keystore xxx jks 这种方法获取签名的md5时 只能显示SHA1和SHA256 不显示md5 解决办法 1 先将自己的keystore配置进app下的build gradle中 2 打开
  • 关键字参数和可选参数

    通常Fortran的实参和形参的参数数量以及类型必须是匹配的 但是如果过程接口是显式的 那么就可以改变参数表中调参数的顺序 或为过程的某些iochengde形参特别指定实参 通过将过程放在模块中 并在调用程序中用use关联访问模块 可以显式
  • C#中的BeforeFieldInit

    今天学习设计模式中的单例模式 无意间发现了这个标志BeforeFieldInit 于是简单地搜索了一下 总结出如下内容 The C specification states The static constructor for a clas
  • Doris--基础--11--动态分区

    Doris 基础 11 动态分区 1 介绍 对表级别的分区实现生命周期管理 TTL 减少用户的使用负担 1 1 功能 动态添加分区 动态删除分区 1 2 原理 在某些使用场景下 用户会将表按照天进行分区划分数据 在没有动态分区功能的时候 用
  • 2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学B组试题B杨辉三角形

    这题目很简单 问题是细节处理处理很重要 在蓝桥杯省赛中你只要搞对一两道题目就有省三了 实施代码 include
  • 做PPT设计半年赚8万,我是怎样做到的?

    下班做PPT 半年赚8万是什么感觉 你好 我是佳佳 一个用PPT兼职赚钱的宝妈 我现在每天抽2个小时 坐在电脑前 把各种素材像拼图一样拼接一下 像这样 然后把成稿投稿到设计平台 就能赚到钱 你是不是觉得 我是个职业设计师 挺厉害的 不是的
  • java 抽象类初始化_java-抽象类初始化

    我有一个抽象类 abstract class Shape public String color public Shape public void setColor String c color c public String getCol
  • 脚本自动化部署docker微服务,取代Jenkins

    由于Jenkins容器化部署 容器容器之间拷贝文件及其繁琐 如果在Jenkins部署在系统外层也需要配置复杂的流程才能实现微服务的自动化部署 本文主要通过脚本方式取代Jenkins实现自动化部署 脚本方式简单快捷 可以快速实现微服务部署 升
  • MyBatis 快速学习01:第一个程序

    目录 MyBatis简介 什么是MyBatis 为什么需要MyBatis MyBatis框架部署 项目目录结构 搭建实验数据库 创建maven项目 添加mybatis依赖 编写mybatis配置文件 编写MyBatis工具类 创建实体类 编