• 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代码并对数据库中数据进行增删改查操作。

     配置外部属性文件

    1. 其配置需要包含url,username,password
    2. 这边是一个实例
    3. spring.datasource.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    4. spring.datasource.username=root
    5. 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  和其属性

    1. package org.example.demo_formybatis.pojo.entity;
    2. import java.util.Date;
    3. public class User {
    4. private Long id;
    5. private String username;
    6. private String password;
    7. private String nickname;
    8. private Date created;
    9. public Date getCreated() {
    10. return created;
    11. }
    12. public void setCreated(Date created) {
    13. this.created = created;
    14. }
    15. @Override
    16. public String toString() {
    17. return "User{" +
    18. "id=" + id +
    19. ", username='" + username + '\'' +
    20. ", password='" + password + '\'' +
    21. ", nickname='" + nickname + '\'' +
    22. ", created='" + created + '\'' +
    23. '}';
    24. }
    25. public Long getId() {
    26. return id;
    27. }
    28. public void setId(Long id) {
    29. this.id = id;
    30. }
    31. public String getUsername() {
    32. return username;
    33. }
    34. public void setUsername(String username) {
    35. this.username = username;
    36. }
    37. public String getPassword() {
    38. return password;
    39. }
    40. public void setPassword(String password) {
    41. this.password = password;
    42. }
    43. public String getNickname() {
    44. return nickname;
    45. }
    46. public void setNickname(String nickname) {
    47. this.nickname = nickname;
    48. }
    49. }
    创建@Mapper的接口类

    这边需要提醒的是定接口的方法最好定义要返回值

    这边 插入更新 删除的返回值 是 int(可以返回影响的数据的条数)

    而查询则需要根据具体情况判断

    数据库的数据的插入 

    1. package org.example.demo_formybatis.mappers;
    2. import org.apache.ibatis.annotations.Insert;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import org.example.demo_formybatis.pojo.entity.User;
    5. @Mapper
    6. public interface UserMapper {
    7. @Insert("INSERT INTO user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")
    8. int insertUser(User user);
    9. }
    测试类测试

    在说导入外部属性文件的时候 我们自己建立一个测试类 @Test测试

    这边现在只需要 在 Test包下找到配置的包 这边是DemoFormybatisApplicationTests

     这边测试一下 

    1. package org.example.demo_formybatis;
    2. import org.example.demo_formybatis.mappers.UserMapper;
    3. import org.example.demo_formybatis.pojo.entity.User;
    4. import org.junit.jupiter.api.Test;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.boot.test.context.SpringBootTest;
    7. import java.util.Date;
    8. @SpringBootTest
    9. class DemoFormybatisApplicationTests {
    10. @Test
    11. void contextLoads() {
    12. }
    13. @Autowired
    14. private UserMapper userMapper;
    15. @Test
    16. void insertUserTest(){
    17. User user = new User();
    18. user.setUsername("张三");
    19. user.setPassword("123");
    20. user.setNickname("老三");
    21. user.setCreated(new Date());
    22. System.out.println(userMapper.insertUser(user));
    23. }
    24. }

     点击测试按钮(这边事先运行了一次)

    运行成功图

    查看数据库中的数据

    实例数据库数据的更新

    接下来 数据库的更新数据

    需要注意的是 必须更新数据必须写WHERE,

    使用的是mybatis框架它没有提示

    我们只需要更新张三的名字为李四

    这边需要注意的是我们@Mapper注解的接口的方法传递的参数需要仍然是一个实体类对象 而不是一个id值

    1. package org.example.demo_formybatis.mappers;
    2. import org.apache.ibatis.annotations.Insert;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import org.apache.ibatis.annotations.Update;
    5. import org.example.demo_formybatis.pojo.entity.User;
    6. @Mapper
    7. public interface UserMapper {
    8. @Insert("INSERT INTO user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")
    9. int insertUser(User user);
    10. @Update("UPDATE user SET username= #{username} WHERE id =#{id}")
    11. int updateUser(User user);
    12. }

    测试

    1. package org.example.demo_formybatis;
    2. import org.example.demo_formybatis.mappers.UserMapper;
    3. import org.example.demo_formybatis.pojo.entity.User;
    4. import org.junit.jupiter.api.Test;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.boot.test.context.SpringBootTest;
    7. import java.util.Date;
    8. @SpringBootTest
    9. class DemoFormybatisApplicationTests {
    10. @Test
    11. void contextLoads() {
    12. }
    13. @Autowired
    14. private UserMapper userMapper;
    15. @Test
    16. void insertUserTest(){
    17. User user = new User();
    18. user.setUsername("张三");
    19. user.setPassword("123");
    20. user.setNickname("老三");
    21. user.setCreated(new Date());
    22. System.out.println(userMapper.insertUser(user));
    23. }
    24. @Test
    25. void updateUserTest(){
    26. User user = new User();
    27. user.setId(103L);
    28. user.setUsername("李四");
    29. System.out.println(userMapper.updateUser(user));
    30. }
    31. }

    运行结果图

    数据库的情况

    实例数据库数值的删除

    删除李四的数据

    这边不重复写前面的了东西了 ,这边只写相关代码

    1. @Delete("DELETE FROM user WHERE username = #{name}")
    2. int deleteUser(String name);

    这边我是依据用户名删除 的#{变量} 这里的变量是形参的具体的值 所以名字必须保持一致

    测试

    1. @Test
    2. void deleteUserTest(){
    3. System.out.println(userMapper.deleteUser("李四"));
    4. }

     运行结果

    数据库的情况

    实例数据库的查询

    查询比较特殊点在于:数据库的对字段查询会返回一个结果集 

    这边引入新的概念: VO

    VO(Value Object,值对象)是一种设计模式,用于封装从数据库查询结果中获取的数据。VO主要作为数据传输的载体,它与数据库表结构相对应,但不包含任何业务逻辑,仅用于存储和传递数据。

    总结来说,MyBatis中的VO是用于封装数据库查询结果的一种对象,它提供了面向对象的数据封装方式,有助于提高代码的可读性和可维护性。在实际项目中,根据查询需求和业务场景,可以设计相应的VO类,配合MyBatis的映射机制,实现数据的高效访问和传输。

    简单而言 如果需要从数据库返回特定字段名的数值,就可以使用VO,

    此时我们需要封装一个VO的实体类

    假设我们需要返回字段名   username,password,nickname 的数值,

    当然全字段返回的可以使用实体类

    1. package org.example.demo_formybatis.pojo.vo;
    2. public class UserVO1 {
    3. private Long id;
    4. private String username;
    5. private String password;
    6. private String nickname;
    7. @Override
    8. public String toString() {
    9. return "User{" +
    10. "id=" + id +
    11. ", username='" + username + '\'' +
    12. ", password='" + password + '\'' +
    13. ", nickname='" + nickname + '\'' +
    14. '}';
    15. }
    16. public Long getId() {
    17. return id;
    18. }
    19. public void setId(Long id) {
    20. this.id = id;
    21. }
    22. public String getUsername() {
    23. return username;
    24. }
    25. public void setUsername(String username) {
    26. this.username = username;
    27. }
    28. public String getPassword() {
    29. return password;
    30. }
    31. public void setPassword(String password) {
    32. this.password = password;
    33. }
    34. public String getNickname() {
    35. return nickname;
    36. }
    37. public void setNickname(String nickname) {
    38. this.nickname = nickname;
    39. }
    40. }

    查询 用户名为张三的数据

    1. @Select("SELECT username,password,nickname FROM user WHERE username = #{name}")
    2. List selectUserByUsername(String name);

    测试 

    1. @Test
    2. void selectUserByUsernameTest(){
    3. System.out.println(userMapper.selectUserByUsername("张三"));
    4. }

    测试结果等一下补

  • 相关阅读:
    【日积月累】Java开发习惯养成
    在Lua解释器中注册自定义函数库
    相机内参数矩阵推导
    代码随想录算法训练营第44天 | ● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
    easy-monitor3.0 nodejs性能监控和分析工具
    Linux手记
    【附源码】Python计算机毕业设计水库洪水预报调度系统
    抗原检测统计小程序
    【面试经典150 | 哈希表】快乐数
    mysql编译安装教程
  • 原文地址:https://blog.csdn.net/qq_61549190/article/details/138035070