JavaWeb-MyBatis(上)

学完项目管理工具Maven后,继续学习MyBatis。我们都知道,JDBC是一个与数据库连接相关的API,最开始学习数据库连接都是从JDBC开始学起,但是其也有缺点,比如硬编码和操作繁琐等等。而今天学习的MyBatis就是专门为简化JDBC开发而设计的。
在这里插入图片描述

一、MyBatis概述

1、MyBatis开发基础

MyBatis是一款优秀的持久层框架,用于简化JDBC开发。

持久层:所谓持久层,即负责将数据到保存到数据库的那一层代码。JavaEE三层架构分别为表现层、业务层、持久层,每层架构对应的具体功能后面讲框架的时候也会学到。

框架:简单理解,就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型,在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。

官网: https://mybatis.org/mybatis-3/ ,官方文档对于我们学习MyBatis具有很大的帮助和参考意义,如下翻译成中文。
在这里插入图片描述

2、MyBatis和JDBC

任何一个新技术的出现很大程度上都是为了解决或改善之前技术存在的痛点。引入MyBatis也是,因此,来看一下MyBatis和JDBC之间的比较。

2.1 JDBC缺点

1)硬编码
硬,即不可变或很难改变的意思,即字符串。硬编码,简单理解就是很多字符串信息写入代码,后续发生变动时改动量太大,代码维护性差。JDBC有以下地方体现硬编码。

1.注册驱动,获取连接
// 注册驱动
Class.forName("com.mysql.jdbc.Driver"); // 将类加载进内存 (可以省略)
// 获取连接
String url="jdbc:mysql:///db1?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url, username, password);

2.SQL语句,如
String sql="SELECT * FROM `account`";

2)操作繁琐

手动设置参数
手动封装结果集

在这里插入图片描述

2.2 MyBatis优点

1)配置文件---->解决硬编码问题
2)自动完成---->解决手动操作繁琐问题
在这里插入图片描述

MyBatis官方介绍:MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

二、MyBatis快速入门

不清楚的可参考官方文档:https://mybatis.org/mybatis-3/getting-started.html ,里面有详细说明。

1、案例

直接上手代码,以查询user表中所有数据为例。
1)创建user表,添加数据
打开Navicat,连接MySQL,并在当前连接下通过新建查询的方式创建数据库、表以及插入数据。
在这里插入图片描述

对应的代码如下

create database mybatis;
use mybatis;

drop table if exists tb_user;

create table tb_user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	gender char(1),
	addr varchar(30)
);

INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

创建插入完成后,即可查询表中数据
在这里插入图片描述

2)创建模块,导入坐标
新建一个mybatis-demo的Maven项目,在pom.xml文件中导入所需坐标。

对于坐标,需要用到什么就导入什么。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--当前项目的坐标-->
    <groupId>itweb</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--mybatis 依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

        <!--mysql 驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--junit 单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 添加logback-core依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>
</project>

3)编写MyBatis核心配置文件(mybatis-config.xml)

替换连接信息解决硬编码问题(核心两步如下)
1.数据库连接信息
2.加载sql映射文件

在resources目录下新建一个mybatis-config.xml文件
在这里插入图片描述

对应代码如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载sql映射文件-->
    <mappers>
    <!--由于mybatis-config.xml与UserMapper.xml同级,所以直接写名称-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

4)编写SQL映射文件(XxxMapper.xml)

统一管理sql语句,解决硬编码问题

编写sql查询及增删改语句(名称空间namespace和id,类模块resultType) id有selectAll等

在resources目录下新建一个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">
<!--
    namespace:名称空间
-->
<mapper namespace="test">
    
    <select id="selectAll" resultType="com.itweb.pojo.User">
        select * from tb_user;
    </select>
</mapper>

5)编码
第一,定义POJO实体类(Xxx类),两个要点如下

1.封装所有与数据库同名的属性
2.提供get、set方法和重写toString方法

在java目录下新建一个User类(com.itweb.pojo.User)

package com.itweb.pojo;
// 处理属性字段时,alt + 鼠标左键 整列编辑
public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;
    // 提供get、set方法(鼠标右键快捷生成)
    public Integer getId() {
        return id;
    }
    public void setId(Integer 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 getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    // 提供重写toString方法(鼠标右键快捷生成)
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

第二,加载核心配置文件,获取SqISessionFactory对象
第三,获取 SqlSession对象,执行SQL语句
第四,释放资源
在java目录下新建一个MyBatisDemo类(com.itweb.MyBatisDemo),以上三步对应的代码如下

package com.itweb;

import com.itweb.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        // 1.加载核心配置文件,获取 SqlSessionFactory 对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 2.获取SqlSession对象,用来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 3.执行sql
        List<User> users = sqlSession.selectList("test.selectAll");
        System.out.println(users);

        // 4.释放资源
        sqlSession.close();
    }
}

