当前位置: 首页 > news >正文

MyBatis 的XML实现方法(JAVA)

数据库表的结构如下:

DROP DATABASE IF EXISTS test;
CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

在JAVA中的定义:

@Data
public class User {private Integer id;private String userName;private Integer gender;private Integer delete_flag;private Date create_time;private Date update_time;
}

先在配置文件中连接数据库

# .yml 连接数据库
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/(要连接的数据库的名称)?characterEncoding=utf8&useSSL=falseusername: rootpassword: 2002driver-class-name: com.mysql.cj.jdbc.Driver

定义接口:

 

@Mapper
public interface UserXMLMapper {//增Integer add(User user);
}

XML实现接口:

创建一个xml文件,然后在配置文件中配置xml文件的地址。

 

#配置xml文件的路径,resources/mapper包中所有以Mapper.xml结尾的文件
mybatis:mapper-locations: classpath:mapper/**Mapper.xml
#配置 打印mybatis的日志configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在xml文件中拷贝以下代码,这段代码是MyBatis的固定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">
<mapper namespace="填写要实现的接口的全限定名称"></mapper>

在mapper标签中插入以下代码

<insert id="add">insert into userinfo(username) values (#{userName});
</insert>

id:后面跟的是要实现的接口里面的具体的方法名称

#{}:中直接使用User对象的属性名来获取参数

进行单元测试

@SpringBootTest
class UserXMLMapperTest {@Autowiredprivate UserXMLMapper userXMLMapper;@Testvoid add() {User user = new User();user.setUserName("zhangsan");userXMLMapper.add(user);}
}

因为数据库中数据太少了,所以在删除之前先添加一些数据

xml的实现代码如下

<delete id="delete">delete from userinfo where id = #{id};
</delete>

进行单元测试

@SpringBootTest
class UserXMLMapperTest {@Autowiredprivate UserXMLMapper userXMLMapper;@Testvoid delete() {userXMLMapper.delete(3);}
}

查询的xml代码如下

<select id="find" resultType="com.example.Spring_demo.mySQL.User">select * from userinfo;
</select>

因为数据库返回的数据需要和JAVA进行映射所以resultType后面就是要映射的类的全限定名称。

单元测试

@SpringBootTest
class UserXMLMapperTest {@Autowiredprivate UserXMLMapper userXMLMapper;@Testvoid find() {List<User> list = userXMLMapper.find();System.out.println(list.toString());}
}

大多数情况下数据库中的参数名和JAVA中的参数名是不相同的,因为数据库一般使用_分隔单词,而JAVA中是使用驼峰命名。 

所以在大多数情况下数据库中的参数名和JAVA中的参数名并不是和我上面的例子一样是相同的,它们的对应关系应该是这样:

 而代码执行的结果: 

后面的三个变量都无法获取返回值。

结果映射

解决办法有三种

1. 起别名

就是利用sql语句将返回结果的列名改的和类中的属性名一致。

<select id="find" resultType="com.example.Spring_demo.mySQL.User">select id,username,gender,delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from userinfo;
</select>

2. 结果映射
<mapper namespace="com.example.Spring_demo.mySQL.UserXMLMapper"><resultMap id="map" type="com.example.Spring_demo.mySQL.User">
<!--        <id></id>标签只能应用于主键--><id column="id" property="id"></id><result column="delete_flag" property="deleteFlag"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result></resultMap><select id="find" resultMap="map">select * from userinfo;</select>
</mapper>

 

3. 开启驼峰命名

在配置文件中加入以下代码:

#yml文件
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换

修改前

修改的xml代码为

<update id="update">update userinfo set username=#{name} where id = #{id};
</update>

单元测试

@SpringBootTest
class UserXMLMapperTest {@Autowiredprivate UserXMLMapper userXMLMapper;@Testvoid update() {userXMLMapper.update(1,"wangwu");}
}

相关文章:

  • Android 基础技术——addView 流程
  • vue+elenemt分页+springboot
  • 幻读是什么,用什么隔离级别可以防止幻读?
  • 解决Windows下VSCode控制台乱码问题
  • 一文了解GeoTrust SSL证书
  • Win10/11中VMware Workstation设置网络桥接模式
  • 【Linux】基本指令收尾
  • Win10下在Qt项目中配置SQlite3环境
  • Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”
  • Jupyter Notebook五分钟基础速通
  • 自建ES集群
  • k8s的包管理工具helm
  • 【大数据处理技术实践】期末考查题目:集群搭建、合并文件与数据统计可视化
  • 【开源】基于JAVA的停车场收费系统
  • 【OSG案例详细分析与讲解】之十四:【立方体贴图】
  • JavaScript-如何实现克隆(clone)函数
  • 【Amaple教程】5. 插件
  • 【个人向】《HTTP图解》阅后小结
  • 2017 前端面试准备 - 收藏集 - 掘金
  • extract-text-webpack-plugin用法
  • IOS评论框不贴底(ios12新bug)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Octave 入门
  • Python学习之路16-使用API
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • XML已死 ?
  • 工程优化暨babel升级小记
  • 关于List、List?、ListObject的区别
  • 使用SAX解析XML
  • 协程
  • 赢得Docker挑战最佳实践
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • FaaS 的简单实践
  • ​Linux·i2c驱动架构​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #HarmonyOS:基础语法
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $ git push -u origin master 推送到远程库出错
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (27)4.8 习题课
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (八)Spring源码解析:Spring MVC
  • (多级缓存)多级缓存
  • (分享)自己整理的一些简单awk实用语句
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .dwp和.webpart的区别
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Project Open Day(2011.11.13)
  • .net 程序发生了一个不可捕获的异常