JDBC概念&快速入门&工具类Util的写法

概念

Java Database Connectivity
Java 数据库连接,用Java语言操作数据库
JDBC本质:官方定义的一套操作所有关系型数据库的规则,即接口。
各数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码的是驱动jar包中的实现类

快速入门

步骤

  1. 导入驱动jar包
    复制mysql-connector-java-5.1.49-bin.jar到目录并添加

    添加到目录 Add to library

  2. 注册驱动

Class.forName(com.mysql.jdbc.Driver");
  1. 获取数据库连接对象Connection
Connnection comn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3,"root",“);
  1. 定义aql
String sql = "update account set balance = 500 where id = 1";
  1. 获取执行sql语句的对象Statement
Statement stmt = commn.createStatement();
  1. 执行sql,接受返回结果
int count = stmt.executeUpdate(sql);
  1. 处理结果
System.out.println(count);
  1. 释放资源
stmt.close();
comn.close();

使用统一的一套Java代码可以操作所有的关系型数据库
JDBC定义了操作所有关系型数据库的规则(接口)

详解各个对象:

  1. DriverManager:驱动管理对象

(1)功能:注册驱动

static void registerDriver(Driver driver)//注册给定的驱动程序DriverManager
class.forName("com.mysql.jdbc.Driver")

(2)获取数据库连接:

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","password");
  1. Connection:数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","password");
  1. Statement:执行sql的对象
Statement stmt = conn.createStatement();
  1. ResultSet:结果集对象,封装查询结果
ResultSet rs = stmt.executeQuery(sql);

