Java学习之MyBatis

2023-10-26

1、与其他的ORM框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联,MyBatis提供了默认情况下基于Java HashMap的缓存实现。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

MyBatis 最强大的特性之一就是它的动态语句功能。

2、参考简单demo先把一个简单demo跑起来,再来细看原理。

3、demo中是用SqlSession实例来直接执行在User.xml文件中映射的 SQL 语句,但是还有比这更简单的方法,使用合理描述参数和SQL语句返回值的接口(比如:IUser.class),这样现在就可以不使用类似User.xml配置文件,至此更简单,代码更安全,不容易发生的字符串文字和转换的错误。

项目结构如下:

Configure.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>
	<typeAliases>
		<typeAlias alias="User" type="com.yiibai.mybatis.models.User" />
	</typeAliases>
	<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/ckfmybatis" />
			    <property name="username" value="root" />
			    <property name="password" value="123456" />
                       </dataSource>
		</environment>
	</environments>

	<mappers>
	     <!-- // power by http://www.yiibai.com 
	     <mapper resource="com/yiibai/mybatis/models/User.xml" />-->
	</mappers>
</configuration>

User.java:

package com.yiibai.mybatis.models;

public class User {
	private int id;
	private String name;
	private String dept;
	private String phone;
	private String website;
	
	public String getWebsite() {
		return website;
	}
	public void setWebsite(String website) {
		this.website = website;
	}
	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 getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	
}

HelloWorld.java:

import java.io.Reader;

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.yiibai.mybatis.models.User;
import com.yiibai.mybatis.dao.IUser;

/**
 * 
 * @author yiibai
 * @copyright http://www.yiibai.com
 * @date 2015/09/22
 */
public class HelloWord {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;
    static {
        try {
            reader = Resources.getResourceAsReader("config/Configure.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            sqlSessionFactory.getConfiguration().addMapper(IUser.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }

    public static void main(String[] args) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUser iuser = session.getMapper(IUser.class);
            User user = iuser.getUserByID(1);
            System.out.println("名字:"+user.getName());
            System.out.println("所属部门:"+user.getDept());
            System.out.println("主页:"+user.getWebsite());
        } finally {
            session.close();
        }
    }

}

IUser.java:

package com.yiibai.mybatis.dao;
import org.apache.ibatis.annotations.Select;
import com.yiibai.mybatis.models.User;

public interface IUser {
	@Select("select * from user where id=#{id}")
	public User getUserByID(int id);
}

4、MyBatis的CURD操作。

5、多表映射:在Java实体对象对中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合来加以实现。多表映射的多对一关系要用到 mybitis 的 association 来加以实现。

6、分页查询:

 

例如,在数据库的某个表里有1000条数据,我们每次只显示100条数据,在第1页显示第0到第99条,在第2页显示第100到199条,依次类推,这就是分页。

分页可以分为逻辑分页和物理分页。逻辑分页是我们的程序在显示每页的数据时,首先查询得到表中的1000条数据,然后成熟根据当前页的“页码”选出其中的100条数据来显示。

物理分页是程序先判断出该选出这1000条的第几条到第几条,然后数据库根据程序给出的信息查询出程序需要的100条返回给我们的程序。

MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据 offset 和 limit 截断记录返回。

为了在数据库层面上实现物理分页,又不改变原来 MyBatis 的函数逻辑,可以编写 plugin 截获 MyBatis Executor 的 statementhandler,重写SQL来执行查询。

经常搭框架的人应该都清楚,框架搭建的核心就是配置文件。

7、mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:

1. if 语句 (简单的条件判断)
2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
5. set (主要用于更新时)

6. foreach (在实现 mybatis in 语句查询时特别有用)

 

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

Java学习之MyBatis 的相关文章

随机推荐

  • 分号与逗号的区别及举例_顿号和逗号的区别

    顿号和逗号的区别2019 09 24 14 26 33文 宋则贤 顿号和逗号指代不同 顿号是并列的词或词组之间的停顿 逗号把句子切分为意群 表示小于分号大于顿号的停顿 顿号和逗号在用法上也有所不同 一 总的要求 字数较多时 用逗号 字数较少
  • React——路由Route

    文章目录 路由 一 Web 分类 前端渲染与后端渲染 二 Route 介绍 三 安装环境 四 Route 组件介绍 五 Route 组件应用 六 路由的前端渲染 七 url 中传递参数 1 斜杠型参数化路由 2 问号型参数化路由 八 重定向
  • VS2015项目属性配置中的变量设置

    关于VS的项目属性配置 很长时间都没有去细究关于各种定义的意义 比如说 outDir这样的东西以前没有细细追究过原因 这次都一并做个记录 1 常规页签 是对各个变量的解释输出目录 OutDir 中间目录 IntDir 目标文件名 Targe
  • 【个人笔记】一篇搞定js异步输出问题-浅分析(好理解)

    小试牛刀 来几个简单的异步问题引出易错小知识点 一 Promise Question1 new Promise resolve gt console log promise then function console log promise
  • PyQt5-窗口

