Java数据库操作——从JDBC到Mybatis

一、JDBC访问数据库

  • Java连接数据库之前已经说过,通过JDBC查询数据库数据,一般需要以下七个步骤:
    (1) 加载JDBC驱动
    (2) 建立并获取数据库连接
    (3) 创建 JDBC Statements 对象
    (4) 设置SQL语句的传入参数
    (5) 执行SQL语句并获得查询结果
    (6) 对查询结果进行转换处理并将处理结果返回
    (7) 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)

  • 存在的问题

1.数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
2.Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

  • 解决方法

1.数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间
2.我们可以考虑不把SQL语句写到Java代码中,而是将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。然后
通过SQL语句的key值去获取对应的SQL语句。

二、mybatis连接数据库

1. mybatis特性:

(1) 使用连接池对连接进行管理
(2) SQL和代码分离,集中管理(mapper.xml)
(3) 参数映射和动态SQL
(4) 结果集映射
(5) 缓存管理
(6) 重复SQL提取
(7) 插件机制

2. MyBatis工作原理

(1) 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
(2) 加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3) 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
(4) 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
(5) Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
(6) MappedStatement 对象:在 Executor 接口的执行方法中有一个MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
(7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
(8) 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
在这里插入图片描述

3. Spring 集成Mybatis(IDEA)

  • 新建项目,选择spring initializr,initializr service URL使用default就行
    在这里插入图片描述
  • 项目元数据界面的选择,其实选择默认的,不过我Java Version改为了8,Artifa 改为了mybatis_demo,注意项目名不能大小写混杂,然后点next就行了
    在这里插入图片描述
  • 选择依赖,web里面要把spring web选上,然后在SQL里面把Mybatis Framework、MySQL Driver、JDBC API选上,最后可以在旁边的selected Dependence里查看自己选择的项,点击next之后点击finish就完成项目建立了。
    在这里插入图片描述
  • 打开查看pom.xml文件,可以看到刚刚我们选择的依赖已经自动添加到我们的文件中了
    在这里插入图片描述
  • 修改application.properties文件,application.properties是项目自带的配置文件,也可以建立其他的配置文件,可以在文中添加端口、数据源、mydatis等相关数据
  • 建立项目文件User.Java
    在这里插入图片描述
package com.example.mybatis_demo.user;

public class User {
    private int userid;
    private String username;
    private String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  • 新建UserMapper.Java
    在这里插入图片描述
package com.example.mybatis_demo.mapper;

import com.example.mybatis_demo.user.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    public List<User> findAllUser();
    public List<User> findUserByUserId(int userid);
}
  • 新建UserService.Java
    在这里插入图片描述
package com.example.mybatis_demo.service;

import com.example.mybatis_demo.mapper.UserMapper;
import com.example.mybatis_demo.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired(required=false)
    public UserMapper userMapper;

    public List<User> findAllUser(){
        return userMapper.findAllUser();
    }

    public List<User> findUserByUserId(int userid){
        return userMapper.findUserByUserId(userid);
    }
}
  • 新建UserController.Java
    在这里插入图片描述
package com.example.mybatis_demo.controller;

import com.example.mybatis_demo.service.UserService;
import com.example.mybatis_demo.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getAllUser")
    public List<User> findAll(){
        return userService.findAllUser();
    }

    @RequestMapping("/getUserByUserID/{userid}")
    public List<User> findUserByUserId(@PathVariable int userid){
        return userService.findUserByUserId(userid);
    }
}
  • 建立mapper文件,在里面建立UserMapper.xml,这个xml文件就是映射文件,sql语句就是在这里面写的,注意具体包名位置(namespace)与刚刚建立的usemapper类要对应。
    在这里插入图片描述
<?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.mybatis_demo.mapper.UserMapper">
    <resultMap id="result" type="com.example.mybatis_demo.user.User">
        <result column="userid" jdbcType="INTEGER" property="userid" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
    </resultMap>

    <select id="findAllUser" resultType="com.example.mybatis_demo.user.User">
        select  * from user;
    </select>

    <select id="findUserByUserId" resultType="com.example.mybatis_demo.user.User">
        select * from user where userid=#{userid};
    </select>
</mapper>
  • MySQL方面,首先是创建表格,结构如下,表名为user
    在这里插入图片描述
  • 在浏览器中输入http://localhost:8080/user/getAllUser就可以看到查询结果,查询的语句是在映射文件里的,而路径由来是UserController.Java里确定的,查询结果如下图。
    在这里插入图片描述