(1)Boolean next():游标向下移动一行

         while(rs.next()){//循环判断游标是否是最后一行int id = rs.getInt(1);String name = rs.getString("name");double balance = rs.getDouble(3);System.out.println(id + name + balance);}

判断是否有数据,判断当前行是否是最后一行末尾,如果是则返回false
(2)getXxx(参数):获取数据
int:代表列的编号,从1开始,getString(1)
String:代表列的名称,getDouble(“balance”)

  1. 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
List<Emp> list = new JdbcEmp().findAll();

定义Emp类
定义方法 public List findAll(){}
实现方法 select * from emp;

PreparedStratement:执行sql的对象
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题
解决sql注入问题:使用preparedStatement对象解决
预编译的sql:参数使用?作为占位符

  • 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
  • 注册驱动
  • 获取数据库连接对象
  • 定义sql
select * from user where name username = ? and password = ?;
  • 获取执行sql语句的对象
preparedStatement Connection.prepareStatement(String sql);
  • 给?赋值:
    方法:setXxx(参数1,参数2)

  • 执行sql,接受返回结果

  • 处理结果

  • 释放资源

JDBC控制事务

  1. 事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
  2. 操作
  • 开启事务
  • 提交事务
  • 回滚事务
  1. 使用Connection对象来管理事务
  • 开启事务:setAutoCommit(boolean autoCommit)
  • 提交事务:commit()
  • 回滚事务:rollback()
//获取连接Connection conn = JDBCUtils.getConnection();//定义sql//zhangsan - 500String sql1 = "update account set balance = balance - ? where id = ?";//lisi + 500String sql2 = "update account set balance = balance + ? where id = ?";PreparedStatement pstm1 = conn.prepareStatement(sql1);PreparedStatement pstm2 = conn.prepareStatement(sql2);//设置参数pstm1.setDouble(1,500);pstm1.setInt(2,1);pstm2.setDouble(1,500);pstm2.setInt(2,2);//执行sqlpstm1.executeUpdate();pstm2.executeUpdate();

抽取JDBC工具类:JDBCUtils

目的: 简化书写
分析:

  1. 注册驱动也抽取
  2. 抽取一个方法连接对象
    不用传递参数,还能保证工具类的通用性
    配置文件:
    jdbc.properties
    url=
    user=
    password=
  3. 抽取一个方法

JDBCDemo

ackage cn.itcast.jdbc;import com.sun.jdi.NativeMethodException;import java.sql.*;public class JdbcDemo {public static void main(String[] args) {Statement stmt = null;Connection conn = null;ResultSet rs = null;try{Class.forName("com.mysql.jdbc.Driver");//注册驱动conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");//获取数据库连接,url:指定连接的路径,user:用户名,password:密码//Connection数据库连接对象,获取执行sql的对象。管理事务(开启、提交、回滚)//String sql = "update account set balance = 200";//修改表中的一条数据//String sql = "insert into account values(3,'wangwu',3000)";//增加表中的一条数据//String sql = "delete from account where id = 3";//删除表中的一条数据//String sql = "create table student(id int,name varchar (20))";//创建表String sql = "select * from account";stmt = conn.createStatement();//执行sql的对象rs = stmt.executeQuery(sql);//int count = stmt.executeUpdate(sql);//int executeUpdate(String sql):执行DML语句(insert、update、delete)、DDL语句(create、alter、drop)//返回值是影响的行数,可以用于判断执行语句是否成功//System.out.println(count);//if(count > 0){//    System.out.println("添加成功");//}else{//    System.out.println("添加失败");//}//让游标向下移动一行while(rs.next()){//循环判断游标是否是最后一行int id = rs.getInt(1);String name = rs.getString("name");double balance = rs.getDouble(3);System.out.println(id + name + balance);}//获取数据}catch(ClassNotFoundException e){e.printStackTrace();}catch (SQLException e){e.printStackTrace();}finally {//避免空指针异常,需要先判断是否为空if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

JDBCUtils

package cn.itcast.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class JDBCUtils {//文件读取,只需读取一次即可拿到这些值,使用静态代码块private static String url;private static String user;private static String password;private  static String driver;static {try {//properties集合类Properties pro = new Properties();ClassLoader classLoader = JDBCUtils.class.getClassLoader();URL res = classLoader.getResource("jdbc.properties");String path = ((URL) res).getPath();System.out.println(path);pro.load(path);pro.load(new FileReader("src/jdbc.properties"));url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");Class.forName(driver);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}public  static Connection getConnection(){return null;}public static void close(ResultSet rs,Statement stmt, Connection conn){if(rs != null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}

jdbc.properties

url=jdbc:mysql://test
user=root
password=root
driver=com.mysql.jdbc.Driver

JdbcEmp

package cn.itcast.jdbc;
import  cn.itcast.domain.Emp;
import cn.itcast.util.JDBCUtils;import javax.xml.crypto.Data;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class JdbcEmp {public static void main(String[] args) {List<Emp> list = new JdbcEmp().findAll();System.out.println(list);}public List<Emp> findAll(){Connection conn = null;Statement stmt = null;ResultSet rs = null;List<Emp> list = null;try {//            Class.forName("com.mysql.jdbc.Driver");
//            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","xjz01405");conn = JDBCUtils.getConnection();String sql = "select * from student";stmt = conn.createStatement();rs = stmt.executeQuery(sql);Emp emp = null;list = new ArrayList<Emp>();while(rs.next()){int id = rs.getInt("id");String ename = rs.getString("ename");int job_id = rs.getInt("job_id");int mgr = rs.getInt("mgr");Date joindate = rs.getDate("joindate");double salary = rs.getDouble("salary");double bouns = rs.getDouble("bouns");int dept_id = rs.getInt("dept_id");emp = new Emp();emp.setId(id);emp.setEname(ename);emp.setJob_id(job_id);emp.setMgr(mgr);emp.setJoindate(joindate);emp.setSalary(salary);emp.setBounds(bouns);emp.setDept_id(dept_id);list.add(emp);}} catch (Exception e) {e.printStackTrace();
//        }finally {//            if(rs != null){//                try {//                    rs.close();
//                } catch (SQLException e) {//                    e.printStackTrace();
//                }
//            }
//            if(stmt != null){//                try {//                    stmt.close();
//                } catch (SQLException e) {//                    e.printStackTrace();
//                }
//            }
//            if(conn != null){//                try {//                    conn.close();
//                } catch (SQLException e) {//                    e.printStackTrace();
//                }
//            }JDBCUtils.close(rs,stmt,conn);}return list;}
}

JDBC概念快速入门工具类Util的写法相关推荐

  1. 开源集锦(五)开源框架和快速开发工具类

    Volley https://github.com/stormzhang/AndroidVolley http://blog.csdn.net/t12x3456/article/details/922 ...

  2. android 快速开发工具类,android面试知识点

    项目地址:570622566/FastAndrUtils  简介:android 快速开发工具类 更多:作者   提 Bug   官网 标签: Fastandrutils 是一套整理修改整合的 and ...

  3. java 集成 模板类_几个使用JDBC Template常用的工具类

    几个使用JDBC Template常用的工具类 第一:IntegerRowMapper 代码: public classIntegerRowMapperimplementsRowMapper { pu ...

  4. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  5. 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util

    Util.java,使用最广泛~ 代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util;import java.io.Fil ...

  6. Redis源码分析之工具类util

    在redis源码中的辅助工具类中,主要包括大小端转换.SHA算法以及util.h中对应的算法. 大小端转换: LittleEndian:低位字节数据存放于低地址,高位字节数据存放于高地址. BigEn ...

  7. JDBC连接池与工具类

    1.连接池概述 用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection, 而是通过池来获取Connection对象,当使用完Conn ...

  8. Mybatis的工厂工具类Util

    工厂工具类 获取session package com.xbky.util;import org.apache.ibatis.io.Resources; import org.apache.ibati ...

  9. android 快速开发常用工具类,实例详解Android快速开发工具类总结

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

最新文章

  1. auto.exe,kavo.exe 批處理文件
  2. Python基础--线程
  3. drive es 软件兼容_某知名软件被完美修改!对不住了!
  4. 卷积神经网络的整体结构、卷积层、池化、python实现
  5. 【Java】多态学习笔记
  6. 捡漏!用谷歌图片搜索自制深度学习数据集 | 教程
  7. Oracle中监听程序无法识别连接描述符中的请求的服务解决办法
  8. 如何在svn上新建一个目录并赋予相应的权限
  9. flutter 路由
  10. PotPlayer播放器在双屏扩展模式下,视频播放时所遇到的几个常见问题的专业解答
  11. C51单片机串口初始化为何是这样:SCON=0X52;TMOD=0X20;TH1=0XF3;TR1=1;
  12. 计算机网络毕业设计汇报ppt,计算机ppt毕业设计模板
  13. MPLAB PICKIT3、MPLAB SIM调试
  14. java .getbytes_java中String的getBytes方法使用
  15. namecheap域名设置Cloudflare为第三方DNS
  16. 总结 | 人生如逆旅,我亦是行人
  17. 为啥linux识别螃蟹驱动,螃蟹卡 RTL8168 更新驱动解决 BBR 单线程限速
  18. Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了)---zhangkaitao
  19. 5.MCScanX 与circos下载、安装、运用
  20. 我国三大常用坐标系区别(北京54、西安80和WGS-84)(转)

热门文章

  1. 录制视频显示的视频角度和拍摄角度保持一致
  2. Qt VS Tools用不了解决方法
  3. IOS开发之Cocoa编程—— NSUndoManager
  4. Android自定义View——可以设置最大宽高的FrameLayout
  5. 数人云牵手红帽Ansible:七大最佳实践解锁DevOps落地姿势
  6. 教你3行代码坑崩系统(哈哈哈哈)
  7. hadoop datanode启动失败
  8. JAVA学习--面向对象的特征二:继承性
  9. 设置XenServer中的Linux vm从光驱启动
  10. Linux 用户(user)和用户组(group)管理概述