JDBC的基本介绍

1、概述:jdbc是使用Java访问各种数据库的一种技术

(1)jdbc工作原理

2、jdbc核心Java类(API)

(1)DriverManager类

作用:管理各种数据库的驱动(JDBC的驱动),可以用它来获取数据库连接。根据所给的驱动去获取对应数据库的链接

(2)Connection接口

负责连接数据库,并担任传输数据的任务

(3)Statement接口

由Connection产生,负责执行SQL语句

(4)ResultSet接口

负责保存Statement执行后所产生的查询结果(数据库中查询出来的数据保存在ResultSet中)

3、使用JDBC的步骤

(1)建立Java与数据库之间的链接,将数据库的驱动包,复制到项目的lib目录中,复制完毕以后鼠标右键jar包,选择build path ,再选择 add to build path

(2)新建一个专门负责连接数据库的工具类DBUtil,并准备连接数据库的数据

连接数据库需要知道数据库的地址url,用户名 user,密码 password,以及数据库对应的驱动。如果需要连接数据库需要先将这些数据准备好。参考代码如下:

/**
* 连接数据库的工具类
*/
public class DBUtil {
//1.准备连接数据库的数据
// 数据库服务器的地址
// jdbc:mysql://数据服务器ip地址:端口号/需要访问的数据库
// localhost: 本机的ip地址 可以写成 127.0.0.1
// 3306 : mysql 的默认端口号
static String url = "jdbc:mysql://localhost:3306/myschool";
// 数据库的用户名 :mysql的默认用户名是root
static String user = "root";
// 数据库的密码: 填写自己的mysql 密码
static String password = "root";
// 数据库的驱动
static String driver = "com.mysql.jdbc.Driver"; }

(3)在DBUtil类中,添加获取数据库的工具方法

在一个项目中,会频繁使用,所以将它封装成一个工具方法,参考代码如下:

