JAVA 笔记-JDBC(五)

简介: JAVA 笔记-JDBC(五)

1、什么是jdbc?

    java database conectivity

    sun公司制订的一种用来访问数据库的通用的api,这些api由不同的数据库厂商来实现,这样,开发人员就可以使用相同的方式来访问不同的数据库。

2、如何使用jdbc?

    (1)三个重要的对象

         a,  Connection : 负责建立连接(java程序与数据库之间

         的连接)

         b,  Statement :负责发送sql给数据库(Statement由

         Connection来创建)

         c,   ResultSet : 负责封装数据库返回的查询的结果。

    (2)编程步骤

          step1, 加载驱动(需要事先将驱动程序对应的

         jar文件放到classpath对应的路径)

              驱动:就是不同的数据库厂商实现的api。

              Class.forName(驱动类名);

          step2,获得连接

              Connection conn =

              DriverManager.getConnection(url,user,pwd);

              url:数据库所在的机器在的ip,端口,sid

              user:用户名

              pwd:密码

          step3, 获得Statement

              Statement stat = conn.creatStatement();

          step4, 执行SQL

              a, 执行查询

                   ResultSet rst = stat.executeQuery(SQL);

              b,执行删除、更新、插入

                   int stat.executeUpdate(SQL);

          step5,如果是查询,需要遍历ResultSet

                   遍历: 将查询的结果一条一条取出来,获取其中的数据。

3、mysql

    (1)简单使用

         1)登录mysql(使用root用户)

              mysql -uroot;

         2)查看当前有哪些数据库

              show databases;

         3)创建一个数据库 (名叫jd1305db,缺省的

         字符集是utf8)

              create database jd1305db default

              character set utf8;

         4) 使用某个数据库

              use  jd1305db;

         5) 查看当前数据库有哪些表

              show tables;

         6)  建表

              create table t_user(

                   id int primary key  auto_increment,

                   username varchar(50),

                   pwd varchar(30),

                   age int

              )type=innodb;

              insert into t_user(username,pwd,age)

              values('jetty','test',23);

         注意:

              auto_increment: 自增长列,即该列的值由数据库

              自动赋值,一般用于主健的生成。

              type=innodb:  表示该表支持事务。

4、使用jdbc访问数据库,常见的错误

    (1) 参数错误

    (2) 驱动程序(jar文件)不合适,或者没有放到

    classpath路径里面。              

    (3) sql语句错误

5、PreparedStatement (预编译的Statement)

         1)sql注入问题:

              通过刻意构造一些参数值,来改变系统原有sql语句的结构,从而达到破坏系统的目的(比如,非法获取系统敏感的数据,非法登录等等)

         2)PreparedStatement

              a,PreparedStatement是如何执行的?

                   step1, sql语句先发送给数据库,数据库会生成一个执行计划(预编译)

                   step2, 将参数值发送给数据库,执行sql。

              b,优点

                   b1:  防止sql注入因为PreparedStatement执行的sql语句结构是不会改变的 。

                   b2:如果有多条结构相同的sql语句要执行,则 PreparedStatement执行效率要比Statement高。

6、DAO (Data Access Object)

    (1)DAO是什么?

         封装了数据访问逻辑的一个模块。

    (2)如何写一个DAO?

         step1,  写一个实体类就是一个普通的java类,这个类与数据库的

         表对应:

              该类的属性与表的列对应(数据类型匹配),这些属性要有对应的get/set方法。

              实体类的作用,是为了将数据库中的记录封装成一个对应的java对象。

         step2,  写一个DAO接口

              在DAO接口中,要声明一系列用来访问数据库的方法。

              声明这些方法时,不要涉及任何具体的数据库访问技术。

         step3,  写一个DAO实现类

              既使用具体的数据库访问技术来实现DAO接口。

         step4,  写一个工厂类

              "工厂设计模式":                    工厂负责为调用者提供一个符合接口要求的对象(该对象一般称之为产品)。                    这样做的好处是:调用者不用了解对象的创建的细节,并且,当对象发生了改变,不会影响到调用者。

7、事务

    (1)什么是事务?

          将多个操作当做一个原子操作来进行。

    (2)jdbc如何控制事务?

         1)jdbc在默认情况下是自动提交事务,即一条sql语句执行之后,会立即提交事务。

         2)如果多个操作(即有多条sql语句要执行)要当做一个整体来执行,比如在“转帐”业务当中,需要执行两个sql: 一个sql用来对一个帐号进行扣除余额的操作(-1000),

              另外一个sql用来对另外一个帐号进行增加余额的操作(+1000),很显示,这两个操作要么同时成功,要么同时失败。

         3)三个方法

              //当flag为false时,表示禁止自动提交。

               connection.setAutoCommit(boolean flag);

              //提交事务

              connection.commit();

              //回滚事务

              connection.rollback();

    (3) 事务的封装

              比如,要“转帐":

              从资金帐户(t_account表中的某条记录)扣掉200元,然后,股票帐户(t_stock表中的某条记录)增加价值200元的股票。

         create table t_account(

              id int primary key auto_increment,

              accountNo varchar(16),

              balance int

         )type=innodb;

         insert into t_account(accountNo,balance)

         values('6225881003192000',1000);

         create table t_stock(

              id int primary key auto_increment,

              stockNo varchar(6),

              qty int

         )type=innodb;

         insert into t_stock(stockNo,qty)

         values('600015',0);    

    (4) Threadlocal (线程局部变量)

         a,作用

              为每一个线程维护一个变量的副本。

         b,用途

              一个线程要访问多个方法,需要在多个方法之间共享同一个数据(比如,一个connection对象)。

                 

             

相关文章
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
209 1
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
805 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
2494 31
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
1142 7
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
402 5
|
前端开发 JavaScript Java
Java构建工具-maven的复习笔记【适用于复习】
这篇文档由「潜意识Java」创作,主要介绍Maven的相关知识。内容涵盖Maven的基本概念、作用、项目导入步骤、依赖管理(包括依赖配置、代码示例、总结)、依赖传递、依赖范围以及依赖的生命周期等七个方面。作者擅长前端开发,秉持“得之坦然,失之淡然”的座右铭。期待您的点赞、关注和收藏,这将是作者持续创作的动力! [个人主页](https://blog.csdn.net/weixin_73355603?spm=1000.2115.3001.5343)
411 3
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)