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. php redis 处理websocket聊天记录

    <?php ini_set('display_errors', 'on'); class chatClass { private $redis; //这个变量模拟用户当前状态,是否登录,是否可查 ...

  2. 【技术说明】iOS10来了,AppCan已全面适配!

    IPhone 7出了,你的肾还好吗?别紧张,不买肾7,同样可以体验最新的iOS10! AppCan对引擎.插件.编译系统等都进行了重要升级,让你的APP轻松适配iOS10!具体如何,请往下看! 引擎 ...

  3. MyCP

    一.作业要求 编写MyCP.java 实现类似Linux下cp  XXX1 XXX2的功能,要求MyCP支持两个参数:- java MyCP -tx XXX1.txt XXX2.bin  用来把文本文 ...

  4. Bloom Filter(布隆过滤器)如何解决缓存穿透

    本文摘抄自我的微信公众号"程序员柯南",欢迎关注!原文阅读 缓存穿透是什么? 关于缓存穿透,简单来说就是系统处理了大量不存在的数据查询.正常的使用缓存流程大致是,数据查询先进行缓存 ...

  5. [Alpha阶段]第九次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第九次Scrum Meeting 基本信息 名称 时间 地点 时长 第九次Scrum Meeting 19/04/14 大运村寝室6楼 30min ...

  6. RMQ 问题 ST 算法(模板)

    解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间  这个算法是 real 小清新了   有一个长度为 N 的数组进行 M 次查询 可 ...

  7. 【调试工具】tcpdump

    [tcpdump]https://linux.cn/article-10191-1.html

  8. 曝Wi-Fi重大缺陷:你浏览的或是个假网站

    今年央视315晚会上曝光的Wi-Fi探针收集用户信息的热度还未消退,阿里安全专家研究发现了Wi-Fi的重大新问题:基于WPA/WPA2设计上存在的一些缺陷,用户在使用公共Wi-Fi时,被攻击者钓鱼,进 ...

  9. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  10. table的 noWrap 属性不换行

    nowrap是什么意思? HTML中td元素的nowrap属性表示禁止单元格中的文字自动换行. 但使用时要注意的是,td元素noWrap属性的行为与td元素的width属性有关. td元素中nowra ...