数据库:mysql 8.0.28

技术框架:mybatis 3.5.13maven 3.8.7

一、准备工作

(1)数据库建库建表

-- 创建数据库
create database if not exists mybatis;
-- 切换数据库
use mybatis;
-- 创建用户表
create table if not exists user
(
id int not null primary key,
name varchar(30) null,
pwd varchar(30) null
) charset = utf8;

(2)插入测试数据

insert into mybatis.user (id, name, pwd)
values (1, '漩涡鸣人', '123456'),
(2, '宇智波佐助', '123456'),
(3, '春野樱', '123456'),
(4, '旗木卡卡西', '123456'),
(5, '奈良鹿丸', '123456'),
(6, '秋道丁次', '123456'),
(7, '山中井野', '123456'),
(8, '猿飞阿斯玛', '123456'),
(9, '日向雏田', '123456'),
(10, '犬冢牙', '123456'),
(11, '油女志乃', '123456'),
(12, '夕日红', '123456'),
(520, '1314', 'yanglin'),
(9527, '007', '123456');

(3)配置maven依赖(pom.xml

    <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>8.0.31</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies> <build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

(4)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">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="!QAZ2wsx"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/harley/dao/UserMapper.xml"/>
</mappers>
</configuration>

二、POJO类

package com.harley.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; /**
* 实体类
* @author harley
* @date 2024/05/31 14:00
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class User {
private int id;
private String name;
private String pwd; }

三、JDBC工具类

package com.harley.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;
import java.io.InputStream; /**
* @author harley
* @date 2024/05/31 13:55
*/
public class MybatisUtils { /* 静态属性,MybatisUtils实例化时生成 */
private static SqlSessionFactory sqlSessionFactory; /* 静态代码块,MybatisUtils实例化时运行 */
static {
try{
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (IOException e){
e.printStackTrace();
}
} public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}

四、Mapper类

package com.harley.dao;

import com.harley.pojo.User;

import java.util.List;

public interface UserMapper {
// 查询全部用户
List<User> getUserList(); // 根据id查询用户
User getUserById(int id); // 新增一个用户
int addUser(User user); // 更新用户
int updateUser(User user); // 删除用户
int deleteUser(int id); }

五、Mapper.xml

<?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"> <!-- namespace绑定一个Dao/Mapper接口 -->
<mapper namespace="com.harley.dao.UserMapper">
<!--select查询接口-->
<select id="getUserList" resultType="com.harley.pojo.User">
select * from user
</select>
<select id="getUserById" resultType="com.harley.pojo.User" parameterType="integer">
select * from user where id = #{id}
</select>
<!--对象中的属性,可以直接取出来 -->
<insert id="addUser" parameterType="com.harley.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.harley.pojo.User">
update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
<delete id="deleteUser" parameterType="integer">
delete from user where id = #{id}
</delete>
</mapper>

六、测试类

package com.harley.dao;

import com.harley.pojo.User;
import com.harley.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.util.List; /**
* @author harley
* @date 2024/05/31 14:22
*/
public class UserDaoTest { SqlSession sqlSession;
UserMapper userMapper; @Before
public void openSession(){
System.out.println("开启sqlSession");
sqlSession= MybatisUtils.getSqlSession();
userMapper=sqlSession.getMapper(UserMapper.class);
} @Test
public void test(){ // 第二步: getMapper
// UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// List<User> userList = userMapper.getUserList(); List<User> userList = sqlSession.selectList("com.harley.dao.UserMapper.getUserList"); // 第三步: 遍历结果集
for (User user : userList) {
System.out.println(user);
}
// 第四步: 关闭sqlSession
sqlSession.close();
} @Test
public void getUserById(){
User user = userMapper.getUserById(1);
System.out.println(user); } // 增删改需要提交事务
@Test
public void addUser(){
User user = new User(520,"1313","yanglin");
int res = userMapper.addUser(user);
if (res>0){
System.out.println("用户: ["+user.getName()+"] 插入成功");
}
// 提交事务
sqlSession.commit();
} @Test
public void updateUser(){
User user = new User(520,"1314","yanglin");
int res = userMapper.updateUser(user);
if(res>0){
System.out.println("id:["+user.getId()+"] 的信息已更改");
}
// 提交事务
sqlSession.commit(); } @Test
public void deleteUser(){
int id = 9527;
int res = userMapper.deleteUser(id);
if(res>0){
System.out.println("id:["+id+"] 用户已删除");
}
// 提交事务
sqlSession.commit();
} @After
public void closeSession(){
if(sqlSession!=null){
System.out.println("关闭sqlSession");
sqlSession.close();
}
} }

注意:增删改需要提交事务:sqlSession.commit();

七、常见问题

(1)Mapper.xml中的<mapper namespace="com.harley.dao.UserMapper">写成了<mapper namespace="com/harley/dao/UserMapper">

(2)mybatis-config.xml中的<mapper resource="com/harley/dao/UserMapper.xml"/>写成了<mapper resource="com.harley.dao.UserMapper.xml"/>

(3)NullPointerException,没有注册到资源

(4)资源导出失败问题处理

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

— 业精于勤荒于嬉,行成于思毁于随 —

mybatis - [05] Mybatis的CURD的更多相关文章

  1. mybatis 05: mybatis中的动态代理

    mybatis中动态代理存在的意义 图示 图示分析 分层说明:界面层为第一层,业务逻辑层(接口层 + 实现层)为第二层,数据访问层(接口层 + 实现层)为第三层 业务逻辑层和数据访问层:分别分两层来开 ...

  2. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  3. Hello Mybatis 02 mybatis generator

    接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...

  4. 【Mybatis】MyBatis之动态SQL(六)

    MyBatis 的强大特性之一便是它的动态 SQL,本章介绍动态 SQL 查看本章,请先阅读[Mybatis]MyBatis对表执行CRUD操作(三). 本例表结构 CREATE TABLE `emp ...

  5. 【Mybatis】MyBatis之Sql配置文件的使用(四)

    上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 ...

  6. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

  7. 【Mybatis】MyBatis对表执行CRUD操作(三)

    本例在[Mybatis]MyBatis配置文件的使用(二)基础上继续学习对表执行CRUD操作 使用MyBatis对表执行CRUD操作 1.定义sql映射xml文件(EmployeeMapper.xml ...

  8. 【Mybatis】MyBatis配置文件的使用(二)

    本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...

  9. 【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发

    [原文]https://www.toutiao.com/i6594610137560777223/ 一.什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  10. 【MyBatis】MyBatis之如何配置

    1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...

随机推荐

  1. cas3.5配置LDAP域控

    一. 安装cas3.5 点击下载 CAS 3.5.2 :CAS 解压缩下载的 cas-server-3.5.2-release.zip,在 %CAS%\modules文件夹中找到cas-server- ...

  2. Dart代码混淆

    Dart代码混淆 代码混淆是修改应用程序的二进制文件以使其更难被人类理解的过程.混淆会在编译后的 Dart 代码中隐藏函数和类名称,将每个符号替换为另一个符号. Flutter 的代码混淆仅适用于re ...

  3. Java线程 interrupt 方法使用异常

    背景 需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号. 在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupte ...

  4. 【Go进阶】手写 Go websocket 库(一)|WebSocket 通信协议

    前言 这里是白泽,我将利用一个系列,为你分享如何基于 websocket 协议的 rfc 文档,编写一个库的过程.并从0开始写一遍 gorilla/websocket 这个库,从中你可以学习到 web ...

  5. CSV文件处理工具-CsvUtil

    介绍 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本). Hutool针对此格式,参考 ...

  6. Qt编写机器码秘钥控制/日期防篡改/离线使用/硬件标识/运行时间/数量控制/批量更新秘钥

    一.前言说明 搞软件开发一直追求精益求精的目标,从第一版的秘钥生成器到今天这个版本,经历了十年的时间,最初的版本做的非常简陋,就是搞了个异或加密,控制运行时间,后面又增加设备数量的控制,然后就是到期时 ...

  7. Qt编写可视化大屏电子看板系统32-模块10大屏地图

    一.前言 大屏地图模块采用浏览器模块+echart组件,Qt自带了webkit或者webengine模块,其中在win上mingw编译器的Qt5.6以后的版本,没有了浏览器模块,这个就需要用第三方的浏 ...

  8. lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式

    本文主要介绍lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式. 1.在HTML5页面中的使用方式 具体使用步骤详见下面的代码: <!DOCTYPE html> & ...

  9. 微信后团队分享:微信后台基于Ray的分布式AI计算技术实践

    本文由微信后台Astra项目团队分享,原题"Ray在微信AI计算中的大规模实践",下文进行了排版和内容优化. 1.引言 微信存在大量AI计算的应用场景,主要分为三种:流量分发.产品 ...

  10. IM跨平台技术学习(八):新QQ桌面版为何选择Electron作为跨端框架

    本文由QQ技术团队王辉.吴浩.陈俊文分享,编辑Tina整理,本文收录时有内容修订和排版优化. 1.引言 在瞬息万变的互联网行业中,年过二十四的即时通讯IM应用 QQ 堪称超长寿的产品,见证了中国互联网 ...