java-spring-mybatis -学习第一天-基础知识讲解

目录

前置条件(创建一个项目)

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和数据库中的对应关系
数据库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 cn.tedu.demoforcsdn.pojo.vo;

public class UserVO {
    private  Long id;
    private String username;
    private String password;
    private String nickname;

    @Override
    public String toString() {
        return "UserVO{" +
                "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("张三"));
    }

测试结果

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值