运行结果如下
在这里插入图片描述

总结:项目结构及相关步骤回顾梳理
结合项目结构来梳理项目的相关步骤流程,一图以蔽之,如下。
在这里插入图片描述

2、解决SQL映射文件的警告提示

SQL映射文件里的表名爆红,是警告提示而非错误。
在这里插入图片描述

产生原因:Idea 和数据库没有建立连接,不识别表信息
解决方式:在 Idea 中配置 MySQL 数据库连接
在这里插入图片描述

连接成功后如下图
在这里插入图片描述

由此可见IDEA功能十分强大,只要数据库连接成功,以后就能非常方便的在IDEA中编写数据库代码了。

三、Mapper代理开发

1、目的

1)解决原生方式中的硬编码
2)简化后期执行SQL

2、步骤

1)定义与SQL映射文件同名的Mapper接口,并且将Mapper接口(如UserMapper.class接口)和SQL映射文件(如UserMapper.xml)放置在同一目录下

注:在resources目录下创建分层的包要用 / 而不是 .

2)设置SQL映射文件的namespace属性为Mapper接口全限定名(如com.itweb.mapper.UserMapper)
3)在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
(以上三步对应下图)
在这里插入图片描述

4)编码

1.通过SqlSession的getMapper方法获取Mapper接口的代理对象
2.调用对应方法完成sql的执行

在这里插入图片描述

在这里插入图片描述

注:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载

在这里插入图片描述

四、MyBatis核心配置文件

参考官方文档:https://mybatis.org/mybatis-3/configuration.html

在这里插入图片描述

1、类型别名(typeAliasess)

<typeAliases>
  <package name="com.itweb.pojo"/>
</typeAliases>

注:配置各个标签时,需要遵守前后顺序

其他更多的可以参考官方文档自行学习,不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/439073.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义协议清理后,浏览器还一直弹出匹配提示用户新应用打开问题

问题 这段时间出现了自定义协议清理异常的问题。在一台电脑上&#xff0c;用chrome&#xff0c;一直出现问题&#xff0c;自定义协议可能存在了缓存或者其他内容。导致一直重复的弹出ms-store打开新应用的奇怪问题。 后来 第一步&#xff1a; 清理注册表&#xff0c;把注册…

创新驱动!HubSpot引领CRM革命

在当今高速发展的数字化时代&#xff0c;企业的国际化布局和市场开拓已经成为了一种必然的趋势。随着企业出海步伐的加快&#xff0c;有效的客户关系管理&#xff08;CRM&#xff09;和营销自动化工具变得尤为重要。这就是HubSpot发力的领域。HubSpot&#xff0c;作为一家领先的…

容器+虚拟机双引擎,ZStack Edge云原生超融合打通业务最后一公里

企业数字化转型的焦点正在发生变化&#xff0c;云基础设施由资源到应用&#xff0c;数据中心从核心到边缘。面向云原生趋势&#xff0c;围绕应用升级&#xff0c;新一代超融合产品——云原生超融合应运而生。 云原生与边缘计算趋势催生云原生超融合 当前&#xff0c;企业客户…

Buran勒索病毒通过Microsoft Excel Web查询文件进行传播

Buran勒索病毒首次出现在2019年5月&#xff0c;是一款新型的基于RaaS模式进行传播的新型勒索病毒&#xff0c;在一个著名的俄罗斯论坛中进行销售&#xff0c;与其他基于RaaS勒索病毒(如GandCrab)获得30%-40%的收入不同&#xff0c;Buran勒索病毒的作者仅占感染产生的25%的收入,…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

CrySiS勒索病毒最新变种来袭,加密后缀为kharma

CrySiS勒索病毒&#xff0c;又称Dharma&#xff0c;首次出现是在2016年&#xff0c;2017年5月此勒索病毒万能密钥被公布之后&#xff0c;之前的样本可以解密&#xff0c;导致此勒索病毒曾消失了一段时间&#xff0c;不过随后又马上出现了它的一款最新的变种样本&#xff0c;加密…

H12-821_145

145. OPSF邻接关系建立的过程中需要使用不同的报文&#xff0c;那么请分别将以下各个状态和该状态使用的报文联系起来。 答案&#xff1a; 注释&#xff1a; ExStart状态通过DD报文进行主从选举。 2-way状态通过hello报文知道哪些邻居看到了自己。 Loading状态通过LSR/LSU报文同…

