第七章:JDBC

7.1:jDBC简介

7.1.1:为什么要使用JDBC

Java是通过JDBC技术实现对数据的访问的,JDBC是java数据库(Java database  connectivity)技术的简称,它充当java应用程序与各种不同的数据库之间的媒介,吧数据持久化,这就是一种持久化机制

7.1.2:JDBC工作原理

JDBC  API

由Sun公司提供的,包括java应用程序的各种不同数据库交互的接口,如connection(连接) Statement(执行sql命令)   ResultSet(返回结果集)   PreparedStatement接口。

JDBC  Driver Manager

JDBC驱动管理程序,负责各种不同的jDBC驱动,把Java应用程序连接到jDBC驱动程序上,位于jdk的java.sql包下面

JDBC驱动

由各厂家提供的,负责连接不同的数据库,mysql和oracle需要不同的数据库。

7.1.3:JDBC  Api介绍

DriverManager:装载驱动程序,并且为创建数据库连接提供支持

Connection:负责连接数据量并且传输数据任务

Statement:由connection产生,负责执行sql语句

resultSet:负责保存Statement执行返回的结果集

preparedStatement:是statement的子接口,由connection产生,也是负责执行sql语句。他的安全性更高,高可读性

7.1.4:jDBC访问数据库的步骤

l  加载JDBC驱动(可能会引发异常,所以用ClassNotFoundExeception来声明try——catch)

Class.forName(“JDBc驱动类名称”);

l  与数据库建立连接

Connection conn=DriverManager.getConnection(“数据库连接字符串“,”数据库用户名”,”密码”);

l  发生sql语句,并且返回结果

Statement st=conn.createStatement();   //创建执行sql语句的对象

ResultSet rs=statement.executeQuery(“sql语句”);   //返回结果集

l  处理返回的结果

While(rs.next()){   //判断是否有下一行的数据

//读取

Int id=rs.getInt(“id”); 或者  int id=rs.getInt(0);

};

7.2:连接数据库

7.2.3:使用纯java方式连接数据库

需要引入jar包,mysql-connector-java-5.1.0-bin.jar

package cn.jbit.example02;

import java.sql.Connection;

import java.sql.DriverManager;

import org.apache.log4j.Logger;

public class example02 {

private static Logger logger=Logger.getLogger(example02.class.getName());

public static void main(String[] args) {

Connection conn=null;

//加载驱动

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

// TODO: handle exception

logger.error(e);

}

try {

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");

logger.warn("建立连接成功啦");

System.out.println("建立连接成功啦");

} catch (Exception e) {

// TODO: handle exception

logger.error(e);

}finally {

try {

if(null!=conn) {

conn.close();

System.out.println("关闭连接成功!!");

}

} catch (Exception e) {

// TODO: handle exception

logger.error(e);

}

}

}

}

以上是连接数据库的步骤

7.3:Statement接口和ResultSet接口

l  Connection接口的方法

方法名称

作用

Void  close()

立即释放 连接资源

Statement crementstatement()

创建一个Statement的对象,来讲sql语句发送到数据库

PreparedStatement preparedStatement(String sql)

创建一个preparedStatement对象将参赛化的sql语句发送到数据库

Boolean  isCloseed()

查询connection是否关闭

l  Statement接口的常用方法

方法名称

作用

Result ExecuteQuery(String sql)

执行sql查询并且返回ResultSet的对象

Int executeUpdate(String sql)

可以执行  insert,update,delete的操作,返回受影响行数

Boolean execute(String sql)

可以执行任意的sql语句,若执行Result对象,则返回true,若执行更新计数或者不存在的结果,返回false

以下是添加一个记录到数据库

package cn.jbit.example03;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

import org.apache.log4j.Logger;

public class example03 {

private static Logger logger=Logger.getLogger(example03.class.getName());

public static void main(String[] args) {

//申明连接对象

Connection conn=null;

//处理执行sql语句的对象

Statement statement=null;

String name="欧欧";

int health=100;

int love=70;

String starin="酷酷的雪拉瑞";

//加载驱动

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (Exception e) {

logger.error(e);

}

try {

//建立连接

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/epet","wangchao","root");

System.out.println("建立连接成功啦!!");

//创建执行sql语句的对象

statement=conn.createStatement();

//创建一个连接的对象

StringBuffer sb=new StringBuffer();

sb.append(" insert into dog(id,name,health,love,starin) values(");

sb.append(5+",'");

sb.append(name+"',");

sb.append(health+",");

sb.append(love+",'");

sb.append(starin+"')");

//执行sql语句的命令

statement.execute(sb.toString());

System.out.println("插入狗狗成功啦!!");

} catch (SQLException e) {

logger.error(e);

}finally {

try {

if(null!=statement) {

statement.close();

}

if(null!=conn) {

conn.close();

}

} catch (SQLException e) {

logger.error(e);

}

}

}

}

l  ResultSet接口常用的方法

方法名称

作用

Boolean next()

判断,将光标移到当前位置的下一行

Boolean previous()

将光标移到上一行

Void close()

关闭ResultSet对象

Int  getInt(int CloumnIndex)

以int 下标的形式获取该列的值

Int  getInt(int CloumnName)

以int列名的形式获取该列的值

float  getFloate(int CloumnIndex)

以float 下标的形式获取该列的值

Float  getfloat(int CloumnName)

以float列名的形式获取该列的值

String  getString(int CloumnIndex)

