JDBC:Java DataBase Connectivity(java数据库连接)

SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。

jdbc是一套标准,它是由一些接口与类组成的。

涉及到的类与接口:
  java.sql
    类:DriverManger
    接口 Connection Statement ResultSet PreparedStatement
    CallableStatement(它是用于调用存储过程)
  javax.sql
    接口 DataSource

驱动:

两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

不同的数据库不同的驱动,有了JDBC这套标准,我们只需要学JDBC就可以。

无JDBC和有JDBC:

操作流程:

一、搭建实验环境

       1创建一数据库库,并创建表和插入表的数据。

       2、新建一个Java工程,并导入数据驱动。

二、编写程序,在程序中加载数据库驱动

DriverManager. registerDriver(Driver driver)

三、建立连接(Connection)

Connection conn = DriverManager.getConnection(url,user,pass);

四、创建用于向数据库发送SQL的Statement对象,并发送sql

Statement st = conn.createStatement();

ResultSet rs = st.executeQuery(sql);

五、从代表结果集的ResultSet中取出数据,打印到命令行窗口

六、断开与数据库的连接,并释放相关资源

JDBC中的类:

DriverManager 类

static void registerDriver(Driver driver)  注册一个JDBC驱动程序

注意:DriverManager中可以同时注册多个JDBC驱动 例如:同时注册 mysql、oralce、db2 驱动 ,通过对JDBC URL分析,决定采用哪个驱动

static Connection getConnection(String url, String user, String password)  根据jdbc url 和 用户名、密码获得一个数据库连接

实际开发中,不推荐使用DriverManager.registerDriver 会导致驱动注册两次、会使得程序依赖 具体数据库API

推荐使用 :Class.forName("com.mysql.jdbc.Driver"); 加载Driver类时完成驱动注册,使得程序不依赖MySQL的API

***** 不要引入 与数据库相关 具体 API

JDBC URL

jdbc:mysql://localhost:3306/day13

这里 jdbc: 是JDBC连接协议

这里 mysql:// 是mysql数据库连接协议,JDBC子协议

localhost:3306 主机和端口

Connection 连接接口

应用一:获得SQL的操作对象

Statement  conn.createStatement() 该对象可以将SQL发送给数据库进行执行

PreparedStatement conn.prepareStatement(sql) 对SQL语句进行预编译,防止SQL注入

CallableStatement conn.prepareCall(sql); 该对象可以调用数据库中存储过程 (以后Oracle学习)

应用二:对数据库事务进行管理(明天)

conn.setAutoCommit(boolean); 设置事务是否自动提交

conn.commit(); 提交数据库事务

conn.rollback(); 回滚数据库事务

Statement 用于将SQL 发送给数据库 获得操作结果

发送单条SQL

executeUpdate 用于向数据库发送 insert update delete 语句,返回int 类型参数,代表影响记录行数

executeQuery  用于向数据库发送 select 语句,返回ResultSet 结果集对象

execute 用于数据库发送任何SQL语句(包括 DDL DML DCL) 返回boolean ,SQL执行结果是ResultSet 返回true,否则 false

发送多条SQL

addBatch(sql) 将SQL加入批处理队列

executeBatch() 执行队列中所有SQL语句 ,一次性向数据库发送多条SQL

使用ResultSet 遍历结果集

while(rs.next()){

// 根据数据库内部 列类型,选择相应 getXXX方法

int ---- getInt

varchart ---- getString

date ----- getDate

}

在java.sql 定义Date、Time 、TimeStamp 对应数据库中 date time timestamp 类型 --------------- java.sql.Date/Time/TimeStamp 都是 java.util.Date 子类

java.sql.Date 只有日期没有时间

java.sql.Time 只有时间没有日期

java.sql.TimeStamp 既有日期也有时间

getXXX 有两种写法 第一种 getString(index) 结果集中列索引 第二种 getString(列名)

思考:如果SQL语句可能会返回一行数据,也可能查不到任何记录时,代码应该怎么写? ----- 用于登陆

if(rs.next()){

// 查到了数据

}else{

// 没有查到数据

}

ResultSet 高级应用 ---- 滚动结果集

Connection 接口的 createStatement()  返回Statement对象,操作SQL后 产生ResultSet 默认执行next 向前滚动,不支持在滚动中对数据进行修改 (只读不执行滚动)

Connection 接口还提供 createStatement(int resultSetType, int resultSetConcurrency) 在创建Statement对象 设置结果集类型,并发策略

结果集类型

ResultSet.TYPE_FORWARD_ONLY 只能向前,只能调用next 不能向回滚动

ResultSet.TYPE_SCROLL_INSENSITIVE 支持结果集向回滚动,不能查看修改结果