视觉和GPT再碰火花!CVPR`24 | RegionGPT:面向复杂区域理解的VLM(港大英伟达)

文章链接&#xff1a;https://arxiv.org/pdf/2403.02330 视觉语言模型&#xff08;VLMs&#xff09;通过将大语言模型&#xff08;LLMs&#xff09;与图像文本对集成&#xff0c;经历了快速的发展&#xff0c;但由于视觉编码器的空间意识有限以及使用缺乏详细的区域特定字幕的…

从数据到智能:探讨大数据在AI领域的核心作用

前言 大数据和人工智能已经成为当今社会的两大热门话题。它们之间究竟有何关系&#xff1f;又如何在各个领域发挥着重要作用&#xff1f; 概念区别与联系 一、大数据与人工智能的基本概念 大数据&#xff0c;顾名思义&#xff0c;指的是海量的、类型繁多的数据集合。这些数据…

20240304-2-计算机网络

计算机网络 知识体系 Questions 1.计算机网络分层的优点和缺点 优点 各层之间是独立的&#xff1b;灵活性好&#xff1b;结构上可分割开&#xff1b;易于实现和维护&#xff1b;能促进标准化工作。 缺点&#xff1a; 降低效率&#xff1b;有些功能会在不同的层次中重复出现&…

软考 系统分析师系列知识点之系统性能评估(5)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之系统性能评估&#xff08;4&#xff09; 所属章节&#xff1a; 第6章. 系统配置与性能评价 第8节. 系统性能评估 相关试题 1. 以下关于系统型嫩评估方法的描述&#xff0c;错误的是&#xff08; &#xff09;。 A. 指令…

ChatGPT/GPT4科研技术应用与AI绘图(包含Claude3、Gemini、Sora、GPTs中大模型的最新技术)

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

51-26 DriveMLM: 多模态大型语言模型与自动驾驶行为规划状态对齐

DriveMLM是来自上海AILab、港中文、商汤、斯坦福、南京大学和清华大学的工作。该模型使用各种传感器(如相机、激光雷达)、驾驶规则和用户指令作为输入&#xff0c;采用多模态LLM对AD系统的行为规划进行建模&#xff0c;做出驾驶决策并提供解释。该模型可以用于闭环自动驾驶&…

Dubbo基本知识

Dubbo 工作原理 工作原理分 10 层&#xff1a; 第一层&#xff1a;service 层&#xff0c;接口层&#xff0c;给服务提供者和消费者来实现的&#xff08;留给开发人员来实现&#xff09;&#xff1b;第二层&#xff1a;config 层&#xff0c;配置层&#xff0c;主要是对 Dubb…

利用tree命令自动保存文件层级结构

tree命令的使用 为了将上图左侧的文件目录&#xff0c;生成上图右侧中的文件夹结构列表&#xff0c;保存在txt中&#xff0c;使用了如下cmd命令&#xff1a; C:\armadillo-12.8.0>tree .>list.txt以上tree命令分为3部分&#xff1a; tree 命令. 在当前目录>list.tx…

✅ Windows11 系统 I 卡独显 A770 安装 深度学习 Pytorch 环境

&#x1f4cb; 文献参考 这里非常感谢知乎上的 ‘丢丢’ 的[**Windows系统下英特尔独显Pytorch的历程**] 为我提供了一开始的 I 卡安装想法&#xff01;但是文中并未介绍如何进行额外的环境变量操作问题&#xff0c;导致很多软件直接安装至系统盘&#xff0c;占用系统盘空间&am…

HTML静态网页成品作业(HTML+CSS)——美食企业介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

前端布局方式及其优缺点

前端布局方式多种多样&#xff0c;每种布局方式都有其特定的应用场景、特性和优缺点。以下是一些常见的前端布局方式及其特点和优缺点&#xff1a; 静态布局&#xff1a; 特性&#xff1a;元素的尺寸使用绝对单位&#xff08;如px&#xff09;进行定义&#xff0c;不会随浏览器…

神经网络必备基础

和神经网络介绍相比&#xff0c;本文更侧重于程序实现 理解Keras中的组件 Keras是一个高级的神经网络API&#xff0c;用Python实现的&#xff0c;并且可以运行在TensorFlow、CNTK或Theano等后台之上。 model.compile() compile(self, optimizer, loss, metricsNone, ...) 该…

Python刘诗诗

写在前面 刘诗诗在电视剧《一念关山》中饰演了女主角任如意&#xff0c;这是一个极具魅力的女性角色&#xff0c;她既是一位有着高超武艺和智慧的女侠士&#xff0c;也曾经是安国朱衣卫前左使&#xff0c;身怀绝技且性格坚韧不屈。剧中&#xff0c;任如意因不满于朱衣卫的暴行…