    分类 在Qt中 生成窗口有三种方式 QWidget QMainWindow QDialog QWidget 控件和窗口的父类 自由度高 什么都东西都没有 没有划分菜单 工具栏 状态栏 主窗口 等区域 import sys from PyQt
  • uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

    uint8 t uint16 t uint32 t uint64 t 都是别名 c语言中有哪些数据类型 怎么样取别名 在C语言中有6种基本数据类型 short int long float double char 1 数值类型 1 整型 s
  • 57黑马QT笔记之数据库的语句执行--插入(包括SQL语句的增删改查和复制表结构)

    57黑马QT笔记之数据库的语句执行 插入 概念 1 回滚 也就是我们常见的事务回滚 例如当我要删除某个数据库时 我开启了一个事务 然后再弹出一个对话框给你 是否提交事务 或者作出事务的回滚 也就是说取消了这个删除的操作 并不会执行到删除数据
  • 奇偶排序算法

    在数组中重复两趟扫描 第一趟扫描选择所有的数据项对 a j 和 a j 1 j 是奇数 j 1 3 5 如果它们的关键字的值次序颠倒 就交换它们 第二趟扫描对所有的偶数数据项进行同样的操作 j 0 2 4 6 重复进行这样两趟的排序直到数组
  • 手把手教!搭建自己的免费服务器

    最近总是想搭建自己的网站 奈何皮夹里空空如也 服务器也租不起 更别说域名了 于是我就寻思能否自己搭建个服务器 还不要钱呢 还真行 经过几天的冲浪 我发现有两个免费的建站工具 Apache 和 Nginx 由于两个工具建站方法差不多 所以我就
  • koordinator混部系统实验分享

    简介 官网 https koordinator sh koordinator 是一个基于 qos 的 kubernetes 混合工作负载调度系统 它旨在提高对延迟敏感的工作负载和批处理作业的运行时效率和可靠性 简化与资源相关的配置调整的复杂
  • 安卓apk从浏览器下载后安装提示程序包解析异常处理!

    1 网上的处理一般都是如何适配安卓7 0 解决7 0的适配 而导致包解析异常 这个不多讲 主要说自己遇到的这点 如图 在mainfist配置清单中加上目标版本号和最小版本号即可优美解决
  • Java 判空新写法!干掉 if else !

    在文章的开头 先说下NPE问题 NPE问题就是 我们在开发中经常碰到的NullPointerException 假设我们有两个类 他们的UML类图如下图所示 在这种情况下 有如下代码 user getAddress getProvince
  • html中使行级标签隐藏显示出来,HTML标签显示类型

    HTML标签显示类型 HTML5学堂 码匠 依据HTML标签默认显示效果的不同 可以将HTML5标签简单的分为三大类 需要注意 在实际的分类中 并不仅仅是三类 一类是块状元素 一类是行元素 其他的元素显示类型较多 可以统一归为一类 在各类标
  • “面试造飞机,上岗拧螺丝“?2023软件测试岗面试真题超全面整理(最新版)

    软件测试这个岗位 想要找到一份高薪的工作 离不开繁杂的面试程序 这相信是很多准备应聘软件测试岗的朋友难题 很多已经在职多年的软件测试工程师对于这个岗位面试都谈虎色变 那么 为什么软件测试岗位的面试这么难呢 第一 软件测试属于互联网IT行业
  • 禁止本地中断

    禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制 这个机制的意义是 即使当硬件设备产生了一个IRQ信号时 中断禁止也让内核控制路径继续执行 因此 这就提供了一种有效的方式 确保内核控制路径中的一些中断处理程序能访问的数据结
  • mes系统和plc通讯案例_MES系统与PLC数据集成主要方式

    现在工业化在迅速的发展 当然在发展过程中是离不开系统和软件的辅助 其中MES系统 ERP软件 PLC数据集成对企业有重要作用 那么MES系统与PLC数据集成主要方式有哪些 方式1 定期抓取数据 因为现在生产设备参数都是模拟量 数值一直在不停
  • CGI详解(原理,配置及访问)

    一 基本原理 CGI 通用网关接口 Common Gateway Interface 是一个Web服务器主机提供信息服务的标准接口 通过CGI接口 Web服务器就能够获取客户端提交的信息 转交给服务器端的CGI程序进行处理 最后返回结果给客
  • Java构造多边形的各点坐标合理性判断并抛出异常

    好久没有发过文章了 今天心情好 分享以下今天的java作业吧 题目要求是 构造多边形 并在点无法构造多边形时抛出对应的异常原因 直接上代码 1 构造点坐标 public class Point public int x y public P
  • React Native入门系列:创建我的第一个RN Project

    一 前言 1 准备 在创建RN之前 我们需要先安装相应的工具和搭建环境 可以参考我上一篇文章 React Native入门系列 如何搭建RN环境 Windows篇 2 目标 本章例子中文章达到目标 创建RN项目步骤 在创建中遇见的问题解决
  • Java学习之MyBatis

    1 与其他的ORM框架不同 MyBatis并没有将Java对象与数据库表关联起来 而是将Java方法与SQL语句关联 MyBatis提供了默认情况下基于Java HashMap的缓存实现 每个MyBatis应用程序主要都是使用SqlSess