MyBatis框架学习笔记(一):MyBatis入门

1 MyBatis 介绍

1.1 官方文档

MyBatis 中文手册:

(1)https://mybatis.org/mybatis-3/zh/index.html

(2)https://mybatis.net.cn/

Maven 仓库:

https://mvnrepository.com/

仓库作用:需要什么 jar 包,搜索得到对应的 maven dependency

1.2 概述

1.2.1 为什么需要 MyBatis

传统的 Java 程序操作 DB 分析-工作示意图

1.2.2 MyBatis基本介绍

(1)MyBatis 是一个持久层框架

(2)前身是 ibatis, ibatis3.x 时,更名为 MyBatis

(3)MyBatis 在 java sql 之间提供更灵活的映射方案

(4)mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦

(5)mybatis 通过 SQL 操作 DB, 建库建表的工作需要程序员完成

1.2.3 MyBatis 工作原理示意图

 

MyBatis 快速入门

2.1 快速入门需求说明

要求: 开发一个 MyBatis 项目,通过 MyBatis 的方式可以完成对 monster 表的 crud 操作

2.2 快速入门-代码实现

(1) 创建 mybatis 数据库 - monster
CREATE DATABASE `mybatis`;
use `mybatis`;
CREATE TABLE `monster` (
`id` INT NOT NULL AUTO_INCREMENT, 
`age` INT NOT NULL, 
`birthday` DATE DEFAULT NULL, 
`email` VARCHAR(255) NOT NULL , 
`gender` TINYINT NOT NULL, 
`name` VARCHAR(255) NOT NULL, 
`salary` DOUBLE NOT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8

(2)创建 maven 项目, 方便项目需要 jar 包管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--1. 将mybatis作为父项目管理多个子模块/子项目2. 父项目的完整的坐标 groupId[组织名]+artifactId[项目名]3. 后面该父项目会管理多个子模块/子项目 , 将来父项目中的引入的依赖可以直接给子项目用, 这样开发简单,提高复用性,也便于管理4. <packaging>pom</packaging> 表示父项目以多个子模块/子项目管理工程--><groupId>org.example</groupId><artifactId>mybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!--modules指定管理的哪些子模块--><modules><module>mybatis_quickstart</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--加入依赖--><dependencies><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!--junit依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--如果这里有一个scope-test 表示该jar的作用范围在test目录 --><!--<scope>test</scope>--></dependency></dependencies><!--在build中配置resources,来防止我们资源导出失败的问题1. 不同的idea/maven 可能提示的错误不一样2. 不变应万变,少什么文件,就增加相应配置即可3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录的资源文件 xml 和 properties在build项目时,导出到对应的target目录下--><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources></build></project>

(3)创建子项目mybatis_quickstart

(4)子模块自动生成的pom文件如下

 (5)父项目自动对pom增加的内容如下

(6)在java目录下创建 com.entity.Monster.java

package com.entity;import java.util.Date;/*** Monster 和 monster表有对应关系*/
//1. 一个普通的Pojo类
//2. 使用原生态的sql语句查询结果还是要封装成对象
//3. 这里的实体类属性名和表名字段保持一致。
public class Monster {//属性-和表字段有对应关系private Integer id;private Integer age;private String name;private String email;private Date birthday;private double salary;private Integer gender;public Monster() {}public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {this.id = id;this.age = age;this.name = name;this.email = email;this.birthday = birthday;this.salary = salary;this.gender = gender;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}@Overridepublic String toString() {return "Monster{" +"id=" + id +", age=" + age +", name='" + name + '\'' +", email='" + email + '\'' +", birthday=" + birthday +", salary=" + salary +", gender=" + gender +'}';}
}

(7)在com包下创建一个mapper包,再在mapper包下创建一个接口 MonsterMapper

package com.mapper;import com.entity.Monster;import java.util.List;/*** 1. 这是一个接口* 2. 该接口用于声明操作monster表的方法* 3. 这些方法可以通过注解或者xml文件来实现*/
public interface MonsterMapper {//添加monsterpublic void addMonster(Monster monster);//根据id删除一个Monsterpublic void delMonster(Integer id);//修改Monsterpublic void updateMonster(Monster monster);//查询-根据idpublic Monster getMonsterById(Integer id);//查询所有的Monsterpublic List<Monster> findAllMonster();
}

(8)在mapper包创建xml文件 MonsterMapper.xml

(9)配置 MonsterMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--
1. 这是一个mapper xml 文件
2. 该文件可以去实现对应的接口的方法
3. namespace 指定该xml文件和哪个接口对应!!!
-->
<mapper namespace="com.mapper.MonsterMapper"><!--配置addMonster1. id="addMonster" 就是接口的方法名2. parameterType="com.entity.Monster" 放入的形参的类型3. 注意"com.entity.Monster" 可以简写为 "Monster"4. 写入sql语句5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值7. 这里 #{age} age 对应monster对象的属性名,其它一样--><insert id="addMonster" parameterType="com.entity.Monster" useGeneratedKeys="true" keyProperty="id">INSERT INTO `monster`(`age`, `birthday`, `email`, `gender`, `name`, `salary`)VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})</insert><!--配置/实现delMonster方法1. 这里 java.lang.Integer 这是Java类型, 可以简写成 Integer2. 这里写入delete--><delete id="delMonster" parameterType="Integer">DELETE FROM `monster` WHERE id = #{id}</delete><!--配置实现 updateMonster--><update id="updateMonster" parameterType="com.entity.Monster">UPDATE `monster`SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},`gender` = #{gender} , `name`= #{name}, `salary` = #{salary}WHERE id = #{id}</update><!--配置/实现getMonsterById--><select id="getMonsterById" resultType="com.entity.Monster">SELECT * FROM `monster` WHERE id = #{id}</select><!--配置/实现findAllMonster--><select id="findAllMonster" resultType="com.entity.Monster">SELECT * FROM `monster`</select>
</mapper>

(10)创建并配置 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置MyBatis自带的日志输出-查看原生的sql--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置别名--><typeAliases><typeAlias type="com.entity.Monster" alias="Monster"/></typeAliases><environments default="development"><environment id="development"><!--配置事务管理器--><transactionManager type="JDBC"/><!--配置数据源--><dataSource type="POOLED"><!--配置驱动--><property name="driver" value="com.mysql.jdbc.Driver"/><!--配置连接mysql-url1. jdbc:mysql 协议2. 127.0.0.1:3306 : 指定连接mysql的ip+port3. mybatis: 连接的DB4. useSSL=true 表示使用安全连接5. &amp; 表示 & 防止解析错误6. useUnicode=true : 使用unicode 作用是防止编码错误7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码8. 老韩温馨提示:不要背,直接使用即可--><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--1. 这里我们配置需要关联的Mapper.xml2. 这里我们可以通过菜单 Path from source root--><mappers><mapper resource="com/mapper/MonsterMapper.xml"/></mappers>
</configuration>

(11)创建 resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置MyBatis自带的日志输出-查看原生的sql--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--配置别名--><typeAliases><!--配置好别名之后,MonsterMapper.xml 文件中的 "com.entity.Monster" 就可以简写成 "Monster"--><typeAlias type="com.entity.Monster" alias="Monster"/></typeAliases><environments default="development"><environment id="development"><!--配置事务管理器--><transactionManager type="JDBC"/><!--配置数据源--><dataSource type="POOLED"><!--配置驱动--><property name="driver" value="com.mysql.jdbc.Driver"/><!--配置连接mysql-url1. jdbc:mysql 协议2. 127.0.0.1:3306 : 指定连接mysql的ip+port3. mybatis: 连接的DB4. useSSL=true 表示使用安全连接5. &amp; 表示 & 防止解析错误6. useUnicode=true : 使用unicode 作用是防止编码错误7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码--><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--1. 这里我们配置需要关联的Mapper.xml2. 这里我们可以通过菜单 Path from source root--><mappers><mapper resource="com/mapper/MonsterMapper.xml"/></mappers>
</configuration>

 (12)util.MyBatisUtils.java

package com.util;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;/*** MyBatisUtils 工具类,可以得到SqlSession*/
public class MyBatisUtils {//属性private static SqlSessionFactory sqlSessionFactory;//编写静态代码块-初始化sqlSessionFactorystatic {try {//指定资源文件, 配置文件mybatis-config.xmlString resource = "mybatis-config.xml";//获取到配置文件mybatis-config.xml 对应的inputStream//说明:加载文件时,默认到resources目录=>运行后的工作目录target-classesInputStream resourceAsStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);System.out.println("sqlSessionFactory="+ sqlSessionFactory.getClass());} catch (IOException e) {e.printStackTrace();}}//编写方法,返回SqlSession对象-会话public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}

 (13)建 src\test\java\com\mapper\MonsterMapperTest.java

package com.mapper;import com.entity.Monster;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;import java.util.Date;
import java.util.List;public class MonsterMapperTest {//属性private SqlSession sqlSession;private MonsterMapper monsterMapper;/*** 1. 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法* 2. 这里在测试的时候,可能小伙伴们会遇到一些麻烦,老师说了解决方案*///编写方法完成初始化@Beforepublic void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//获取到到MonsterMapper对象 class com.sun.proxy.$Proxy7 代理对象//, 底层是使用了动态代理机制monsterMapper = sqlSession.getMapper(MonsterMapper.class);System.out.println("monsterMapper=" + monsterMapper.getClass());}@Testpublic void addMonster() {for (int i = 0; i < 2; i++) {Monster monster = new Monster();monster.setAge(10 + i);monster.setBirthday(new Date());monster.setEmail("kate@qq.com");monster.setGender(1);monster.setName("大象精-" + i);monster.setSalary(1000 + i * 10);monsterMapper.addMonster(monster);System.out.println("添加对象--" + monster);System.out.println("添加到表中后, 自增长的id=" + monster.getId());}//如果是增删改, 需要提交事务if(sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("保存成功...");}@Testpublic void delMonster() {monsterMapper.delMonster(2);if(sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("删除成功...");}@Testpublic void updateMonster() {Monster monster = new Monster();monster.setAge(50);monster.setBirthday(new Date());monster.setEmail("king3@qq.com");monster.setGender(0);monster.setName("老鼠精-01");monster.setSalary(2000);monster.setId(3);monsterMapper.updateMonster(monster);if(sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("修改成功...");}@Testpublic void getMonsterById() {Monster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);if(sqlSession != null) {sqlSession.close();}System.out.println("查询成功~");}@Testpublic void findAllMonster() {List<Monster> monsters = monsterMapper.findAllMonster();for (Monster monster : monsters) {System.out.println("monster-" + monster);}if(sqlSession != null) {sqlSession.close();}System.out.println("查询成功~");}
}

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

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

相关文章

(三)前端javascript中的数据结构之集合

集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构&#xff0c;比较简单好理解&#xff0c;看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…

编程范式之函数式编程

目录 前言1. 函数式编程的定义2. 函数式编程的特点2.1 纯函数2.2 不可变性2.3 高阶函数2.4 惰性求值 3. 函数式编程的应用场景3.1 并行计算3.2 数据分析3.3 Web开发 4. 函数式编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 Haskell5.2 Scala5.3 Clojure 6. 示例代码结语…

HTML5新增的input元素属性:placeholder、required、autofocus、min、max等

HTML5 大幅度地增加与改良了 input 元素的属性&#xff0c;可以简单地使用这些属性来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 下面将详细介绍这些新增的 input 元素的属性。 属性说明属性说明placeholder在输入框显示描述性或提示性文本list为文本框添加选…

React+TS前台项目实战(二十七)-- 首页响应式构建之banner、搜索、统计模块布局

文章目录 前言一、 效果展示二、相关模块1. Statistic统计模块功能分析代码详细注释使用方式 2. Search搜索模块功能分析代码详细注释使用方式 3. banner模块功能分析代码详细注释使用方式 总结 前言 前面我们已经封装了这个项目基本要用到的全局组件了&#xff0c;现在就开始…

ScreenAI ——能理解从信息图表到用户界面的图像和文本算法解析

概述 论文地址&#xff1a;https://arxiv.org/pdf/2402.04615.pdf 信息图表&#xff08;图表、示意图、插图、地图、表格、文档布局等&#xff09;能够将复杂的数据和想法转化为简单的视觉效果&#xff0c;因此一直以来都被视为传播的重要元素。这种能力来自于通过布局和视觉线…

普通人必看!AI绘画商业变现全攻略(附教程)

大部分的设计师除了主业以外&#xff0c;都会利用空余时间去接单做副业。 单子包括但不限于产品/品牌LOGO、电商产品图设计、海报、室内设计图等等&#xff0c;单价在几十到上千不等 引起了我的思考&#xff0c;我们普通人有没有机会&#xff0c;也能像他们一样去接单赚钱吗&a…

pytorch- RNN循环神经网络

目录 1. why RNN2. RNN3. pytorch RNN layer3.1 基本单元3.2 nn.RNN3.2.1 函数说明3.2.2 单层pytorch实现3.2.3 多层pytorch实现 3.3 nn.RNNCell3.3.1 函数说明3.3.2 单层pytorch实现3.3.3 多层pytorch实现 4.完整代码 1. why RNN 以淘宝的评论为例&#xff0c;判断评论是正面…

matplotlib颜色对照表

matplotlib的色彩设置: #------------------------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------…

【JavaWeb】登录校验-会话技术(二)JWT令牌

JWT令牌 介绍 JWT全称&#xff1a;JSON Web Token &#xff08;官网&#xff1a;https://jwt.io/&#xff09; 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在&#xff0c;这些信息是可靠的。 简洁&#xff1a…

vue和react你怎么选择?

在选择Vue和React之间&#xff0c;其实没有一个绝对的“最佳选择”&#xff0c;因为这取决于你的项目需求、团队熟悉度、开发环境、以及你对这两个框架的个人偏好。下面是一些可以帮助你做出决策的因素&#xff1a; 1. 学习曲线 Vue&#xff1a;Vue的学习曲线相对平缓&#xf…

借助软件资产管理系统,优化Solidworks软件许可证管理

在当今数字化的企业环境中&#xff0c;软件许可证的有效管理对于业务的顺畅运行至关重要。然而&#xff0c;IT 运维部门常常面临着诸如用户部门 SW 许可证不够用、使用紧张等问题&#xff0c;而由于缺乏可靠的数据支持&#xff0c;难以准确判断许可证的短缺程度&#xff0c;这给…

MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍&#xff0c;如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3&#xff0c;利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包&#xff0c;并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

【linux高级IO(二)】多路转接之select详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 初识s…

SCI丨返修一作+通讯

中科四区&#xff0c;JCR2 返修转让一作通讯&#xff0c;5个月左右录用 题目&#xff1a;通过机器学习算法XXXXXXXxxx混凝土力学性能的可靠方法

苍穹外卖--完善登录功能:进行MD5加密

目标 TODO&#xff1a;使用MD5加密方式对明文密码。 实现 password DigestUtils.md5DigestAsHex(password.getBytes());

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

双向链表+Map实现LRU

LRU: LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。 核心思想&#xff1a; 基于Map实现k-v存储&#xff0c;双向链表中使用一个虚拟头部和虚拟尾部&#xff0c;虚拟头部的…

BioXcell—InVivoMAb anti-West Nile/dengue virus E protein

研发背景&#xff1a; 西尼罗河病毒(WNV)是一种由蚊虫类介导传播的黄病毒&#xff0c;与引起人类感染性流行病的登革热病毒、黄热病病毒和日本脑炎病毒密切相关。 WNV和登革热病毒(DENV)同属黄病毒科&#xff08;Flaviviridae&#xff09;黄热病毒属&#xff0c;是具有小包膜单…

【多模态】41、VILA | 打破常规多模态模型训练策略,在预训练阶段就微调 LLM 被证明能取得更好的效果!

论文&#xff1a;VILA: On Pre-training for Visual Language Models 代码&#xff1a;https://github.com/NVlabs/VILA 出处&#xff1a;NVLabs 时间&#xff1a;2024.05 贡献&#xff1a; 证明在预训练阶段对 LLM 进行微调能够提升模型对上下文任务的效果在 SFT 阶段混合…