侧边栏壁纸
博主头像
快乐江湖的博客博主等级

更多内容请点击CSDN关注“快乐江湖”

  • 累计撰写 127 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

第九章第一节:MyBatis概述和配置开发环境

快乐江湖
2023-12-01 / 0 评论 / 0 点赞 / 9 阅读 / 27336 字

一:MyBatis概述

(1)为什么要学MyBatis

A:案例

对于下面的SQL语句

-- 创建数据库 
create database if not exists `library` default character set utf8mb4; --  使⽤数据库 
use library; 
-- 创建表 
create table if not exists `soft_bookrack` ( 
  `book_name` varchar(32) NOT NULL, 
  `book_author` varchar(32) NOT NULL, 
  `book_isbn` varchar(32) NOT NULL primary key 
); 

对应的JDBC代码如下

  • 创建数据连接池DataSource
  • 通过DataSource获取数据库连接Connection
  • 编写带占位符的SQL语句
  • 通过Connection以及SQL创建操作命令对象Statement
  • 替换占位符
  • 使用Statement执行SQL语句
  • 查询操作,返回结果集ResultSet
  • 处理结果集
  • 释放资源



可以看出整个操作流程相当繁琐。我们不但要拼接每⼀个参 数,而且还要按照模板代码的方式,⼀步步的操作数据库,并且在每次操作完,还要手动关闭连接等,而所有的这些操作步骤都需要在每个方法中重复书写。于是我们就想,那有没有⼀种方法,可以更简 单、更方便的操作数据库呢? 答案是肯定的,这就是我们要学习MyBatis 的真正原因,它可以帮助我们更方便、更快速的操作数据 库

B:理由

学习MyBatis的理由

  • 简化数据库操作: MyBatis提供了一种简单而强大的方式来执行数据库操作,尤其是对于需要执行复杂SQL查询的应用程序。通过将Java对象映射到数据库表,你可以避免手动处理结果集等繁琐的数据库访问细节
  • 灵活的SQL查询: MyBatis支持动态SQL,使得你可以根据不同的条件生成不同的SQL语句。这种灵活性对于构建复杂的查询非常有用,同时也能提高应用程序的性能
  • 与现有代码集成: MyBatis可以轻松地集成到现有的Java应用程序中,无论是基于Java EE 还是 Spring 等框架。这种灵活性使得你可以选择性地使用MyBatis来处理特定的数据库访问需求
  • 解耦数据访问层: MyBatis帮助你实现了数据访问层(DAO)的解耦。通过将SQL语句和数据库映射配置从Java代码中分离出来,你可以更容易地维护和修改数据库访问逻辑,而不影响其他层的代码
  • 性能优化: MyBatis提供了缓存机制,包括本地缓存和二级缓存,可以有效提高数据库访问性能。这对于需要频繁读取或写入数据库的应用程序来说尤其重要
  • 广泛应用: MyBatis在许多Java项目中得到广泛应用,特别是那些对数据库访问有特殊需求的项目。学习MyBatis可以为你提供一种流行且实用的数据库访问解决方案

(2)什么是MyBatis

MyBatis:是一个Java持久层框架,用于将对象与关系数据库的表之间建立映射关系。它提供了一种将数据库操作和SQL映射配置从Java代码中分离出来的方法,使得开发者可以更方便地管理SQL语句和数据库交互

  • SQL映射配置: MyBatis使用XML或注解配置文件来定义数据库操作,包括SQL语句、输入参数和输出映射
  • 对象-关系映射(ORM): MyBatis允许你将Java对象与数据库表进行映射,避免了手动处理结果集的繁琐工作
  • 动态SQL: MyBatis支持动态SQL,允许在运行时构建动态的SQL语句,根据不同的条件生成不同的查询
  • 参数映射: MyBatis可以将Java对象作为参数传递给SQL语句,也可以将查询结果映射到Java对象
  • 缓存机制: MyBatis提供了一些缓存机制,可以提高数据库访问的性能,包括本地缓存和二级缓存
  • 插件体系: MyBatis允许你使用插件来定制或扩展其行为,例如拦截SQL语句的执行

MyBatis也是一个ORM框架(对象关系映射)。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动完成数据与对象的互相转换

  • 将输入数据+SQL映射为原生SQL
  • 将结果集映射为输出对象

