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

Java MyBatis(一)--- 注解和XML的使用

文章目录

  • MyBatis
    • MyBatis的使用
    • MyBatis的写法(注解)
      • 企业建表的规范
      • 单元测试
      • 使用MyBatis可能遇到的问题
      • 配置MyBatis相关日志
      • 传递参数
      • 总结
      • MyBatis的增删改查
    • MyBatis的写法(XML)
      • 常见问题
      • xml写法的使用

MyBatis

MyBatis 是一个持久层框架,和Spring没有任何关系,只是SpringBoot把MyBatis集成过来了

  1. SQL语句
  2. 数据库对象和Java对象映射
  3. MyBatis是⼀款优秀的 持久层 框架,用于简化JDBC的开发
    在这里插入图片描述

MyBatis的使用

最朴素的用法:
在这里插入图片描述

类:包含属性
UserInfo.java

@Data
public class UserInfo {// 添加用户信息private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phono;private String deleteFlag;private Date createTime;private Date updateTime;
}

接口:具体实现
UserInfoMapper.java

@Mapper
public interface UserInfoMapper {@Select("select * from user_info")List<UserInfo> selectAll();
}

检测接口是否正确
UserInfoController.java

// 检测接口是否正确
@RestController
public class UserInfoController {@Autowiredprivate UserInfoMapper userInfoMapper;@RequestMapping("/selectAll")List<UserInfo> selectAll(){return userInfoMapper.selectAll();}
}

配置文件:
application.yml

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

MyBatis的写法(注解)

  1. xml
  2. 注解
    在这里插入图片描述

企业建表的规范

  1. 需要具备三个字段
    (1) id
    (2) 创建时间
    (3) 更新时间
    哪怕表里只有一个字段,比如userid,也需要加上这三个字段

1.字段名/表名 全部小写
在这里插入图片描述
比如这张表:
在这里插入图片描述
2. delete flag,逻辑删除和物理删除的概念
逻辑删除:指从逻辑上进行数据删除(比如设置为0是删除,设置为1是不删除)
物理删除:从硬盘上进行数据删除(delete,真就删除了)

单元测试

  1. 在需要写测试单元的类中,右键点击generate,选择Test
    在这里插入图片描述
    这个就是需要测试的类:
@Mapper
public interface UserInfoMapper {// 拿到全部的信息@Select("select * from user_info")List<UserInfo> selectAll();// 拿到一条信息@Select("select * from user_info where id = 4")UserInfo selectOne();
}

在这里插入图片描述

会自动帮我们生成测试代码(点击红色框框中的内容):
在这里插入图片描述
在这里插入图片描述
2. 对方法的详细解释:
@SpringBootTest(在测试文件中)不和SpringBoot在一个文件下,所以引入这个用于启动Spring容器
在这里插入图片描述

@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("setUp");}@AfterEachvoid tearDown() {log.info("After");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}
}

使用MyBatis可能遇到的问题

  1. 没有配置数据库相关信息:
    在这里插入图片描述
  2. 账号密码错误:
    在这里插入图片描述
  3. 数据库错误:
    在这里插入图片描述
  4. 表不存在:
    在这里插入图片描述
  5. 字段错误:
    在这里插入图片描述

配置MyBatis相关日志

  1. 在Mybatis当中我们可以借助日志, 查看到sql语句的执行、执行传递的参数以及执行结果,在配置文件中进行配置即可
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

使用配置的效果(打印sql语句的详细信息):
在这里插入图片描述

传递参数

  1. 如果只有一个参数,SQL的名称可以为任意的,它都能找到对应的,建议命名为同一个名字的参数(更有利于读)
    在这里插入图片描述
  2. 也可以对参数进行重命名(将id命名为了userId)
    在这里插入图片描述
// 真正写代码的地方
@Mapper
public interface UserInfoMapper {// 拿到全部的信息@Select("select * from user_info")List<UserInfo> selectAll();// 拿到一条信息@Select("select * from user_info where id = #{id11123}")UserInfo selectOne(Integer id);@Select("select * from user_info where id = #{userId}")UserInfo selectOne2(@Param("userId") Integer id);
}// 测试代码(单元测试)
@Slf4j
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("setUp");}@AfterEachvoid tearDown() {log.info("After");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}@Testvoid selectOne() {log.info(userInfoMapper.selectOne(1).toString());}@Testvoid selectOne2() {log.info(userInfoMapper.selectOne(2).toString());}
}

总结

  1. 对上面内容的总结:
    (1) 引入依赖
    在这里插入图片描述

(2) 配置数据库
在这里插入图片描述

(3) 写MyBatis代码
1.注解
在这里插入图片描述

2.xml方式

  1. 打印Mybatis的日志的配置(日志都在调试的时候打印)
    在这里插入图片描述
    上面的配置建议只出现在开发环境中,不要出现在线上环境中

在这里插入图片描述

灰度发布:
在这里插入图片描述

MyBatis的增删改查

  1. 插入数据
// 增,返回的是受影响的行数
// 如果注解中字符串太长,使用 + 号进行拼接
@Insert("insert into user_info (username,password,age,gender,phone)" +"values(#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);// 测试代码
@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("aaa");userInfo.setPassword("aaa");userInfo.setAge(10);userInfo.setGender(1);userInfo.setPhone("128472495839");Integer result = userInfoMapper.insert(userInfo);log.info("insert方法 {}: ",result);}

