Mybatis从入门到精通——从JDBC编程开始

栏目: Java · 发布时间: 5年前

内容简介:jdbc是一种Java编程语言和各种数据库之间在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用mysql的驱动程序)

jdbc是一种 Java 编程语言和各种数据库之间 数据库无关 连接的行业标准, JDBC API为基于 SQL 的数据库访问提供了调用级API

数据库无关

在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本

Mybatis从入门到精通——从JDBC编程开始

而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用 mysql 的驱动程序)

Mybatis从入门到精通——从JDBC编程开始

JDBC API主要完成以下三个工作:

  • 建立与数据库的连接或访问任何表格数据源
  • 发送SQL语句到数据库
  • 处理数据返回的结果

这三个工作中都有其对应的jdbc api来完成各自的任务。应用程序可以使用这些api 来操作数据库系统了

JDBC API

DriverManager

管理JDBC驱动的服务类,主要功能是获取 Connection 对象(示例程序中的第2步)

getConnection方法

Connection getConnection(url,username,password)

  • url写法:jdbc:mysql://localhost:3306/mydb 本地数据库简写:jdbc:mysql:///mydb
  • jdbc:协议
  • mysql:子协议
  • localhost:主机名
  • 3306:端口号
  • mydb:数据库名称

Connection

数据库连接对象,每个 Connection 对象表示一个连接会话。

Connection的常用方法

1. 返回 Statement 对象

  • Statement createStatement()
  • PreparedStatement PreparedStatement(String sql) : Statement 的子类,将SQL语句提交到数据库进行预编译
  • CallableStatement prepareCall(String sql)Statement 的子类,处理存储过程

2. 处理事务的常用方法

  • void setAutoCommit(boolean autoCommit) :设置是否自动提交,默认 true
  • void commit :提交事务
  • void rollback :事务回滚
  • Savepoint setSavepoint :创建一个保存点
  • Savepoint setSavepoint(Stirng name) :指定名称来创建一个保存点
  • void rollback(Savepoint savepoint) :将事务回滚到指定的保存点
  • void setTransactionIsolation(int level) :设置事务隔离级别

Statement

执行具体的SQL语句,以及执行DDL、DCL、DML语句。

Statement子类 PreparedStatement

预编译的 Statement 对象

SQL语句一次编译多次执行

允许数据库预编译SQL语句(常带有参数或者叫占位符),这样一来,以后每次只需要改变SQL命令的参数,而不需要每次都编译SQL语句,性能得到了提升

PreparedStatement主要方法

  • void setXXX(int parmIndex,XXX value) :设置预编译语句的参数

Statement常用方法

  • ResultSet executeQuery(String sql) :只能执行查询语句,返回 ResultSet
  • int executeUpdate(String sql) :主要用于执行DML语句的,返回受影响行数。
  • boolean execute(String sql) :执行任何SQL语句
  • addBatch(String sql) :添加到批处理
  • executeBatch() :执行批处理
  • clearBatch() :清空批处理

ResultSet

结果集:查询结果的封装

ResultSet主要方法

移动指针的方法

  • next() :移动指针到ResultSet记录的下一行,如果存在该条记录返回 true
  • .......

获取当前行、指定列的值

getInt()、getString()
<T> T getObject(int columnIndex,Class<T> type)、<T> T getObject(String columnLabel,Class<T> type)

JDBC实际操作

建库建表的SQL语句

-- 建库
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 建表
CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `username` VARCHAR(100) NOT NULL,
   `password` VARCHAR(40) NOT NULL,
   `name` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

示例程序框架

我们会在业务逻辑代码start的地方开始具体的执行操作

public void excute() throws SQLException {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet resultset = null;
        try {
            //1、加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root", "******");
            if (conn != null) {
                System.out.println("连接成功");
            }
            conn.setAutoCommit(false);
            //业务逻辑代码start
            //插入数据操作
            String insertSql = "insert into user(username,password,name) values(?,?,?)";
            smt = conn.prepareStatement(insertSql);
            smt.setString(1, "xiaoming");
            smt.setString(2, "123");
            smt.setString(3, "小明");
            int result = smt.executeUpdate();
            if (result > 0) {
                System.out.println("添加成功");
            }
            smt.clearParameters();

            //修改数据操作
            String updateSql = "update user set name=? where id=?";
            smt = conn.prepareStatement(updateSql);
            smt.setString(1, "小牛");
            smt.setInt(2, 2);
            int updateResult = smt.executeUpdate();
            if (updateResult > 0) {
                System.out.println("修改成功");
            }
            smt.clearParameters();

            //查询数据操作
            String sql = "select *from user where id =?";
            smt= conn.prepareStatement(sql);
            smt.setInt(1,3);
            resultset = smt.executeQuery();
            while (resultset.next()) {
                int uid = resultset.getInt("id");
                System.out.println(String.format("id:%s,username:%s,password:%s,name:%s", uid, 
                        resultset.getString("username"), 
                        resultset.getString("password"), 
                        resultset.getString("name")));
            }
            //业务逻辑代码end
        conn.commit();
        } catch (Exception e) {
            System.out.println(e);
            conn.rollback();
        }
        //4、释放资源 写到finally里面,防止报错不能执行资源回收
        finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (smt != null) {
                try {
                    smt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (resultset != null) {
                try {
                    resultset.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
复制代码

执行结果

连接成功
添加成功
修改成功
id:3,username:xiaoming,password:123,name:小明
复制代码

业务逻辑代码中如果有错误,连接对象将执行回滚操作,保证数据的一致性。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning Python, 5th Edition

Learning Python, 5th Edition

Mark Lutz / O'Reilly Media / 2013-7-6 / USD 64.99

If you want to write efficient, high-quality code that's easily integrated with other languages and tools, this hands-on book will help you be productive with Python quickly. Learning Python, Fifth Ed......一起来看看 《Learning Python, 5th Edition》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具