mybatis使用(1):为什么是选择mybatis

一、代码和数据库连接的原理

一般正常情况下,数据库是一个单独的服务,其中你设计的代码工程也是一个服务工程,工程和数据库都是一个单独的一个服务,其中服务之间可以在同一台服务器上,也可以在不同的服务器上,他们之间通过网络通信协议来进行通信,各种不同的数据库的通信协议都不同的,其中mysql的默认端口是3306,其中通过网络通信协议有多种。

TCP/IP协议

       通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块

Unix Socket协议

       通常我们登入MySQL服务器中使用这个协议,因为要使用这个协议连接MySQL需要一个物理文件,文件的存放位置在配置文件中有定义,值得一提的是,这是所有协议中最高效的一个.

Share Memory协议

        这个协议一般人不知道,肯定也没用过,因为这个只有windows可以使用,使用这个协议需要在配置文件中在启动的时候使用–shared-memory参数,注意的是,使用此协议,一个host上只能有一个server,所以这个东西一般没啥用的,除非你怀疑其他协议不能正常工作,实际上微软的SQL Sever也支持这个协议

Named Pipes协议

        这个协议也是只有windows才可以用,同shared memory一样,使用此协议,一个host上依然只能有一个server,即使是使用不同的端口也不行,Named Pipes 是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用TCP/IP环境,而且是windows服务器,那么好歹你的数据库还能工作。使用这个协议需要在启动的时候添加–enable-named-pipe选项

我们可以把工程和数据库的连接用下面的图形进行描述

二、在数据库连接的发展历史和解决方案

1)原始的jdbc方法来连接数据

其中从代码到数据库的过程之间数据库的连接到数据的传输的流程如下:

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 设置sql语句
  4. 创建jdbc statement对象
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. 对sql执行结果进行解析处理
  8. 释放资源(resultSet、preparedstatement、connection)
public static void main(String[] args) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        //1、加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
				
        //2、通过驱动管理类获取数据库链接
        connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");

        //3、定义sql语句 ?表示占位符
        String sql = "select * from user where username = ?";

        //4、获取预处理statement
        preparedStatement = connection.prepareStatement(sql);

        //5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
        preparedStatement.setString(1, "王五");

        //6、向数据库发出sql执行查询,查询出结果集
        resultSet =  preparedStatement.executeQuery();

        //7、遍历查询结果集
        while(resultSet.next()){
            System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        //8、释放资源
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(preparedStatement!=null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

其中使用原始的jdbc来进行数据库的处理的特点:

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。xml配置文件解决
  3. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
  4. 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

      总结:网络之间的连接频繁的创建和销毁造成资源的浪费;就是传输数据和反悔数据都会造成硬编码。

2)使用dbutil来进行数据库的连接

针对jdbc的问题,dbutil提出的解决方案:

3)使用全自动ORM框架来进行数据库连接hibernate

参考本号的hibernate的相关文章。

4)使用半自动ORM框架来进行数据库连接mybatis

参考mybatis的使用系列教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值