从JDBC到Mybatis

一、从JDBC到Mybatis的改进

1.原始的JDBC连接数据库

(1)代码实现:

package esgdsfrg;

import java.sql.*;

public class Dtfgsewrf {
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/sys?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";

    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "111111";

    public static void main(String[] args){
        Connection conn=null;
        Statement stmt=null;
        try{
            //注册JDBC驱动
            Class.forName(JDBC_DRIVER);

            //打开链接
            System.out.println("连接数据库...");
            conn=DriverManager.getConnection(DB_URL,USER,PASS);

            //执行查询
            System.out.println("实例化Statement对象...");
            stmt=conn.createStatement();
            String sql;
            sql="SELECT * FROM student";//数据库中的表名
            ResultSet rs=stmt.executeQuery(sql);

            //展开结果集数据库
            while(rs.next()){
                //通过字段检索
                int id=rs.getInt("id");
                String name=rs.getString("name");
                String age=rs.getString("age");
                String sex=rs.getString("sex");
                String sorce=rs.getString("sorce");
                //输出数据
                System.out.print("ID:"+id);
                System.out.print(",姓名:"+name);
                System.out.print(",年龄:"+age);
                System.out.print("性别: "+sex);
                System.out.print("分数:"+sorce);
                System.out.print("\n");
            }
            //完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException | ClassNotFoundException se) {
            //处理前面JDBC错误和Class.forName 错误
            se.printStackTrace();
        }finally {
            //关闭资源
            try{
                if (stmt!=null) stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try{
                if(conn!=null)conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        System.out.println("连接数据库结束");
    }

}

JDBC的步骤:

·加载数据库驱动
·创建并获取数据库链接
·创建JDBC statement对象
·设置sql语句
·设置sql语句中的参数(用prepareStatement)
·通过statement执行sql并获取结果
·对sql执行结果进行解析处理
·释放资源(preparestatement、connection、resultSet)

因为以上过程,就会导致一些问题。

问题1:数据库链接创建、释放频繁造成系统资源浪费从而影响系
统性能。
解决问题:数据库连接的获取和关闭我们可以使用数据库连接池
来解决资源浪费的问题。通过连接池就可以反复利用所创建的连接
去访问数据库了,减少连接的开启和关闭时间。
问题2:sql语句在代码中硬编码,造成代码不易维护,实际应用
sql的变化可能较大,sql变动需要改变java代码。
解决问题:Mybatis把sql语句写在配置文件中通过xml或注解的
方式将要执行的各种statement(statement、
prepareStatement、CallableStatement)配置起来,
并通过Java对象和statement中的sql进行映射生成最终可执行的
sql语句,最后由Mybatis框架执行sql并将结果映射成Java对象
返回。这样当需要更改sql时,只需要更改配置文件。(不影响接
口的情况下)
问题3:使用prepareStatement向占有位符号传参数存在硬编码,
因为sql语句的where条件不一定,可能多也可能少,修改sql还
要修改代码,系统不宜维护。
解决问题:同上,配置文件。

下面来看看Mybatis的执行过程:

1.mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,
配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的
sql语句。此文件需要在SqlMapConfig.xml中加载。 
2.通过mybatis环境等配置信息构造SqlSessionFactory即绘画
工厂。
3.由会话工厂创建sqlSession即会话,操作数据库由
sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,
Executor接口有两个实现,一个是基本执行器、一个是缓存
执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装
了mybatis配置信息及sql映射信息等。 mapper.xml文件中一个
sql对应一个Mapped Statement对象,sql的id即是Mapped
statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括
HashMap、基本类型、pojo,Executor通过Mapped Statemen
t在执行sql前将输入的java对象映射至sql中,输入参数映射
就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括
HashMap、基本类型、pojo,Executor通 过Mapped Statement
在执行sql后将输出结果映射至java对象中,输出结果映射过程相
当于jdbc编程中对结果的解析处理过程。

二、在idea环境下Mybatis访问mysql数据

1.在idea下新建项目工程

选择左侧的Spring Initializr,jdk要求1.8及以上,选择默认的Default下一步:
在这里插入图片描述
我们可以不改这些信息直接下一步,如果想改名字可以自己修改Group及Artifact,和最下边的package包名,选择下一步
在这里插入图片描述

选择项目所需要的依赖,这个页面是选择你工程中需要用到的依赖,因为我们的目标是web项目使用mybatis所以在web模块中勾选Spring Web,在SQL中依次勾选Jdbc API、Mybatis Framework、Mysql Driver。然后下一步直到finish即可。
在这里插入图片描述
在这里插入图片描述
接着项目就会下载我们需要的依赖
在这里插入图片描述

2.配置项目相关信息

1.来看下建好后的pom.xml文件,上一步选择的依赖,在pom.xml文件中 已经自动添加到我们的文件中了。下面为本项目的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

修改配置文件

Spring Boot通过pom.xml中引入模块化的Stater,使得常规的开发场景可以很快把应用搭建起来。在使用Spring Boot的过程中,除了可以在pom.xml中配置一些内容外,一些项目相关的配置也可以在application.properties中通过配置来完成。

application.properties文件为默认项目配置文件,默认为空的,我们可以在配置文件中配置端口、名字等一般属性,也可以配置自定义属性、参数引用、多环境配置等,可以参考 https://www.jianshu.com/p/c023083f51b4 一文说明介绍。 application.properties文件在项目-src-main-resources下。

本项目如果使用application.properties文件,可以在文件中添加端口、数据源、mydatis等相关数据,下面为文件内容。

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

3.创建User实体类实现业务流程

1.创建数据表
在这里插入图片描述

2.创建项目路径包来,展示业务流程。在项目src-main-java-com-sjzeis下分别创建包:controller、entity、mapper、service,用来实现控制层、实体层、映射层、业务层。
3 .在src-main-resources下创建mapper包用于存放*Mapper.xml文件

项目结构如图:

创建entity实体类User:

package com.sjzeis.entity;
 
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 + '\'' +
                '}';
    }
}

创建Mapper映射操作UserMapper:

package com.example.demo.control;
 
import com.sjzeis.entity.User;
import org.apache.ibatis.annotations.Mapper;
 
import java.util.List;
 
@Mapper
public interface UserMapper {
    public List<User> findAllUser();
    public List<User> findUserByUserId(int id);
}

创建Mapper映射对应的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">
    <resultMap id="result" type="com.example.demo.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="hobby" jdbcType="VARCHAR" property="hobby" />
    </resultMap>
    <select id="findAllUser" resultType="com.example.demo.entity.User">
        select * from user;
    </select>


</mapper>

创建service业务UserService类:

package com.example.demo.service;


import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
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();
    }

}

最后运行,
在这里插入图片描述
并且在地址栏输入:localhost:8080/user/getAllUser/
在这里插入图片描述

三、总结

该文章主要内容为从JDBC连接数据库到Mybatis的改进。并且了解Mybatis。

四、参考文献

https://blog.csdn.net/mahaokun/article/details/103221874/

https://blog.csdn.net/qq_45659777/article/details/120788539?spm=1001.2014.3001.5501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBCMyBatis是两种不同的持久层框架。JDBC(Java 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、付费专栏及课程。

余额充值