目录
前置条件(创建一个项目)
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;
}
@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;
}
}
创建@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 {
@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<UserVO1> selectUserByUsername(String name);
测试
@Test
void selectUserByUsernameTest(){
System.out.println(userMapper.selectUserByUsername("张三"));
}
测试结果等一下补