JDBC概念快速入门工具类Util的写法
JDBC概念&快速入门&工具类Util的写法
概念
Java Database Connectivity
Java 数据库连接,用Java语言操作数据库
JDBC本质:官方定义的一套操作所有关系型数据库的规则,即接口。
各数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码的是驱动jar包中的实现类
快速入门
步骤
导入驱动jar包
复制mysql-connector-java-5.1.49-bin.jar到目录并添加
添加到目录 Add to library
注册驱动
Class.forName(com.mysql.jdbc.Driver");
- 获取数据库连接对象Connection
Connnection comn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3,"root",“);
- 定义aql
String sql = "update account set balance = 500 where id = 1";
- 获取执行sql语句的对象Statement
Statement stmt = commn.createStatement();
- 执行sql,接受返回结果
int count = stmt.executeUpdate(sql);
- 处理结果
System.out.println(count);
- 释放资源
stmt.close();
comn.close();
使用统一的一套Java代码可以操作所有的关系型数据库
JDBC定义了操作所有关系型数据库的规则(接口)
详解各个对象:
- 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");
- Connection:数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","password");
- Statement:执行sql的对象
Statement stmt = conn.createStatement();
- 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”)
- 定义一个方法,查询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控制事务
- 事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 操作
- 开启事务
- 提交事务
- 回滚事务
- 使用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
目的: 简化书写
分析:
- 注册驱动也抽取
- 抽取一个方法连接对象
不用传递参数,还能保证工具类的通用性
配置文件:
jdbc.properties
url=
user=
password= - 抽取一个方法
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的写法相关推荐
- 开源集锦(五)开源框架和快速开发工具类
Volley https://github.com/stormzhang/AndroidVolley http://blog.csdn.net/t12x3456/article/details/922 ...
- android 快速开发工具类,android面试知识点
项目地址:570622566/FastAndrUtils 简介:android 快速开发工具类 更多:作者 提 Bug 官网 标签: Fastandrutils 是一套整理修改整合的 and ...
- java 集成 模板类_几个使用JDBC Template常用的工具类
几个使用JDBC Template常用的工具类 第一:IntegerRowMapper 代码: public classIntegerRowMapperimplementsRowMapper { pu ...
- MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题
JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
Util.java,使用最广泛~ 代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util;import java.io.Fil ...
- Redis源码分析之工具类util
在redis源码中的辅助工具类中,主要包括大小端转换.SHA算法以及util.h中对应的算法. 大小端转换: LittleEndian:低位字节数据存放于低地址,高位字节数据存放于高地址. BigEn ...
- JDBC连接池与工具类
1.连接池概述 用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection, 而是通过池来获取Connection对象,当使用完Conn ...
- Mybatis的工厂工具类Util
工厂工具类 获取session package com.xbky.util;import org.apache.ibatis.io.Resources; import org.apache.ibati ...
- android 快速开发常用工具类,实例详解Android快速开发工具类总结
一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...
最新文章
- auto.exe,kavo.exe 批處理文件
- Python基础--线程
- drive es 软件兼容_某知名软件被完美修改!对不住了!
- 卷积神经网络的整体结构、卷积层、池化、python实现
- 【Java】多态学习笔记
- 捡漏!用谷歌图片搜索自制深度学习数据集 | 教程
- Oracle中监听程序无法识别连接描述符中的请求的服务解决办法
- 如何在svn上新建一个目录并赋予相应的权限
- flutter 路由
- PotPlayer播放器在双屏扩展模式下,视频播放时所遇到的几个常见问题的专业解答
- C51单片机串口初始化为何是这样:SCON=0X52;TMOD=0X20;TH1=0XF3;TR1=1;
- 计算机网络毕业设计汇报ppt,计算机ppt毕业设计模板
- MPLAB PICKIT3、MPLAB SIM调试
- java .getbytes_java中String的getBytes方法使用
- namecheap域名设置Cloudflare为第三方DNS
- 总结 | 人生如逆旅,我亦是行人
- 为啥linux识别螃蟹驱动,螃蟹卡 RTL8168 更新驱动解决 BBR 单线程限速
- Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了)---zhangkaitao
- 5.MCScanX 与circos下载、安装、运用
- 我国三大常用坐标系区别(北京54、西安80和WGS-84)(转)