在这里插入图片描述
2. 如何获取自增id
比如:
在这里插入图片描述
使用@Options进行返回自增id

    // 返回自增id// 主键:useGeneratedKeys,keyProperty表示把主键赋值给 “id”@Options(useGeneratedKeys = true,keyProperty = "id")Integer result = userInfoMapper.insert(userInfo);log.info("insert方法 {}: 自增id{}", result, userInfo.getId());

在这里插入图片描述
3. 对insert的参数进行重命名
参数如果为对象时,对参数进行重命名

在这里插入图片描述
如果对对对象进行重命名,应该写成下面这种写法,都加上重命名的对象的名字点属性
在这里插入图片描述

 // 删@Delete("delete from user_info where id=#{id}")Integer delete(Integer id);// 测试
@Testvoid delete() {Integer result = userInfoMapper.delete(5);log.info("result: ",result);}

在这里插入图片描述

// 改@Update("update user_info set age =#{age} where id = #{id}")Integer update(UserInfo userInfo);// 测试
@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setAge(8);userInfo.setId(6);Integer result = userInfoMapper.update(userInfo);// 通过影响的行数,判定程序执行成功,还是失败if(result > 0){System.out.println("执行成功!");}}

在这里插入图片描述

  1. 结果映射
    MyBatis 会自动的根据数据库的字段名和Java对象的属性名,进行映射,如果名称一样,就进行赋值
    比如:
    字段的映射:
    在这里插入图片描述
    字段不一样出现的错误:
    在这里插入图片描述
    解决方法:
    (1) 对mysql查询的结果进行重命名
    企业开发中,尽量不要使用 * ,需要查询哪些字段,就写哪些字段,如果需要全量的字段,就全部写完
    在这里插入图片描述

如果出现sql的错误,把sql的代码复制到你写mysql的地方,更容易观察到错误
在这里插入图片描述
(2) 使用@Result注解
在这里插入图片描述
如果别的方法,也要使用这上面的定义呢?
该如果实现?如何复用Results的定义?
在这里插入图片描述
(3) 如何再一次简化上面的方法,不用再写这些字段和属性的映射
使用配置的方式,自动转驼峰,只需要添加配置就行,其它都不需要修改

在yml配置文件中配置:

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

MyBatis的写法(XML)

  1. 需要配置数据库(和注解的配置是一样的)
  2. 指明xml的路径
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
// ** 表示可以找到所有以Mapper.xml结束的文件

在这里插入图片描述
注解和xml的方式是可以共存的

在这里插入图片描述

  1. 写xml的实现

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="com.example.demo.mapper.UserInfoMapper">
</mapper>

在这里插入图片描述
在这里插入图片描述

使用xml:
UserInfoXMLMapper.xml
在这里插入图片描述

接口的命名:
UserInfoXMLMapper
在这里插入图片描述
测试selectAll()方法:

在这里插入图片描述
要实现的方法名称:
在这里插入图片描述
返回的类型:
在这里插入图片描述

常见问题

出现的错误:
在这里插入图片描述
可能的三种原因:

  1. xml和接口定义的方法名称不一致

在这里插入图片描述
2. mapper的路径配置和xml的路径不一致
在这里插入图片描述
3. xml namespace写错了
在这里插入图片描述
xml写法出现dataSource这个错误,基本上是配置文件的格式有问题

xml写法的使用

  1. 使用:
    在这里插入图片描述

  2. 获取插入数据的自增id
    在这里插入图片描述

  3. 对参数进行重命名
    方法名和修改的对象名保持一样
    在这里插入图片描述

可以比对配置代码之间的差异
在线比对工具

  1. 删除
    在这里插入图片描述

  1. 修改
    在这里插入图片描述

结果映射的三种解决方式:

  1. sql字段别名(as)
  2. 定义Result
  3. 配置自动转驼峰
    方式1和方式3,xml也是适用的

定义 Result
在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/499614.html

相关文章:

  • 东莞官方网站 优帮云网站怎么做推广和优化
  • win64_11gR2_client.zip 怎么安装?Oracle 11g 客户端详细安装步骤
  • 建设向58同城的网站给客户做网站需要提供
  • flink sql 所有函数详细用例
  • Flink 1.20 flink-config.yml 配置详解
  • 湖州网站集约化平台南京做网站哪家公司好
  • 【深度学习新浪潮】2025全球机器学习技术大会:Agent技术突破与产业落地全景解析
  • 长沙整站优化梅河口信息网
  • Linux入门:动静态库的理解与加载
  • 云上救火指南:AWS常见服务告警的快速恢复与最小影响方案
  • 九号线香网站建设淘客网站后台怎么做
  • FPGA 入门 3 个月学习计划表
  • 专业的做网站网站做外链好嘛
  • ios android 小程序 蓝牙 CRC16_MODBUS
  • 沧州网站建设优化案例怎么创建一个网站
  • 【小沐杂货铺】基于Three.js渲染三维风力发电机(WebGL、vue、react、WindTurbine)
  • Socket 网络编程
  • 哪里可以做网站网站兼容性怎么解决
  • 网站备案流程实名认证哪个平台做网站好
  • 最版网站建设案例中国建设银行开户行查询
  • 衡水网站制作多少钱世界著名产品设计作品
  • 我们如何更好地相处和协作?
  • Vlanif的作用
  • 62.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--自训练ML模型
  • 北京住房城乡建设网站秦皇岛手机网站制作公司
  • 【SpringBoot从初学者到专家的成长18】SpringBoot中的数据持久化:JPA与Hibernate的结合
  • Ubuntu服务器已下载Nginx安装包的安装指南
  • 高可用Prometheus问题集锦
  • wap建站模板物流网站怎么开
  • 【Leetcode hot 100】763.划分字母区间