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

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

SQL语句
数据库对象和Java对象映射
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;
}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
接口:具体实现
UserInfoMapper.java

@Mapper
public interface UserInfoMapper {
@Select("select * from user_info")
List selectAll();
}
AI写代码
java
运行
1
2
3
4
5
检测接口是否正确
UserInfoController.java

// 检测接口是否正确
@RestController
public class UserInfoController {
@Autowired
private UserInfoMapper userInfoMapper;
@RequestMapping("/selectAll")
List selectAll(){
return userInfoMapper.selectAll();
}
}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
配置文件:
application.yml

spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
AI写代码
java
运行
1
2
3
4
5
6
MyBatis的写法(注解)
xml
注解

企业建表的规范
需要具备三个字段
(1) id
(2) 创建时间
(3) 更新时间
哪怕表里只有一个字段,比如userid,也需要加上这三个字段
1.字段名/表名 全部小写

比如这张表:

  1. delete flag,逻辑删除和物理删除的概念
    逻辑删除:指从逻辑上进行数据删除(比如设置为0是删除,设置为1是不删除)
    物理删除:从硬盘上进行数据删除(delete,真就删除了)

单元测试
在需要写测试单元的类中,右键点击generate,选择Test

这个就是需要测试的类:
@Mapper
public interface UserInfoMapper {
// 拿到全部的信息
@Select("select * from user_info")
List selectAll();

// 拿到一条信息
@Select("select * from user_info where id = 4")
UserInfo selectOne();

}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10

会自动帮我们生成测试代码(点击红色框框中的内容):

  1. 对方法的详细解释:
    @SpringBootTest(在测试文件中)不和SpringBoot在一个文件下,所以引入这个用于启动Spring容器

@Slf4j
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@BeforeEach
void setUp() {
log.info("setUp");
}

@AfterEach
void tearDown() {
    log.info("After");
}

@Test
void selectAll() {
    List<UserInfo> list = userInfoMapper.selectAll();
    log.info(list.toString());
}

}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
使用MyBatis可能遇到的问题
没有配置数据库相关信息:

账号密码错误:

数据库错误:

表不存在:

字段错误:

配置MyBatis相关日志
在Mybatis当中我们可以借助日志, 查看到sql语句的执行、执行传递的参数以及执行结果,在配置文件中进行配置即可
mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
AI写代码
java
运行
1
2
3
使用配置的效果(打印sql语句的详细信息):

传递参数
如果只有一个参数,SQL的名称可以为任意的,它都能找到对应的,建议命名为同一个名字的参数(更有利于读)

也可以对参数进行重命名(将id命名为了userId)

// 真正写代码的地方
@Mapper
public interface UserInfoMapper {
// 拿到全部的信息
@Select("select * from user_info")
List 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 {
@Autowired
private UserInfoMapper userInfoMapper;
@BeforeEach
void setUp() {
log.info("setUp");
}

@AfterEach
void tearDown() {
    log.info("After");
}

@Test
void selectAll() {
    List<UserInfo> list = userInfoMapper.selectAll();
    log.info(list.toString());
}

@Test
void selectOne() {
    log.info(userInfoMapper.selectOne(1).toString());
}

@Test
void selectOne2() {
    log.info(userInfoMapper.selectOne(2).toString());
}

}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
总结
对上面内容的总结:
(1) 引入依赖

(2) 配置数据库

(3) 写MyBatis代码
1.注解

2.xml方式

打印Mybatis的日志的配置(日志都在调试的时候打印)

上面的配置建议只出现在开发环境中,不要出现在线上环境中

灰度发布:

MyBatis的增删改查

插入数据
// 增,返回的是受影响的行数
// 如果注解中字符串太长,使用 + 号进行拼接
@Insert("insert into user_info (username,password,age,gender,phone)" +
"values(#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);

// 测试代码,插入一个对象
@Test
void 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);
}

AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

  1. 如何获取自增id
    比如:

使用@Options进行返回自增id

// 返回自增id
// 主键:useGeneratedKeys,keyProperty表示把主键赋值给 “id”
@Options(useGeneratedKeys = true,keyProperty = "id")

Integer result = userInfoMapper.insert(userInfo);
log.info("insert方法 {}: 自增id{}", result, userInfo.getId());
AI写代码
java
运行
1
2
3
4
5
6
7

  1. 对insert的参数进行重命名
    参数如果为对象时,对参数进行重命名

如果对对对象进行重命名,应该写成下面这种写法,都加上重命名的对象的名字点属性


// 删
@Delete("delete from user_info where id=#{id}")
Integer delete(Integer id);

// 测试
@Test
void delete() {
Integer result = userInfoMapper.delete(5);
log.info("result: ",result);
}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10


// 改
@Update("update user_info set age =#{age} where id = #{id}")
Integer update(UserInfo userInfo);

// 测试
@Test
void update() {
UserInfo userInfo = new UserInfo();
userInfo.setAge(8);
userInfo.setId(6);
Integer result = userInfoMapper.update(userInfo);
// 通过影响的行数,判定程序执行成功,还是失败
if(result > 0){
System.out.println("执行成功!");
}
}
AI写代码
java
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


结果映射
MyBatis 会自动的根据数据库的字段名和Java对象的属性名,进行映射,如果名称一样,就进行赋值
比如:
字段的映射:

字段不一样出现的错误:

解决方法:
(1) 对mysql查询的结果进行重命名
企业开发中,尽量不要使用 * ,需要查询哪些字段,就写哪些字段,如果需要全量的字段,就全部写完

如果出现sql的错误,把sql的代码复制到你写mysql的地方,更容易观察到错误

(2) 使用@Result注解

如果别的方法,也要使用这上面的定义呢?
该如果实现?如何复用Results的定义?

(3) 如何再一次简化上面的方法,不用再写这些字段和属性的映射
使用配置的方式,自动转驼峰,只需要添加配置就行,其它都不需要修改

在yml配置文件中配置:

mybatis:
configuration:
map-underscore-to-camel-case: true #配置驼峰⾃动转换
AI写代码
java
运行
1
2
3
MyBatis的写法(XML)
需要配置数据库(和注解的配置是一样的)
指明xml的路径

配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件

mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
// ** 表示可以找到所有以Mapper.xml结束的文件
AI写代码
java
运行
1
2
3
4

注解和xml的方式是可以共存的

写xml的实现
xml的配置:

AI写代码 java 运行 1 2 3 4 5

使用xml:
UserInfoXMLMapper.xml

接口的命名:
UserInfoXMLMapper

测试selectAll()方法:

要实现的方法名称:

返回的类型:

常见问题
出现的错误:

可能的三种原因:

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

  1. mapper的路径配置和xml的路径不一致

  2. xml namespace写错了

xml写法出现dataSource这个错误,基本上是配置文件的格式有问题

xml写法的使用

使用:

获取插入数据的自增id

对参数进行重命名
方法名和修改(重命名)的对象名保持一样


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

删除


修改


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

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

总结
Mybatis的概念:

传递参数:
xml和注解通用的传递参数的知识:

Mybatis会自动把mysql返回的数据,和Java对象进行映射(映射规则:名称一致的进行映射)

————————————————
文章转自:[《黑神话悟空》第三难完成方法] (https://www.52mwyd.com/news/37097.html)

作者:美文阅读网,转载请注明原文链接:https://www.52mwyd.com/

posted @ 2025-11-14 18:20  咳咳的编程梦  阅读(2)  评论(0)    收藏  举报