目录
前置条件(创建一个项目)
Mybatis
定义
可能出现的问题
这边如果连接不上数据库
编辑
Dao接口设计
Mybatis流程
创建实体类 User 和其属性
创建@Mapper的接口类
测试类测试
实例数据库数据的更新
实例数据库数值的删除
最重要的是有一个原始的数据库 -我这边使用的是mariadb数据库
前置条件(创建一个项目)
这边使用Spring boot 快速创建框架
新建一个项目-Spring Initializr-更改Server URL(这边看情况 看你的jkd版本号)-jdk-java-next
搜索依赖 my -勾选 myBatis Framework 和 MySQL Driver(idea运行数据库需要数据库运行依赖)-create
Mybatis
定义
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数据库 将手动变成自动就可以了
Dao接口设计
基于MyBatis规范设计用户数据访问接口,在工程目录下创建包mapper,并创建UserMapper接口
-
@Mapper注解
是由MyBatis框架提供,用于描述数据层接口,告诉系统底层为此接口创建其实现类,在实现类中定义数据访问逻辑,执行与数据库的会话(交互)
-
@Insert注解
使 MyBatis 框架根据接口方法的参数类型自动生成插入数据的代码。
-
占位符 #{}
#{} 是 MyBatis 框架中用来表示占位符的语法。
在 @Insert注解中,#{}所代表的是一个占位符,它可以接受 Java 对象作为输入参数,并将其转换为预编译的 SQL 语句中的参数。使用 #{}可以帮助我们避免 SQL 注入等问题,同时也让 SQL 写起来更加简单。
Mybatis流程
数据库和java中的对应关系
数据库 | java |
表 | 类 |
字段名 | 属性 |
创建实体类 User 和其属性
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;}@Overridepublic 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;}}
创建@Mapper的接口类
这边需要提醒的是定接口的方法最好定义要返回值
这边 插入更新 删除的返回值 是 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 {@Testvoid contextLoads() {}@Autowiredprivate UserMapper userMapper;@Testvoid 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 {@Testvoid contextLoads() {}@Autowiredprivate UserMapper userMapper;@Testvoid insertUserTest(){User user = new User();user.setUsername("张三");user.setPassword("123");user.setNickname("老三");user.setCreated(new Date());System.out.println(userMapper.insertUser(user));}@Testvoid 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);
这边我是依据用户名删除 的#{变量} 这里的变量是形参的具体的值 所以名字必须保持一致
测试
@Testvoid 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;@Overridepublic 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<UserVO1> selectUserByUsername(String name);
测试
@Testvoid selectUserByUsernameTest(){System.out.println(userMapper.selectUserByUsername("张三"));}
测试结果等一下补