目录
最重要的是有一个原始的数据库 -我这边使用的是mariadb数据库
这边使用Spring boot 快速创建框架
新建一个项目-Spring Initializr-更改Server URL(这边看情况 看你的jkd版本号)-jdk-java-next

搜索依赖 my -勾选 myBatis Framework 和 MySQL Driver(idea运行数据库需要数据库运行依赖)-create

Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互;
使用此框架程序员只需要通过注解或者修改xml配置文件的方式配置好需要执行的SQL语句,MyBatis框架会根据SQL语句生成对应的JDBC代码并对数据库中数据进行增删改查操作。
配置外部属性文件
- 其配置需要包含url,username,password
- 这边是一个实例
- spring.datasource.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
- spring.datasource.username=root
- spring.datasource.password=root
其中的
url 可以复制 需要更改的是端口 mysql默认的是3306
还有的是数据库默认的是mysql(这个一定要改)
password 是数据库登录密码 username 是数据库的用户名
可能原因是数据库没启动
window+R -> 命令输入services.msc ->server
我出现这个问题,我这边稍微说一下,我用的mariadb数据库 将手动变成自动就可以了


基于MyBatis规范设计用户数据访问接口,在工程目录下创建包mapper,并创建UserMapper接口
@Mapper注解
是由MyBatis框架提供,用于描述数据层接口,告诉系统底层为此接口创建其实现类,在实现类中定义数据访问逻辑,执行与数据库的会话(交互)
@Insert注解
使 MyBatis 框架根据接口方法的参数类型自动生成插入数据的代码。
占位符 #{}
#{} 是 MyBatis 框架中用来表示占位符的语法。
在 @Insert注解中,#{}所代表的是一个占位符,它可以接受 Java 对象作为输入参数,并将其转换为预编译的 SQL 语句中的参数。使用 #{}可以帮助我们避免 SQL 注入等问题,同时也让 SQL 写起来更加简单。
数据库和java中的对应关系
| 数据库 | java |
| 表 | 类 |
| 字段名 | 属性 |

- package org.example.demo_formybatis.pojo.entity;
-
- import java.util.Date;
-
- public class User {
- private Long id;
- private String username;
- private String password;
- private String nickname;
- private Date created;
-
- public Date getCreated() {
- return created;
- }
-
- public void setCreated(Date created) {
- this.created = created;
- }
-
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- ", nickname='" + nickname + '\'' +
- ", created='" + created + '\'' +
- '}';
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getNickname() {
- return nickname;
- }
-
- public void setNickname(String nickname) {
- this.nickname = nickname;
- }
-
-
- }
这边需要提醒的是定接口的方法最好定义要返回值
这边 插入更新 删除的返回值 是 int(可以返回影响的数据的条数)
而查询则需要根据具体情况判断
数据库的数据的插入
- package org.example.demo_formybatis.mappers;
-
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Mapper;
- import org.example.demo_formybatis.pojo.entity.User;
-
- @Mapper
- public interface UserMapper {
- @Insert("INSERT INTO user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")
- int insertUser(User user);
- }
在说导入外部属性文件的时候 我们自己建立一个测试类 @Test测试
这边现在只需要 在 Test包下找到配置的包 这边是DemoFormybatisApplicationTests

这边测试一下
- package org.example.demo_formybatis;
-
- import org.example.demo_formybatis.mappers.UserMapper;
- import org.example.demo_formybatis.pojo.entity.User;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
-
- import java.util.Date;
-
- @SpringBootTest
- class DemoFormybatisApplicationTests {
-
- @Test
- void contextLoads() {
- }
- @Autowired
- private UserMapper userMapper;
- @Test
- void insertUserTest(){
- User user = new User();
- user.setUsername("张三");
- user.setPassword("123");
- user.setNickname("老三");
- user.setCreated(new Date());
- System.out.println(userMapper.insertUser(user));
-
-
- }
-
- }
点击测试按钮(这边事先运行了一次)
运行成功图

查看数据库中的数据

接下来 数据库的更新数据
需要注意的是 必须更新数据必须写WHERE,
使用的是mybatis框架它没有提示
我们只需要更新张三的名字为李四
这边需要注意的是我们@Mapper注解的接口的方法传递的参数需要仍然是一个实体类对象 而不是一个id值
- package org.example.demo_formybatis.mappers;
-
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Update;
- import org.example.demo_formybatis.pojo.entity.User;
-
- @Mapper
- public interface UserMapper {
- @Insert("INSERT INTO user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")
- int insertUser(User user);
- @Update("UPDATE user SET username= #{username} WHERE id =#{id}")
- int updateUser(User user);
- }
测试
- package org.example.demo_formybatis;
-
- import org.example.demo_formybatis.mappers.UserMapper;
- import org.example.demo_formybatis.pojo.entity.User;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
-
- import java.util.Date;
-
- @SpringBootTest
- class DemoFormybatisApplicationTests {
-
- @Test
- void contextLoads() {
- }
- @Autowired
- private UserMapper userMapper;
- @Test
- void insertUserTest(){
- User user = new User();
- user.setUsername("张三");
- user.setPassword("123");
- user.setNickname("老三");
- user.setCreated(new Date());
- System.out.println(userMapper.insertUser(user));
-
-
- }
- @Test
- void updateUserTest(){
- User user = new User();
- user.setId(103L);
- user.setUsername("李四");
- System.out.println(userMapper.updateUser(user));
- }
-
- }
运行结果图

数据库的情况

删除李四的数据
这边不重复写前面的了东西了 ,这边只写相关代码
- @Delete("DELETE FROM user WHERE username = #{name}")
- int deleteUser(String name);
这边我是依据用户名删除 的#{变量} 这里的变量是形参的具体的值 所以名字必须保持一致
测试
- @Test
- void deleteUserTest(){
-
- System.out.println(userMapper.deleteUser("李四"));
- }
运行结果
数据库的情况

查询比较特殊点在于:数据库的对字段查询会返回一个结果集
这边引入新的概念: VO
VO(Value Object,值对象)是一种设计模式,用于封装从数据库查询结果中获取的数据。VO主要作为数据传输的载体,它与数据库表结构相对应,但不包含任何业务逻辑,仅用于存储和传递数据。
总结来说,MyBatis中的VO是用于封装数据库查询结果的一种对象,它提供了面向对象的数据封装方式,有助于提高代码的可读性和可维护性。在实际项目中,根据查询需求和业务场景,可以设计相应的VO类,配合MyBatis的映射机制,实现数据的高效访问和传输。
简单而言 如果需要从数据库返回特定字段名的数值,就可以使用VO,
此时我们需要封装一个VO的实体类
假设我们需要返回字段名 username,password,nickname 的数值,
当然全字段返回的可以使用实体类
- package org.example.demo_formybatis.pojo.vo;
-
-
-
- public class UserVO1 {
- private Long id;
- private String username;
- private String password;
- private String nickname;
-
-
-
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- ", nickname='" + nickname + '\'' +
- '}';
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getNickname() {
- return nickname;
- }
-
- public void setNickname(String nickname) {
- this.nickname = nickname;
- }
-
-
- }
查询 用户名为张三的数据
- @Select("SELECT username,password,nickname FROM user WHERE username = #{name}")
- List
selectUserByUsername(String name);
测试
- @Test
- void selectUserByUsernameTest(){
-
- System.out.println(userMapper.selectUserByUsername("张三"));
- }
测试结果等一下补