ORM把数据库映射为对象

  • 数据库表(table)->类(class
  • 记录(record)->对象(object
  • 字段(field)->对象的属性(attribute)

(3)如何学习MyBatis

MyBatis学习分为以下两个部分

  • 配置MyBatis开发环境
  • 使用MyBatis模式和语法操作数据库

二:配置MyBatis开发环境

(1) 准备测试所需表

为了方便说明,使用下面的表

-- 创建数据库
drop database if exists testdatabase;
create database testdatabase DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
use testdatabase;
-- 创建表[⽤户表]
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar(32) not null,
photo varchar(500) default ''
,
createtime datetime default now(),
updatetime datetime default now(),
`state` int default 1
) default charset 'utf8mb4';
-- 创建⽂章表
drop table if exists articleinfo;
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
)default charset 'utf8mb4';
-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(

vid int primary key,

`title` varchar(250),

`url` varchar(1000),
createtime datetime default now(),
updatetime datetime default now(),

uid int
)default charset 'utf8mb4';
-- 添加⼀个⽤户信息
INSERT INTO `testdatabase`.`userinfo` (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'admin', 'admin',
''
, '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1)
;
-- ⽂章添加测试数据
insert into articleinfo(title,content,uid)

values('Java','Java正⽂',1);

-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://ww
w.baidu.com',1);

(2)MyBatis相关配置

A:添加MyBatis框架支持

分为两种情况

  • 针对之前的Spring项目进行升级
  • 创建一个全新的MyBatis和SpringBoot项目

①:针对老项目

首先下载插件EditStarters

pom.xml中右键选择Generate,然后选择EditStarters

在下方勾选

  • MyBatis Framework
  • MySQL Driver

②:针对新项目

B:配置连接字符串

application.yml中配置以下信息

spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/testdatabase?characterEncoding=utf8&useSSL=false  
    username: root  
    password: zxsgdsg612057  
    driver-class-name: com.mysql.cj.jdbc.Driver

此时项目启动成功

C:配置MyBatis中的XML路径

MyBatis 由以下两部分组成

  • 接口(表的所有操作方法):给程序其他类调用
  • XML实现接口:具体写SQL语句

MyBatis 使用 XML 文件来定义数据库操作的 SQL 语句(当然可以使用注解,但太过麻烦),以及 SQL 语句与 Java 对象之间的映射关系。这些 XML 文件通常称为映射文件,其中包含了与数据库交互的 SQL 语句和相关的配置信息

例如,一个简单的映射文件可能如下所示。这里,namespace 属性指定了该映射文件对应的 Mapper 接口的全限定名。映射文件中定义了一个查询操作和一个插入操作,以及结果映射配置,将数据库中的列映射到 Java 对象的属性

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="UserResultMap" type="com.example.model.User">
        <id property="id" column="user_id"/>
        <result property="username" column="user_name"/>
        <result property="password" column="user_password"/>
    </resultMap>

    <select id="getUserById" resultMap="UserResultMap">
        SELECT * FROM users WHERE user_id = #{id}
    </select>

    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (user_name, user_password) VALUES (#{username}, #{password})
    </insert>
</mapper>

为了让MyBatis找到所需要的XML映射文件,我们需要配置MyBatis XML的文件路径。在application.yml中配置如下,所有的.xml文件在resources/mybatis

mybatis:  
  mapper-locations: classpath:mybatis/**Mapper.xml

(3) 第一个MyBatis查询

从现在开始,我们所建立的项目必须遵循标准的JavaEE项目规范


我们的目标是通过id查询user

select * from userinfo where id = 1

①:添加实体类

实体类要和表相对应

package com.example.mybatisstudy.entity;  
  
import lombok.Data;  
  
import java.time.LocalDateTime;  
  
@Data  
public class UserInfo {  
    private int id;  
    private String username;  
    private String password;  
    private String photo;  
    private LocalDateTime createtime;  
    private LocalDateTime updatetime;  
    private int state;  
}

②:添加mapper接口

package com.example.mybatisstudy.mapper;  
  
import com.example.mybatisstudy.entity.UserInfo;  
import org.apache.ibatis.annotations.Mapper;  
  
@Mapper  
public interface UserMapper {  
    UserInfo getUserById (Integer id);  
}

③:添加Xml

核心模板如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="待实现接口名">  
  
</mapper>

完整代码如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="com.example.mybatisstudy.mapper.UserMapper">  
    <select id="getUserById" resultType="com.example.mybatisstudy.entity.UserInfo">  
        select * from userinfo where id = ${id}  
    </select>  
  
</mapper>

④:添加Service

服务器层代码如下

package com.example.mybatisstudy.service;  
  
import com.example.mybatisstudy.entity.UserInfo;  
import com.example.mybatisstudy.mapper.UserMapper;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
    // Spring会找这个interface的实现类  
    // 如果有多个实现类就会报错(可以使用resource解决)  
    @Autowired  
    private UserMapper userMapper;  
      
    // 这个方法名建议和接口中的方法名一致  
    public UserInfo getUserById(Integer id) {  
        return userMapper.getUserById(id);  
    }  
  
  
}

⑤:添加Controller

控制层代码如下

package com.example.mybatisstudy.controller;  
  
import com.example.mybatisstudy.entity.UserInfo;  
import com.example.mybatisstudy.service.UserService;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
@RequestMapping("/user")  
public class UserController {  
  
    @Autowired  
    private UserService userService;  
  
    // 当返回实体对象时,Spring会自动转换为json  
    @RequestMapping("/getuserbyid")  
    public UserInfo getUserById(Integer id) {  
        if (id == null) return null;  
        return userService.getUserById(id);  
    }  
}

⑦:测试

0

评论区