0


MyBatis详细介绍

目录

MyBatis详细介绍

二话不分三次说,先来看图

在这里插入图片描述

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis是ORM框架,能够帮助我们完成面向对象到关系型数据库的映射, 不用写复杂的JDBC 代码以及进行设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(PlainOldJavaObjects,普通老式Java 对象)为数据库中的记录。使用Mybatis框架能否很好的提高我们开发的速度和较少不必要的复杂代码。

不过在此之前我们先来了解一下ORM

什么是ORM

Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
在这里插入图片描述

一般的 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类。也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换

Mybatis基本依赖配置

maven项目加入以来即可

Mybatis的依赖配置

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>

MySQL的依赖配置

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
这是在项目开始时创建添加依赖的,难道在过程中如果想添加只能一个一个敲吗?当然不必:

介绍一个插件:
在这里插入图片描述
这是干啥的呢,就是在过程中添加依赖的:
在pom.xml中右击点击生成:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

诺,到了熟悉的界面。。。。

配置连接字符串和MyBatis

配置连接字符串

在这里插入图片描述
当然贴心的为大家准备好了代码:

datasource:
    url: jdbc:mysql://127.0.0.1:3306/java_gobang?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: wjhyd521
    driver-class-name:com.mysql.cj.jdbc.Driver

配置 MyBatis 中的 XML 路径

在这里插入图片描述

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

举个栗子

先来建一个数据库:

-- 创建数据库dropdatabaseifexists mycnblog;createdatabase mycnblog DEFAULTCHARACTERSET utf8;-- 使用数据数据use mycnblog;-- 创建表[用户表]droptableifexists userinfo;createtable userinfo(
id intprimarykeyauto_increment, username varchar(100)notnull, password varchar(32)notnull, photo varchar(500)default'', createtime datetimedefaultnow(), updatetime datetimedefaultnow(),`state`intdefault1);-- 创建文章表droptableifexists articleinfo;createtable articleinfo(
id intprimarykeyauto_increment, title varchar(100)notnull, content textnotnull,
createtime datetimedefaultnow(), updatetime datetimedefaultnow(), uid intnotnull,
rcount intnotnulldefault1,`state`intdefault1);-- 创建视频表droptableifexists videoinfo;createtable videoinfo(
vid intprimarykey,`title`varchar(250),`url`varchar(1000),
createtime datetimedefaultnow(), updatetime datetimedefaultnow(),
uid int);-- 添加一个用户信息INSERTINTO`mycnblog`.`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);-- 文章添加测试数据insertinto articleinfo(title,content,uid)values('Java','Java正文',1);-- 添加视频insertinto videoinfo(vid,title,url,uid)values(1,'java title','http://www.baidu.com',1);

MyBatis信息配置

加下来我们根据配置配置好项目的信息:

在这里插入图片描述

  • <mapper> 标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名。
  • <select> 查询标签:是用来执行数据库的查询操作的: id:是和 Interface(接口)中定义的方法名称一样的,表示对接口的具体实现方法。resultType:是返回的数据类型,也就是开头我们定义的实体类。

添加业务代码

下面是我们所实现功能的流程:
在这里插入图片描述

添加 UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><select id="getAll" resultType="com.example.demo.model.User">select * from userinfo</select></mapper>

添加实体类

packagecom.example.demo;importlombok.Data;importjava.util.Date;@DatapublicclassUser{privateInteger id;privateString username;privateString password;privateString photo;privateDate createTime;privateDate updateTime;}

添加 mapper 接口

packagecom.example.demo;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;@MapperpublicinterfaceUserMapper{publicList<User>getAll();}

添加 Service

packagecom.example.demo;importorg.springframework.stereotype.Service;importjavax.annotation.Resource;importjava.util.List;@ServicepublicclassUserService{@ResourceprivateUserMapper userMapper;publicList<User>getAll(){return userMapper.getAll();}}

添加 Controller

packagecom.example.demo;importcom.example.demo.UserService;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;importjava.util.List;@RestController@RequestMapping("/u")publicclassUserController{@ResourceprivateUserService userService;@RequestMapping("/getall")publicList<User>getAll(){return userService.getAll();}}

Mapper、Service、Controller?这命名有没有很熟悉?对开局给大家看的那张图来我们复习一下:

在这里插入图片描述

是不是豁然开朗

Okk,这下我们用MyBatis实现的用户查询就完成了,测试一下?
怎么测试呢?咱们又没写前端代码?嘿嘿嘿,介绍一款软件:
在这里插入图片描述
跟一个叫postman的软件功能基本一样,我们来测试一下如下图。
在这里插入图片描述
至于其他的数据库的增删改我们就不做演示了,毕竟是一样的东西。

查询操作

实现用用户id查询的操作

为啥要查询操作?因为要引出下面的一些东西:

参数占位符 #{} 和 ${}

#{}:预编译处理。
${}:字符直接替换。

预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用PreparedStatement 的 set 方法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

看一段栗子:
Controller:
在这里插入图片描述

@RequestMapping("/getuser")publicUsergetUserById(Integer id){return userService.getById(id);}

Service:

在这里插入图片描述

publicUsergetById(Integer id){return userMapper.getById(id);}

UserMapper.xml:

在这里插入图片描述

<select id="getById" resultType="com.example.demo.model.User">
        select * from userinfo where id=#{id}</select>

UserMapper:

在这里插入图片描述

publicUsergetById(int id);

测试一下:
在这里插入图片描述

注意事项

1

使用 ${sort} 可以实现排序查询,而使用 #{sort} 就不能实现排序查询了,因为当使用 #{sort} 查询时,如果传递的值为 String 则会加单引号,就会导致 sql 错误。

2

$会有sql注入问题

3 like 使用 #{} 报错,比如:

<select id="findUserByName2" resultType="com.example.demo.model.User"> 
    select * from userinfo where username like '%#{username}%';</select>

相当于: select * from userinfo where username like ‘%‘username’%’;
这个是不能直接使用 ${},可以考虑使用 mysql 的内置函数 concat() 来处理,实现代码如下:

<select id="findUserByName3" resultType="com.example.demo.model.User"> select * from userinfo     
    where username like concat('%',#{username},'%');</select>

多表查询

这个时候就可以使用 resultMap 了,resultMap 的使用如下:

在这里插入图片描述

一对一表映射

<resultMap id="BaseMap" type="com.example.demo.model.ArticleInfo"><id property="id" column="id"></id><result property="title" column="title"></result><result property="content" column="content"></result><result property="createtime" column="createtime"></result><result property="updatetime" column="updatetime"></result><result property="uid" column="uid"></result><result property="rcount" column="rcount"></result><result property="state" column="state"></result><association property="user" resultMap="com.example.demo.mapper.UserMapper.BaseMap" 
    columnPrefix="u_"></association></resultMap>
columnPrefix 如果省略,并且恰好两个表中如果有相同的字段,那么就会导致查询出错,

以上使用 标签,表示一对一的结果映射:

  • property 属性:指定 ArticleInfo 中对应的属性,即用户。
  • resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织用户数据。
  • columnPrefix 属性:绑定一对一对象时,是通过columnPrefix + association.resultMap.column 来映射结果集字段association.resultMap.column是指 标签中
  • resultMap属性,对应的结果集映射中,column字段。 注意事项:column不能省略
后续闲了将详细更新动态sql

本文转载自: https://blog.csdn.net/weixin_45696320/article/details/126554861
版权归原作者 一哑7 所有, 如有侵权,请联系我们删除。

“MyBatis详细介绍”的评论:

还没有评论