/**
* 负责获取数据库连接的工具方法
* @return Connection :数据库连接的对象 (桥梁,可以通过此对象访问数据库)
*/
public static Connection getCon(){
//1.安装数据库驱动(加载驱动类)
try {
Class.forName(driver);
//2.根据url,user,password获取数据库连接
Connection con =
DriverManager.getConnection(url, user, password);
return con;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

(4)添加main方法测连接,参考代码如下:

public static void main(String[] args) {
System.out.println(getCon());
}

运行结果:

(5)DBUtil完整代码

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager; /**
* 连接数据库的工具类
*/
public class DBUtil {
//1.准备连接数据库的数据
// 数据库服务器的地址
// jdbc:mysql://数据服务器ip地址:端口号/需要访问的数据库
// localhost: 本机的ip地址 可以写成 127.0.0.1
// 3306 : mysql 的默认端口号
static String url = "jdbc:mysql://localhost:3306/myschool";
// 数据库的用户名 :mysql的默认用户名是root
static String user = "root";
// 数据库的密码: 填写自己的mysql 密码
static String password = "root";
// 数据库的驱动
static String driver = "com.mysql.jdbc.Driver"; /**
* 负责获取数据库连接的工具方法
* @return Connection :数据库连接的对象 (桥梁,可以通过此对象访问数据库)
*/
public static Connection getCon(){
//1.安装数据库驱动(加载驱动类)
try {
Class.forName(driver);
//2.根据url,user,password获取数据库连接
Connection con =
DriverManager.getConnection(url, user, password);
return con;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) {
System.out.println(getCon());
} }

3、使用JDBC实现对数据库表的增删改查

(1)向指定数据库表中插入数据

案例:使用jdbc向subject表中插入数据,参考代码如下:

① 创建一个实体类与数据库中中的表对应起来

package jdbc;
/**
* 创建一个实体类 与数据库中中的表对应起来
* 实体类:Subjet 对应 数据库表 subject
* 实体类的属性 对应 数据库表中的字段
* @author xp
*
*/
public class Subject {
private int subjectNo;// 对应subject表中的subjectNo 字段
private String subjectName;//对应subject表中的subjectName字段
private int classHour;//对应subject表中的classHour字段
private int gradeId;//对应subject表中的gradeId字段
public int getSubjectNo() {
return subjectNo;
}
public void setSubjectNo(int subjectNo) {
this.subjectNo = subjectNo;
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public int getClassHour() {
return classHour;
}
public void setClassHour(int classHour) {
this.classHour = classHour;
}
public int getGradeId() {
return gradeId;
}
public void setGradeId(int gradeId) {
this.gradeId = gradeId;
} }

② 新建一个Dao类,来操作数据库表,参考代码如下:

package jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement; /**
* 操作数据库表 subject
*
*/
public class SubjectDao {
/**
*向数据库表subject中插入数据的方法
*/
public static void insert(Subject sub){
//获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
// id是自增涨的,所以这里不需要插入id,插入数据时会自动生成id
String sql = "insert into subject("
+ "subjectName,classHour,gradeId)"
+ " values('"+sub.getSubjectName()
+ "',"+sub.getClassHour()
+ ","+sub.getGradeId()+")";
System.out.println(sql); //3.构建sql语句
Statement st = null;
try {
st = con.createStatement();
//4.执行sql语句
st.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.关闭连接
try {
st.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
} }
} public static void main(String[] args) {
//测试插入方法
Subject sub = new Subject();
//只设置课程名称,表示只向数据库表中插入课程名称
sub.setSubjectName("布丁制作");
insert(sub);
}
}

(2)查询指定表中的数据

例如:查询某一个表中的所有数据, 在dao中添加查询所有数据的方法

public static List<Subject> findAll(){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
String sql = "select * from subject";
//3.构建sql语句
Statement st = null;
try {
st = con.createStatement();
//4.执行sql语句
//ResultSet 用来封装查询出的结果集 类似于集合中的iterator迭代器
ResultSet rs = st.executeQuery(sql);
List<Subject> subs = new ArrayList<Subject>();
// rs.next()判断结果集中是否有下一个元素,如果有就取出
while(rs.next()){
//创建课程对象
Subject sb = new Subject();
//取出结果中subjectNo,并存入到课程中
// rs.get字段类型(字段名) 获取字段中对应的值
sb.setSubjectNo(rs.getInt("subjectNo"));
sb.setSubjectName(rs.getString("subjectName"));
sb.setClassHour(rs.getInt("classHour"));
sb.setGradeId(rs.getInt("gradeID")); //将封装好的课程对象加入到集合中
subs.add(sb);
}
//将封装好的课程集合返回
return subs;
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
st.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}

(3)execute,executeUpdate,executeQuery的区别

4、修改数据表中的数据

(1)根据subjectNo查询出数据,参考代码如下:

/**
*根据subjectNo查询出数据
*/
public static Subject findSubjectByNo(int subjectNo){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
String sql = "select * from subject where subjectNo="+subjectNo;
//3.构建sql语句
Statement st = null;
try {
st = con.createStatement();
//4.执行sql语句
ResultSet rs = st.executeQuery(sql);
//Subject sb = new Subject();
Subject sb = null;
while(rs.next()){
sb = new Subject();
sb.setSubjectNo(rs.getInt("subjectNo"));
sb.setSubjectName(rs.getString("subjectName"));
sb.setClassHour(rs.getInt("classHour"));
sb.setGradeId(rs.getInt("gradeID"));
}
return sb;
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
st.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null; }

(2)修改数据的方法

/**
* 修改数据
**/
public static void update(Subject sub){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
String sql = "update subject set "
+ " subjectName='"+sub.getSubjectName()+"' ,"
+ " classHour="+sub.getClassHour()+" ,"
+ " gradeID="+sub.getGradeId()
+ " where subjectNo="+sub.getSubjectNo();
System.out.println(sql);
//3.构建sql语句
Statement st = null;
try {
st = con.createStatement();
st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
st.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

(3)测试方法

//根据subjectNO 修改数据
//1. 根据subjectNO 查询出数据
Subject sub = findSubjectByNo(10);
//sub.setSubjectNo(10);
//2. 设置想要修改的数据
sub.setSubjectName("如何养生");
update(sub);

5、sql注入:使用拼接字符串的形式,向sql语句中注入代码片段

现有代码如下:

public static Master findMasterByNameAndPwd(String name ,String pwd ){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
String sql = "select * from master where name='"+name+"' and password='"+pwd+"'";
//3.构建sql语句
Statement st = null;
try {
st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
Master master = null;
while(rs.next()){
master = new Master();
master.setId(rs.getInt("id"));
master.setName(rs.getString("name"));
master.setPassword(rs.getString("password"));
master.setMoney(rs.getInt("money"));
}
return master;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
st.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
} return null;
}

如果这种方式登录,那么我们可以采用sql注入的形式,就算不知道用户名和密码,我们同样可以登录成功具体操作如下:

注意:Statement 构建sql语句需要用+拼接值,容易造成SQL。

(1)避免sql注入,使用PreparedStatement

概述:预编译的sql语句,继承Statement接口,比Statement更加灵活,效率更高,提高了sql语句的可读性,提高了sql语句的执行性能,提高了安全性

例如:

public static void  insert(Dog dog){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
// ? 问号,占位符,表示此处需要设置一个值
String sql = "insert into dog (name,health,love,strain) values (?,?,?,?)";
//3.编译sql语句
PreparedStatement pst = null;
try {
pst = con.prepareStatement(sql);
//4.如果sql语句中有? ,就需要给?设置值
//pst.set类型(第几个问号,要设置给?号的值)
pst.setString(1, dog.getName());
pst.setInt(2, dog.getHealth());
pst.setInt(3, dog.getLove());
pst.setString(4, dog.getStrain()); //5.执行sql语句
int num = pst.executeUpdate();
if(num!=0){
System.out.println("数据插入成功");
} } catch (SQLException e) {
e.printStackTrace();
} } 

注意:使用PreparedStatement时在sql语句中需要设置值时,用?,有几个?,就设置几个值

例如:setString(1,name);

表示给第一个?,设置name值

(2)将Statement替换成PrepareStatemen

public static Master findMasterByNameAndPwd(String name ,String pwd ){
//1.获取数据库连接
Connection con = DBUtil.getCon();
//2.编写sql语句
//String sql = "select * from master where name='"+name+"' and password='"+pwd+"'";
String sql = "select * from master where name=? and password=? ";
System.out.println(sql);
//3.构建sql语句
//Statement st = null;
PreparedStatement pst = null;
try {
//st = con.createStatement();
pst = con.prepareStatement(sql);
pst.setString(1, name);
pst.setString(2, pwd);
//ResultSet rs = st.executeQuery(sql);
ResultSet rs = pst.executeQuery();
Master master = null;
while(rs.next()){
master = new Master(); }
return master;
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pst.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;

运行结果:

JDBC——连接数据库的更多相关文章

  1. JDBC连接数据库

    JDBC连接数据库 1.加载JDBC驱动程序. Class.forName("com.mysql.jdbc.Driver"); 建立连接,. Connection conn = D ...

  2. java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  3. java开发JDBC连接数据库详解

    JDBC连接数据库 好文一定要让大家看见 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机) ...

  4. 【转】Java开发中JDBC连接数据库代码和步骤总结

    (转自:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html) JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个 ...

  5. 使用配置文件来配置JDBC连接数据库

    1.管理数据库连接的Class 代码如下: package jdbcTest;import java.sql.Connection;import java.sql.DriverManager;impo ...

  6. Java中JDBC连接数据库代码和步骤详解总结

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤:         1.加载JDBC驱动程序:         在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Jav ...

  7. 完整java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  8. JDBC连接数据库(PreparedStatement)

    PreparedStatement是在数据库端防止SQL注入漏洞的SQL方法这里演示了一些基本使用方法同样使用Oracle数据库,之前已经手动建立了一张t_account表数据库代码参见上一篇< ...

  9. JDBC连接数据库演示

    今天重新学习了JDBC连接数据库,使用的数据库是Oracle,在运行前已经手动建立了一张t_user表,建表信息如下: create table t_user( card_id ) primary k ...

  10. JDBC连接数据库操作

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

随机推荐

  1. Scrapy框架-Spider

    目录 1. Spider 2.Scrapy源代码 2.1. Scrapy主要属性和方法 3.parse()方法的工作机制 1. Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取 ...

  2. vue 前端将时间戳格式化

    转自西风XF : https://blog.csdn.net/qq_36242361/article/details/79143050 后端传过来的时间数据是时间戳的形式,前端需要进行格式化 1. 新 ...

  3. django开发新手教程(原创)

    为了帮助新手简单高效解决django开发的问题,从而写了这么一篇,随便转载! 本人用的是windows10操作系统 #联网安装 ==指定版本号      我在自定义的www文件夹安装C:\Users\ ...

  4. Android布局理解

    参考菜鸟教程,原文请查看:https://www.runoob.com/w3cnote/android-tutorial-linearlayout.html 1.FrameLayout(帧布局) 帧布 ...

  5. 【MySQL 读书笔记】当我们在使用索引的时候我们在做什么

    我记得之前博客我也写过关于索引使用的文章,但是并不全面,这次尽量针对重点铺全面一点. 因为索引是数据引擎层的结构我们只针对最常见使用的 Innodb 使用的 B+Tree 搜索树结构进行介绍. 每一个 ...

  6. Ansible小记

    参考网址: https://www.iyunv.com/thread-385359-1-1.html http://blog.51cto.com/215687833/1886305

  7. react native输入框定位在底部(虚拟键盘弹起)

    1.通过Keyboard获取键盘高度,改变定位的bottom 缺点:虚拟键盘完全弹起时,才会获取到键盘高度,定位稍有延迟,而且键盘收起时,定位会出现悬空状态,然后再回到底部 import React, ...

  8. java &与&& |与||的区别

    一.与操作和或操作的区别 (1)在Java程序中,使用与操作,要求所有表达式的判断结果都是TRUE,才为真,若有一个为FALSE,那么最终判断结果则为FALSE (2)使用或操作,只要其中有一个表达式 ...

  9. 洛谷P3469[POI2008]BLO-Blockade

    题目 割点模板题. 可以将图中的所有点分成两部分,一部分是去掉之后不影响图的连通性的点,一部分是去掉之后影响连通性的点,称其为割点. 然后分两种情况讨论,如果该点不是割点,则最终结果直接加上2*(n- ...

  10. git只追踪特定类型的文件

    比如我只关心所有office文档并排除掉~开头的辅助文件: * !*/ !*.docx !*.doc !*.xlsx ~*