ResultSet.TYPE_SCROLL_SENSITIVE  支持结果集向回滚动,查看修改结果

结果集并发策略

ResultSet.CONCUR_READ_ONLY 只读

ResultSet.CONCUR_UPDATABLE 支持修改

常见三种组合

ResultSet.TYPE_FORWARD_ONLY 和 ResultSet.CONCUR_READ_ONLY  (默认) 只读不支持向回滚动

ResultSet.TYPE_SCROLL_INSENSITIVE 和 ResultSet.CONCUR_READ_ONLY  只读,支持向回滚动

ResultSet.TYPE_SCROLL_SENSITIVE 和 ResultSet.CONCUR_UPDATABLE 支持向回滚动,支持对数据修改

例子:

首先专门写一个类链接数据库

顺序:先用 init() 初始化链接,拿到链接之后调用 con.prepareStatement(sql) 把 sql 语句传进去,返回对象给pste,然后调用 pste.executeQuery(); 查询,返回结果集给 rs ,然后遍历结果集输出内容。最后关闭。

package com.hanqi.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcConnectionUtil {

    private static final String USERNAME = "test";//用户名
    private static final String PASSWORD = "test";//数据库密码
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
    private static final String DRIVERCLASSNAME = "oracle.jdbc.OracleDriver";//加载链接数据库的驱动包,需要将驱动包粘贴到WEB-INF下lib下

    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(DRIVERCLASSNAME);//加载驱动
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void destroy(Connection conn, Statement sm, ResultSet rs) {
        if (conn != null) {
            try {
                conn.close();
                conn = null;//没有指向,垃圾回收
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (sm != null) {
            try {
                sm.close();
                sm = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
                rs = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.hanqi.dal;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.hanqi.model.AppUser;
import com.hanqi.model.Dept;
import com.hanqi.model.Emp;
import com.hanqi.util.JdbcConnectionUtil;

public class MethodDal {

    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    public List<AppUser> selectAppUser() {
        String sql = "select a.id,a.username hh,a.password,a.realname,a.createtime from appuser a where a.id in (76,73)";
        init();
        List<AppUser> list = new ArrayList<AppUser>();
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
/*                AppUser au = new AppUser(
                        rs.getInt("id"),
                        rs.getString("hh"),
                        rs.getString("password"),
                        rs.getString("realname"),
                        rs.getDate("createtime"));*/

                AppUser au = new AppUser();

                au.setId(rs.getInt(1));
                au.setUsername(rs.getString(2));
                au.setPassword(rs.getString(3));
                au.setRealname(rs.getString(4));
                au.setCreatetime(rs.getDate(5));
                list.add(au);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return list;
    }

    public List<Emp> selectEmpWithDept() {
        String sql = "SELECT e.ename,d.dname FROM p_emp e, p_dept d "
                + "WHERE e.deptno=d.deptno AND d.deptno=30";
        init();
        List<Emp> list = new ArrayList<Emp>();
        // List<Dept> list = new ArrayList<Dept>();
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()) {
                Emp emp = new Emp();
                Dept dept = new Dept();
                emp.setEname(rs.getString("ename"));
                dept.setDname(rs.getString("dname"));
                emp.setDept(dept);
                list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return list;
    }

    public void init() {
        con = JdbcConnectionUtil.getConnection();
    }

    public void close() {
        JdbcConnectionUtil.destroy(con, ps, rs);
    }
}

实际使用中不应该设置为静态变量,因为静态变量只有一个值。如同以下,可以作为测试理解

package com.hanqi.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.hanqi.util.JdbcConnectionUtil;

public class Test {

    private static Connection con;//获取链接
    private static PreparedStatement pste;// 用来执行SQL语句
    private static ResultSet rs;//

    public static void main(String[] args) {
        init();//调用链接的方法
        String sql = "select * from appuser";
        try {
            pste = con.prepareStatement(sql);//获取执行SQL的对象
            rs = pste.executeQuery();

            while(rs.next()) {
                System.out.println(rs.getInt("id"));
                System.out.println(rs.getString("username"));
                System.out.println(rs.getString("password"));
                System.out.println(rs.getString("realname"));
                System.out.println(rs.getDate("createtime"));
                System.out.println("================================");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
    }

    public static void init() {
        con = JdbcConnectionUtil.getConnection();
    }

    public static void close() {
        JdbcConnectionUtil.destroy(con,pste,rs);
    }
}

添加内容:

?占位符:后面的语句会根据顺序找到相应的第几个占位符

    // 添加指定的参数
    public int insertData(AppUser user) {
        init();
        int i = -1;
        String sql = "insert into appuser " + "values(testsq.nextval,?,?,?,?)";
        long l = new Date().getTime();
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            ps.setString(3, user.getRealname());
            ps.setDate(4, new java.sql.Date(l));
            i = ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return i;
    }

    // 批量添加数据
    public int[] insertBatchData() {
        init();
        int[] arr = null;
        try {
            String sql = "insert into appuser values(testsq.nextval,?,?,?,sysdate)";
            ps = con.prepareStatement(sql);
            for (int i = 0; i < 5; i++) {
                ps.setString(1, "user" + i);
                ps.setString(2, "1234" + i);
                ps.setString(3, "名称" + i);
                ps.addBatch();//批量
            }
            arr = ps.executeBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return arr;
    }

删除、修改、查询

package com.hanqi.dal;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.hanqi.model.AppUser;
import com.hanqi.model.Dept;
import com.hanqi.model.Emp;
import com.hanqi.util.JdbcConnectionUtil;

public class MethodDal {

    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    // 删除一条记录
    public int deleteData(int id) {
        init();
        int i = -1;
        String sql = "delete appuser a where a.id=?";
        try {
            ps = con.prepareStatement(sql);
            ps.setInt(1, id);
            i = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return i;
    }

    // 更新表中的数据
    public int updateData(int id, String realname) {
        init();
        int i = -1;
        String sql = "update appuser a set a.realname=? where a.id=?";
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, realname);
            ps.setInt(2, id);
            i = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return i;
    }

    public List<AppUser> selectAppUser() {
        String sql = "select a.id,a.username hh,a.password,a.realname,a.createtime from appuser a where a.id in (76,73)";
        init();
        List<AppUser> list = new ArrayList<AppUser>();
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
/*                AppUser au = new AppUser(
                        rs.getInt("id"),
                        rs.getString("hh"),
                        rs.getString("password"),
                        rs.getString("realname"),
                        rs.getDate("createtime"));*/

                AppUser au = new AppUser();

                au.setId(rs.getInt(1));
                au.setUsername(rs.getString(2));
                au.setPassword(rs.getString(3));
                au.setRealname(rs.getString(4));
                au.setCreatetime(rs.getDate(5));
                list.add(au);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return list;
    }

    public List<Emp> selectEmpWithDept() {
        String sql = "SELECT e.ename,d.dname FROM p_emp e, p_dept d "
                + "WHERE e.deptno=d.deptno AND d.deptno=30";
        init();
        List<Emp> list = new ArrayList<Emp>();
        // List<Dept> list = new ArrayList<Dept>();
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()) {
                Emp emp = new Emp();
                Dept dept = new Dept();
                emp.setEname(rs.getString("ename"));
                dept.setDname(rs.getString("dname"));
                emp.setDept(dept);
                list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return list;
    }

    public void init() {
        con = JdbcConnectionUtil.getConnection();
    }

    public void close() {
        JdbcConnectionUtil.destroy(con, ps, rs);
    }
}

用户注册与登录的验证:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.util.User,java.util.*,com.test.*" errorPage="error.jsp" %>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
%>
<%

    String sub_type = request.getParameter("sub_type");
    String password = request.getParameter("password");
    String password1 = request.getParameter("password1");
    MethodDal m=new MethodDal();
    if("reg".equals(sub_type)) {

        String username = request.getParameter("username");

        if (!password.equals(password1)) {
            out.print("两次输入的密码不一致 !");
        } else {
            String selectname=m.selectName(username);
            if (!selectname.equals("no")) {
                out.print("用户名已经存在 !");
            } else {
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);

                m.insertData(user);
                out.print("注册成功 !");
            }
        }
        out.print("<br>");
        out.print("<a href='denglu.jsp'>跳转登陆</a>");
    }
    if("log".equals(sub_type)) {
        String username = request.getParameter("username");
        String selectname=m.selectName(username);
        String spwd=m.selectPwd(password);

        if(username.equalsIgnoreCase(selectname)&&password.equalsIgnoreCase(spwd)) {
            session.setAttribute("currentUser", 1);
            response.sendRedirect("Maintest.jsp");

        } else {
            out.print("用户名或密码不正确 !");
        }
        out.print("<br>");
        out.print("<a href='denglu.jsp'>跳转登陆</a>");
    }

%>
package com.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import com.util.JdbcConnectionUtil;
import com.util.User;

public class MethodDal {
    private Connection con;
    private PreparedStatement pste;
    private ResultSet rs;
    //向表中添加数据
    public int insertData(){
        init();
        int i=-1;
        String sql="insert into puser values('c','c')";

        try {
            pste=con.prepareStatement(sql);
            i=pste.executeUpdate();//针对于增删改数据吗,返回受影响的行数
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }
    //向表中添加数据
    public int insertData(User user){
        init();
        int i=-1;
        String sql="insert into puser values(?,?)";
        try {
            pste=con.prepareStatement(sql);
            pste.setString(1,user.getUsername());
            pste.setString(2, user.getPassword());
            i=pste.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }
    //删除记录
    public int deleteDate(int id){

        return 0;
    }
    //查现有姓名
    public String selectName(String name){
        init();
        String sql="select * from puser p where p.pname=?";
        try {
            pste=con.prepareStatement(sql);
            pste.setString(1,name);
            rs = pste.executeQuery();
            while(rs.next()) {
                String pname=rs.getString("pname");
                if(pname!=null){
                    return pname;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "no";
    }
    //根据姓名查密码
    public String selectPwd(String name){
        init();
        String sql="select * from puser p where p.pname=?";
        try {
            pste=con.prepareStatement(sql);
            pste.setString(1,name);
            rs = pste.executeQuery();
            while(rs.next()) {
                String pwd=rs.getString("ppassword");
                return pwd;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "wu";
    }
    public void init(){
        con=JdbcConnectionUtil.getConnection();
    }
}

JavaWeb(四)JDBC操作Oracle的更多相关文章

  1. JavaWeb用Jdbc操作MySql数据库(一)

    一.添加开发包.在JavaWeb中用jdbc操作数据库,使用方法与java一样,但是在处理开发包的问题上有点差别.JavaWeb不能将mysql-connector-java-5.1.7-bin.ja ...

  2. JDBC操作Oracle数据库

    背景知识 含义:JDBC是一种java数据库连接技术,能实现java程序对各种数据库的访问.由一组使用java语言编写的类和接口组成,这些类和接口称为JDBC API,他们位于java.sql 以及j ...

  3. JavaWeb用Jdbc操作MySql数据库(二)

    一.仍然使用前面的环境和示例数据库. 二.建立发出注册请求的页面index3.jsp. <%@ page language="java" import="java. ...

  4. JDBC操作Oracle数据库——实际操作过程中的小总结

    1.对数据库中,表的每一行数据记录的增删改查 增:insert into 表名 values() 删:delete 表名 where 条件(id=?) 改:update 表名 set 列名=? whe ...

  5. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  6. JavaWeb(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  7. Java java jdbc thin远程连接并操作Oracle数据库

    JAVA jdbc thin远程连接并操作Oracle数据库 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 编码工具:Eclipse 编码平台:W ...

  8. jdbc调用 oracle 存储过程操作

    创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 cr ...

  9. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

随机推荐

  1. Java 9 揭秘(12. Process API 更新)

    Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...

  2. 针对Oracle数据库中SCOTT方案的多表查询一个例子

    查询出每个员工的姓名.职位.月薪.所属部门名.月薪等级及其领导的姓名.职位.所属部门名.月薪等级.select e.ename 员工姓名,e.job 员工职位,e.sal 员工月薪,d.dname 员 ...

  3. 20170713_js闭包/匿名函数/作用域

    js:闭包 var getNum; function getCounter() { var n = 1; var inner = function () {return n++; } console. ...

  4. 解决win10注册错误 错误代码0x8002801c

    使用win10的过程中经常碰到各种注册错误,让人抓狂!!! 现在分享一个完美的解决方法(非原创): 最简洁的办法是:1.自行将msinet.ocx(win10系统64位)组件复制到C:\Windows ...

  5. 51nod_1100:斜率最大

    题目链接 斜率最大点对横坐标必相邻 #include <bits/stdc++.h> using namespace std; ; struct point { int x, y, pos ...

  6. Linux编译安装程序(使用configure、make、 make install)

    以安装vim为例. (vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面). 1.获取源文件 首先进入/usr/local下(只是为了方便处理安装文件,位置随意) 用git ...

  7. (转)Linux下查看文件和文件夹大小 删除日志

    场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...

  8. SQL Server ---T-SQl基本语句

    T-SQL 是 SQL-Server 的结构化查询语言. 基本数据操作语言. 基础语句 先创建表 我后面的列子都是用的这一个表,列名啥的 就大概看看吧~~ 纯粹为了学习语句,语法~~所以先创建个表吧~ ...

  9. win10 vmware下Linux系统联网

    本来,这个问题网上资源很多的,但是就因为多,就变得杂了,对于许多新手,并不理解为啥,故记录下来方便以后使用.此处我采用配置VWmare虚拟网关(上学期刚刚学计算机网络,正好可以复习下).关于虚拟机下L ...

  10. java核心技术面试整理

    [前方高能,是这半年BAT,京东,远景,华为,中兴以及苏研发中心被问到的Java公共问题的一个整理] ------------------------------------------------- ...