三、总结

在IDEA里用jdbc和用mybatis连接区别还是蛮大的:用jdbc是需要导入一个包,而sql语句则是直接在代码里构造;而用mybatis则是需要加入依赖,且需要配置,但sql语句与代码是分开的,直接在映射文件里更改sql就行了。当数据库的变更比较频繁时或查询的需求变化时,mybatis的使用更有利于代码的维护。


参考文献
从JDBC到Mybatis的改进
MyBatis-从JDBC到Spring整合MyBatis
IDEA使用mybatis连接MySQL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 一、 JavaSE 部分 1、 Java 基础 ①Java 基础部分(基本语法, Java 特性等) ②关键字 ③面向对象 ④集合部分 2、 Java 高级知识 ①线程 ②锁 ③JDK ④反射 ⑤JVM ⑥GC ⑦ IO 和 NIO, AIO 二、 JavaEE 部分 1、 Spring ①IoC 与 Bean 配置、 管理 ②AOP 与事务、 权限控制 ③S2SH 整合开发 ④Spring, JPA 整合 2、 Hibernate ①ORM 与持久化映射 ②延迟加载、 性能优化 ③HQL 查询、 条件查询、 SQL 查询 ④二级缓存与查询缓存 3、 Struts ①MVC 模式与 Struts 体系 4、 mybatis 5、 MVC 框架 6、 各框架对比与项目优化 7、 JPA ①EJB 三、 Java web 开发核心内容 1、 web 编程基础 ①Tomcat 服务器NOWCODER.COM 牛客网——互联网学习求职必备神器 名企校招历年笔试面试真题, 尽在牛客网 牛客网, 互联网人都在用的学习求职神器 ②JSP 语法, EL, 内置对象 ③Listener 和 filter 2、 Web 编程进阶 ①Servlet、 标签的作用 ②redis ③MVC 和 DAO ④JSTL、 DisplayTag 等常见标签库的用法 3、 Web 编程原理 ① HTTP 协议 ②请求/相应架构原理 ③web 容器 四、 JDBC 编程 1、 SQL 基础 2、 JDBC 基础 ①数据库数据库连接池 ③事物管理, 批处理 3、 JDBC 进阶 五、 XML 编程 1、 XML 基础 2、 XML 进阶 3、 Web service ①WSDL 与 SOAP 协议 六、 计算机网络 1、 网络概述 ①关于分层 2、 运输层 ①TCP 与 UDP ②协议 3、 网络层 ①网际协议 IP ②网际控制报文协议 ICMP ③因特网的路由器选择协议 4、 应用层 ①域名系统 DNS ②电子邮件NOWCODER.COM 牛客网——互联网学习求职必备神器 名企校招历年笔试面试真题, 尽在牛客网 牛客网, 互联网人都在用的学习求职神器 七、 操作系统 1、 操作系统概论 2、 进程的描述与控制 3、 输入输出系统 4、 存储器管理 5、 处理机调度与死锁 八、 算法与数据结构 1、 哈希 2、 树 3、 遍历 4、 链表 5、 数组 6、 排序 7、 堆与栈 8、 队列 9、 高级算法 九、 设计模式 1、 结构型模式 ①代理模式 ②装饰模式 ③适配器模式 2、 创建型模式 ①单例模式 3、 行为型模式 ①策略模式 ②观察者模式 4、 所有模式汇总 十、 场景题 十一、 UML
JDBCMyBatis是两种不同的持久层框架。JDBCJava Database Connectivity)是Java语言访问关系型数据库的标准API,而MyBatis是一个开源的持久层框架,它封装了JDBC的细节,简化了数据库访问的操作JDBC的缺点包括工作量较大和异常处理的复杂性。使用JDBC需要手动连接数据库、处理事务、操作各种对象并关闭它们。同时,我们还需要对可能出现的异常进行捕捉和正确关闭资源。 相比之下,MyBatis提供了更高级的抽象层,使得数据库操作更加简单和灵活。MyBatis通过XML或注解的方式将SQL语句与Java代码解耦,提供了更好的可维护性和可读性。此外,MyBatis还提供了缓存机制,可以提高查询性能。 总结来说,JDBC是一种更底层的数据库访问API,需要手动处理更多的细节,而MyBatis则是在JDBC之上提供了更高级的抽象,简化了数据库操作的过程,并提供了更好的可维护性和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [木木的Java知识整理——JDBCMyBatis的区别](https://blog.csdn.net/weixin_42287169/article/details/105781951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值