以String下标的形式获取该列的值

String  getString(int CloumnName)

以String列名的形式获取该列的值

Int getRow()

得到光标当前所指行的行号

Boolean  absolute(int row)

将光标移动到指定的行

7.4:PreparedStatement接口

7.4.1:为什么要使用:PreparedStatement接口

为了防止sql注入攻击,原因是statement接口方法是要进行sql语句的拼接.不仅麻烦而且存在安全隐患,PreparedStatement解决了这个问题

7.4.2: 使用:PreparedStatement接口

方法名称

作用

Boolean execute()

`可以执行任意的sql语句,若执行Result对象,则返回true,若执行更新计数或者不存在的结果,返回false

ResultSet executeQuery()

执行sql查询,返回ResultSet的对象

Int  executeUpdate()

可以执行  insert,update,delete的操作,返回受影响行数

Void setInt(int index,int x)

将指定的参数设置给java int值,也就是给上面的sql语句的格式(?)设置值,前:下标1开始,后:值

Void setobject(int index,int x)

给定对象设置指定参数

步骤:

l  创建PreparedStatement对象

通过connection的preparedStatement(String sql) 方法创建PreparedStatement对象,sql语句可以一个或者多个参数,值用一个?占位符表示。

String sql=Update dog set name=?,health=? Where id=?

PreparedStatement  ps=conn.preparedStatement(String sql);

l  给每个占位符的参数设置值

Ps.setInt(int index,int values);    //第一个:是下标从1开始,第二个:是值

Ps.setString(int index,Stringvalues);    //第一个:是下标从1开始,第二个:是值

l  执行sql语句

在设置各个参数值后,就可以调用preparedStatement的方法了(resultSet  executeQuery), int execute() ,  boolean execute()

示例代码如下

package cn.jbit.example07;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Scanner;

import org.apache.log4j.Logger;

public class example07 {

private static Logger logger=Logger.getLogger(example07.class.getName());

public static void main(String[] args) {

Connection conn=null;

PreparedStatement pstatement=null;

ResultSet rs=null;

Scanner input=new Scanner(System.in);

System.out.println("请输入用户名:");

String name=input.next();

System.out.println("输入密码:");

String pass=input.next();

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

logger.error(e.getMessage());

}

try {

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/epet","wangchao","root");

String str=" select * from master where name=? and password=? ";

pstatement=conn.prepareStatement(str);

pstatement.setString(1, name);

pstatement.setString(2, pass);

rs = pstatement.executeQuery();

if(rs.next()) {

System.out.println("成功!");

}else {

System.out.println("失败!!");

}

} catch (SQLException e) {

logger.error(e.getMessage());

}finally {

try {

rs.close();

pstatement.close();

conn.close();

} catch (SQLException e) {

logger.error(e.getMessage());

}

}

}

}

转载于:https://www.cnblogs.com/bdqnwangchao/p/7638845.html

java数据库编程之JDBC相关推荐

  1. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  2. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  3. 浅谈Java网络编程之Socket (2)

    <浅谈Java网络编程之Socket (1)>中我们已经和大家说到客户端的网络编程,下面和大家分享的是服务器的实现代码. import java.net.*; import java.io ...

  4. 浅谈Java网络编程之Socket (1)

    和大家一起分享的是Java网络编程之Socket.在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是get ...

  5. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  6. Java网络编程之NIO编程(待补充)

    Java网络编程之NIO编程(待补充) 学习网站1:http://ifeve.com/java-nio-all/ 学习网站2:http://www.ibm.com/developerworks/cn/ ...

  7. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  8. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  9. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

最新文章

  1. maven 插件的应用
  2. 【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...
  3. 如何理解VMware内存资源管理
  4. php var_export与var_dump 输出的不同
  5. SQL语句操作优先级顺序
  6. verdi中波形怎么看间距_小间距led显示屏金线封装真伪怎么看?
  7. Sentinel服务熔断OpenFeign_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0054
  8. 部门研发linux sysfs (2)部门研发
  9. mysql 5.6 修改默认字符集_mysql5.6修改默认字符集
  10. 如何开发一个基于Docker的Python 应用
  11. 图书信息管理系统(MVC设计模式)
  12. BottomNavigationView与Navigation使用
  13. java 去掉连续重复字符串_替换Java中连续的重复字符
  14. 高光谱图像算法实习工程师面经
  15. 前端速成-CSS | 04.li标签样式、标签的正常、悬停、触发状态样式
  16. 计算机电脑不关机设置密码,电脑怎样灭屏而不关机
  17. 程序员常用英文词汇、短语整理
  18. 【MOSBUS-RTU协议】从机地址分配
  19. python学生数据完善程序_「Python」每日一练:学生数据完善程序
  20. 左旋字符串(c语言)

热门文章

  1. Java基础学习总结 -- 图形用户界面GUI
  2. Linux通过网卡驱动程序和版本号的信息
  3. 使用命令行编译Less源文件
  4. 出差费用管理模块的几个问题
  5. linux调整zram大小,ZRAM将在Linux5.1上看到更高的性能-它改变了默认的压缩器
  6. python爬虫url参数有随机数、如何确定是正确的链接_Python爬虫知识点——请求
  7. CTF入门--题目介绍
  8. linux内核网络子系统收发过程剖析
  9. Spark源码分析之DAGScheduler以及stage的划分
  10. spark基础之shuffle机制和原理分析