首页 > 其他分享 >mybatis---回顾jdbc

mybatis---回顾jdbc

时间:2024-10-31 14:44:57浏览次数:1  
标签:jdbc java String age --- sql mybatis public

回顾 JDBC

image-20241014140022337

使用 IDEA 创建 maven 工程

打开IDEA,选择Create New Project,点击Maven,如下:

20200618185538

点击Next,填写Maven工程信息,如下:

  • GroupId: com.mybatis
  • ArtifactId:MyBatisApp
  • Version: 1.0-SNAPSHOT

点击创建按钮,即Maven工程就创建好了

引入mysql依赖包

在Maven工程的pom.xml文件中导入 mysql 驱动依赖包

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.15</version>
    </dependency>
</dependencies>

创建数据库

使用Navicat工具创建名为mybatis的数据库,字符集编码为utf-8

 #创建数据库
 CREATE DATABASE IF NOT EXISTS `mybatis` DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 

创建数据库表

#创建表
DROP TABLE IF EXISTS tb_user;
CREATE TABLE tb_user (
    id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    userName varchar(32) DEFAULT NULL,
    password varchar(32) DEFAULT NULL,
    name varchar(32) DEFAULT NULL,
    age int(10) DEFAULT NULL,
    sex int(2) DEFAULT NULL,
    birthday date DEFAULT NULL,
    created datetime DEFAULT NULL,
    updated datetime DEFAULT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

#插入数据
INSERT INTO tb_user ( userName, password, name, age, sex, birthday, created, updated) VALUES ( 'zs', '123456', '张三', '22', '1', '1990-09-02', sysdate(), sysdate());
INSERT INTO tb_user ( userName, password, name, age, sex, birthday, created, updated) VALUES ( 'ls', '123456', '李四', '24', '1', '1993-09-05', sysdate(), sysdate());

Navicat显示结果如下:

20200619102447

User实体类代码

Maven工程的main/java/entity下创建UserEntity.java文件

import java.util.Date;

public class UserEntity {
    private int id;
    private String userName;
    private String password;
    private String name;
    private int age;
    private int sex;
    private Date birthday;
    private String created;
    private String updated;

    public int getId() {
        return id;
    }

    public void setId(int 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 getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getCreated() {
        return created;
    }

    public void setCreated(String created) {
        this.created = created;
    }

    public String getUpdated() {
        return updated;
    }

    public void setUpdated(String updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "UserEntity{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", birthday=" + birthday +
                ", created='" + created + '\'' +
                ", updated='" + updated + '\'' +
                '}';
    }
}

JDBC测试代码

Maven工程的 main/java下 JDBCDemo.java 文件,如下:

import entity.UserEntity;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;

        try {
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url = "jdbc:mysql://localhost:3306/mybatis";
            String user = "root";
            String pwd = "123456";
            //获取数据库连接
            connection = DriverManager.getConnection(url, user, pwd);

            //获取preparedStatement
            String sql = "select * from tb_user where age>?";
            preparedStatement = connection.prepareStatement(sql);
            //设置参数
            preparedStatement.setLong(1,20);
            rs = preparedStatement.executeQuery();

            //处理结果集
            List<UserEntity> userEntities = new ArrayList<UserEntity>();
            while (rs.next()) {
                int id = rs.getInt("id");
                String userName = rs.getString("userName");
                String password = rs.getString("password");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                int sex = rs.getInt("sex");
                Date birthday = rs.getDate("birthday");
                String created = rs.getString("created");
                String updated = rs.getString("updated");

                UserEntity userEntity = new UserEntity();
                userEntity.setId(id);
                userEntity.setUserName(userName);
                userEntity.setPassword(password);
                userEntity.setName(name);
                userEntity.setAge(age);
                userEntity.setSex(sex);
                userEntity.setBirthday(birthday);
                userEntity.setCreated(created);
                userEntity.setUpdated(updated);
                userEntities.add(userEntity);
            }
            System.out.println(userEntities);
        } finally {
            //关闭连接,释放资源
            if (rs != null) {
                rs.close();
            }
            if (preparedStatement != null) {
                preparedStatement.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }
}

运行结果如下:

[UserEntity{id=1, userName='zs', password='123456', name='张三', age=22, sex=1, birthday=1990-09-02, created='2020-06-17 09:30:58.0', updated='2020-06-17 09:30:58.0'}, UserEntity{id=2, userName='ls', password='123456', name='李四', age=24, sex=1, birthday=1993-09-05, created='2020-06-17 09:30:58.0', updated='2020-06-17 09:30:58.0'}]

Process finished with exit code 0

JDBC缺点分析

开发效率低(代码冗余度高)

加载驱动、获取连接、拼接sql、执行sql、获取结果、解析结果、关闭数据库,这些操作是纯jdbc的方式必经的一些过程,每次操作数据库都需要写这些,但是真正和开发相关有:拼接sql、执行sql、解析结果,这几个可能不同,而其他的几个步骤是所有db操作共用的一些步骤,所以纯 jdbc 的方式重复性的代码太多了,如果每个操作都使用这种方式会耗费大量的时间。

调试和维护困难

纯jdbc的方式,sql多数都是写在java代码中,我还记得刚开始工作的时候接触的第一个项目就是jdbc写的,当时jdbc是写在jsp中,调试和维护起来是相当麻烦的。

动态SQL编写繁琐

还有就是动态sql方面:面对于各种复杂的条件查询,需要在代码中写很多判断,拼接sql,这种情况估计大家都有经历过,应该是有同感的,各种判断各种拼接没有统一的规范,各种写法也是千奇百怪,最终导致系统难以维护。

JDBC 这些问题使系统开发缓慢、难以维护,后面就出现了各种优秀的框架来解决这些问题,下面我们就来看一下常见的db框架及他们的优缺点,以及我们应该如何选择?

Hibernate

介绍hibernate之前,我们先了解一下什么是ORM?

ORM(Object Relational Mapping):对象关系映射,简单点说就是将数据库中的表和java中的对象建立映射关系,可以让我们操作对象来间接的操作数据库。

ORM最好的框架就是hibernate,hibernate可以让你通过java对象来间接的操作数据库,java对象就相当于数据库中表的代理一样,当你想删除表的数据的时候,不需要自己写delete语句发给数据库,只需要对hibernate说我需要删除哪个java对象就行了,hibernate自动根据你的操作去生成db需要的sql然后发给db去执行,对于开发者来说隐藏了底层jdbc和db的交互过程,可能开发者不需要掌握数据库技术,就可以通过这个框架直接操作数据库,比如对数据库进行增、删、改、查可能需要开发者会写各种sql脚本,还有每种数据库的sql脚本语法也不一样,刚开始项目使用的是mysql,你按照mysql的语法写的,后面可能要切换到oracle,语法上面需要变动,但是如果你使用hibernate,这些都不是问题,你不会sql也没关系,而你只需要像操作对象一样去操作数据库,hibernate会根据你的操作和db的类型自动生成操作所需要的sql,一种写法能够跨多种数据库运行。

优点

  1. 简化了整个jdbc操作过程
  2. 对于开发者来说不需要关心sql了,只需要去操作对象就可以了,hibernate可以帮我们自动生成所需要的sql
  3. 代码移植性比较好,通过hibernate操作db都是通过操作对象来进行的,而hibernate会根据我们的操作和db的类型生成符合各种db要求的sql,如果我们需要切换db的类型,hibernate会自动适应,对于开发者业务代码来说不需要做任何业务代码上的调整
  4. 开发效率比较高

缺点

  1. sql优化比较艰难,各种操作最终发给db的sql是由hibernate自动生成的,对于开发者来说如果想干预最终需要执行的sql,相对来说比较困难
  2. hibernate入门比较容易,但是想成为高手学习成本比较高
  3. 对于复杂的动态sql,代码中也需要写很多判断进行组装,动态sql这块的支持比较欠缺

如果做一些简单的系统,开发周期也比较紧急,对sql的优化要求也不是很高,可以使用hibernate。

Spring JdbcTemplate

jdbctemplate 是在spring框架的基础上开发的一个jdbc框架,所以对spring是有依赖的,它对jdbc做了封装,隐藏了各种重复的操作,使用时只需传入:需要执行的sql、参数以及对于结果如何解析的程序就可以了,使用起来还是很方便的,但是面对与动态sql,它也是无能为力了。整体上来说,jdbctemplate相对于纯jdbc隐藏了很多重复性的操作,对于sql的写法和结果的组装上完全交给了开发者自己去控制,在系统中使用也可以帮助我们节约很多时间,而且学习相当简单,花2个小时就学会了,也是很优秀的一个框架。

Mybatis

mybatis相对于纯jdbc来说,也隐藏了重复性的工作,mybatis是一个半自动化的orm框架,为什么说是半自动化的呢,因为他需要我们自己去写sql,而他做的更好的地方就是动态sql的支持上面,而上面说的各种技术,面对与动态sql只能自己写很多判断去组装sql,而这些判断和组装在mybatis中实现起来就非常简单了,完全由mybatis去帮我们实现了。mybatis将sql交由开发者去控制,所以在sql的优化方面,开发者可以随心所欲,也就是说mybatis将重复性的工作优化到了极致:操作db的过程、动态sql的拼装、结果和对象的映射,这些mybatis都帮我们实现的很好,而让我们将更多的经历花在sql的写法和优化上面,所以毫无疑问mybatis使用人数和公司也是最多的,大部分互联网公司基本上都会使用mybatis,其他2种可以不会,但是mybatis你必须要会。

几种技术的对比

image-20220610170005787


资料引用:

https://blog.csdn.net/zpcandzhj/article/details/80878563

https://www.cnblogs.com/diffx/p/10611082.html

https://www.cnblogs.com/ashleyboy/category/1246107.html

标签:jdbc,java,String,age,---,sql,mybatis,public
From: https://www.cnblogs.com/tubby233/p/18517773

相关文章

  • rabbitmq - 流量控制
    在helloworld的案例中,如果开启两个Receive,消息被平均发送给了2个Receive。很多情况下,我们并不希望消息平均分配,可以对代码做如下修改。场景:a侦听器处理快,b侦听器处理的慢,我们希望能将更多的消息分配给a。importcn.swsk.springboot.rgyx.jx.test.ConnectionUtil;impor......
  • 利用classfinal-maven-plugin对jar进行加密,防止反编译
    背景:将jar包部署到其他服务器,如何保证自己的jar不会被反编译解密一、如何打包成加密的jar1、在pom文件中,添加这两项A、<dependency><groupId>net.roseboy</groupId><artifactId>classfinal-maven-plugin</artifactId><version>1.2.1<......
  • rabbitmq - ack机制
    疑问:在写demo的时候,如果client被强制中断,消息来不及处理,这时候消息又出队列了,这样不是会产生严重的问题嘛?一个会话中,可以同时处理一批数据,如果一条失败了,之前的也要求回滚的话,要怎么处理?获取一个消息之后,发现程序无法处理这条消息,想要退还回去,该怎么办?方案:这就涉及到队......
  • TYPE-C PD浅谈(三)
    由于TYPE-C两头都一样,没有方向性,所以在对接前并不会有电源输出,数据主从也尚未定义。在PD的规范内,针对装置对接,定义了三个电阻来进行对接的识别。Rp:做为Provider需要在CC脚位上上拉一个Rp电阻。Rp电阻允许有三种阻值(pullhigh5V时,10K/22K/56K),这三种阻值也同时初步的宣告了Provid......
  • POLIR-Society-Organization-Politics: “How”-政治的: Versatility+历史+应然+实然:
    组织行为学案例:政治+经济的博弈+投资欧盟......
  • IS3240-A1
    IS3240-A1October12,2024IS3240HomeworkAssigment#11Q1:NumpyBasics[15%]ImportNumpyandPandas[1%]Createarandomnumbergenerator,withseedbeing99[2%]GenerateaNumpyarray(nameitasdata)withthreedimensionsintheshapeof[10,4......
  • autMan奥特曼机器人-对接Docker版本NTQQ详细教程
    准备1、准备一台服务器,amd64/arm64都可以,配置最好还是2核保底吧。2、准备一个VNC软件。1Remote:点此下载3、准备手机登陆机器人QQ号,扫码NTQQ相关NTQQ一键脚本(适用于小白支持autMan/无界)复制以下代码,在服务器发送即可。按照提示步骤输入正确参数,如果出现输错可以自行去......
  • 学习高校课程-系统设计与分析-初步架构设计(lec7)
    Index•WhyandWhat?为什么和什么?•UnderstandingArchitecture了解架构•TypicalArchitectureViews典型架构视图•OnSoftwareArchitects论软件架构师•DiagramingandPresentingArchitecture绘制和呈现架构•APracticalWaytoThinkAboutArchitectur......
  • 24小时搜书store及Z-library镜像地址/客户端/app
    24小时搜书是一个提供电子书搜索和下载服务的平台,它允许用户通过互联网搜索和获取电子书资源。以下是一些可能的特点和功能:搜索功能:用户可以通过书名、作者、ISBN号等关键词来搜索想要的电子书。资源丰富:平台可能包含多种语言和类型的电子书,覆盖小说、教育、科技等多个领域。多......
  • el-form中关于添加el-table后动态添加el-input后怎么设置校验
    个人笔记,欢迎指正场景复现如何实现动态表单满足rules规则实现代码<el-formref="form":model="form":rules="rules"label-width="80px"><el-col:span="24"><el-form-itemlabel="客户名称"prop="cust......