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. 示例代码结语…

Java中常见的消息中间件有哪些,各自的优缺点是那些?

1、ActiveMQ 优点&#xff1a; Apache基金会开发的开源消息中间件&#xff0c;支持JMS规范。 提供多种集群模式和高可用机制。 易于使用&#xff0c;并且与多种编程语言交互良好。 缺点&#xff1a; 在处理大量消息和并发连接时&#xff0c;性能可能不如其他中间件。 对于大型…

状态模式在金融业务中的应用及其框架实现

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态的相关行为分离到独立的状态类中&#xff0c;使得状态转换更加明确和简洁。在金融业务中&#xff0c;状态模式可以用于实现交易状…

legoloam算法环境配置和调试笔记

安装gtsam 参考 Ubuntu20.04安装gtsam记录_gtsam安装-CSDN博客 mkdir buildcd buildcmake .. make -

简谈设计模式之设计原则

设计模式是软件工程中解决特定问题的通用解决方案。这些模式提供了设计结构和最佳实践&#xff0c;帮助开发者创建灵活、可重用和可维护的代码。 设计模式分类 创建型模式 用于描述"如何创建对象", 它的特点是“将对象的创建和使用分离”. 包括单例, 原型, 工厂方…

负载均衡(Load Balancing)、集群(Cluster)和分布式(Distributed)

负载均衡&#xff08;Load Balancing&#xff09; 定义&#xff1a;负载均衡是指将网络流量或计算任务均匀地分配到多个服务器或计算资源上&#xff0c;以提高系统的整体处理能力、可靠性和响应速度。 特点&#xff1a; 流量分配&#xff1a;负载均衡器根据一定的算法&#x…

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;因此一直以来都被视为传播的重要元素。这种能力来自于通过布局和视觉线…

在Pycharm中把jupyter notebook转换成md格式

在Pycharm的控制台输入&#xff1a; jupyter nbconvert --to markdown filename.ipynb这里实际上是用的nvconvert 同理&#xff0c;如果是在vscode中写jupyter&#xff0c;也可以用&#xff1a; jupyter nbconvert --to FORMAT notebook.ipynb将其变成ipynb文件&#xff08;…

普通人必看!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;判断评论是正面…

Jackson中ObjectMapper

文章目录 概要ObjectMapper常用方法将Java对象转换为JSON字符串从JSON字符串转换为Java对象读取JSON文件并解析为树结构 概要 ObjectMapper 是 Jackson 数据处理库的核心类&#xff0c;用于将 Java 对象转换为 JSON&#xff0c;以及将 JSON 转换为 Java 对象。 ObjectMapper常…

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…

Android Camera API发展历程

Android Camera API发展历程 一、Android Camera API介绍 Android系统中Camera API是用于控制相机设备的主要API&#xff0c;到目前为止&#xff0c;Camera API历史上共历经了三版重要的API。 在Android 5.0之前&#xff0c;主要使用的是Camera API1&#xff0c;但现在已经弃…

如何使用 Puppeteer 避免机器人检测?

为什么有反机器人系统&#xff1f; 保护网站资源和性能 爬虫和机器人程序在短时间内可以发送大量请求&#xff0c;消耗服务器资源&#xff0c;导致网站性能下降甚至崩溃。 反机器人系统可以帮助网站管理和限制这些请求&#xff0c;从而保持网站的稳定性和可用性。 防止数据…

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

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