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. Map根据value值进行倒序排列

    public List<Map.Entry<Integer,BigDecimal>> sortByMapValue(HashMap<Integer, BigDecimal ...

  2. 查看redis连接数

    在redis-cli命令行使用:info clients可以查看当前的redis连接数. 如下图: config get maxclients 可以查询redis允许的最大连接数. 如下图:

  3. golang 日期时间处理

    package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now()) //显示时 ...

  4. 随心测试_职场面试_001<SX的面试观点>

    快速理解_求职面试:必不可少的嘴 +  双向沟通交流 = 人与人之间的心理游戏 ps:以下为_面试题回答套路_案例,仅供参考,不挖坑 常见的面试题: 你是如何看待软件测试这个行业的? 说说你对软件测试 ...

  5. springmvc上传文件错误The current request is not a multipart request

    <1>在jsp页面的<head></head>标签里面加上<meta http-equiv="Content-Type" content= ...

  6. ABP之启动配置

    ASP.NET Boilerplate提供了在StartUp中配置其模块的基础设施和模型. 配置ASP.NET Boilerplate 配置ABP是在模块的PreInitialize 方法中做的,如下 ...

  7. Python----简单线性回归

    简单线性回归 1.研究一个自变量(X)和一个因变量(y)的关系   简单线性回归模型定义:y=β0+β1x+ε 简单线性回归方程:E(y)=β0+β1x 其中: β0为回归线的截距 β1为回归线的斜率 ...

  8. SSZipArchive的使用详解和遇到的问题

    https://blog.csdn.net/zhengang007/article/details/51019479 2016年03月30日 版权声明:本文为博主原创文章,转载请注明作者和原文链接. ...

  9. 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    <?php // *** 配置文件(表示区域的三维数组)其内的点,必须按顺时针方向依次给出! $area = array( // 天通苑店 0 => array( array('x'=&g ...

  10. 函数的创建与区别和 prototype

    https://www.cnblogs.com/haoxl/p/5267724.html(copy) https://www.cnblogs.com/loveyoume/p/6112044.html( ...