JDBC的全称是Java数据库连接( Java Database Connectivity),它是一套用于 执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、更新、新增和删除的操作。
应用程序使用JDBC访问数据库的方式如下图:
从上图中可以看出,JDBC在应用程序与数据库之间起到一个桥梁作用。
1.加载并注册数据库驱动,具体方式如下:
DriverManager.registerDriver(Driver driver); //两次注册
或 Class.forName("DriverName"); //一次注册
2.通过DriverManager获取数据库连接,具体方式如下:
Connection conn=DriverManager.getConnection(String url,String user,String pwd);
从上述代码可以看出,getConnection()有三个参数,分别表示连接数据库的URL地址,登录数据库的用户名和密码。URL地址的书写格式:jdbc:mysql://hostname:port/databasename
jdbc:mysql:是固定写法, mysql指的是MySQL数据库,hostname指的是主机名称(hostname可以是localhost或127.0.0.1),port指的是连接数据库的端口号,databasename指的是MySQL中相应数据库的名称。
3.通过Connection对象获取Statement对象
Connection创建Statement的方式有:
(1)createStatement():创建基本都Statement对象
(2)prepareStatement():创建PrepareStatement对象
(3)prepareCall():创建CallableStatement对象
以创建基本Statement对象为例,创建方式如下:
Statement stmt=conn.createStatement();
4.使用Statement执行SQL语句
所有Statement都有的执行SQL语句的方法,如下:
(1)execute():可以执行任何SQL语句
(2)executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet对象
(3)executeUpdate():主要用于执行DML和DDL语句,执行DML语句,如INSERT、UPDATE或DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0
以executeQuery()方法为例,使用方法如下:
//执行SQL语句,获取结果集
ResultSet rs=stmt.executeQuery(sql);
5.操作ResultSet结果集
若执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。
6.关闭连接,释放资源
每次操作数据库结束后都要关闭数据库连接,释放资源,包括关闭ResultSet、Statement和Connection等资源。
在项目的chapter09的src目录下,创建一个cn.itcast.jdbc.example的包,在该包中创建类Example01,用于读取数据库中的users表,并将结果输出到控制台,如下:
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.xml.crypto.Data;
import com.mysql.jdbc.Driver;
public class Example01 {
public static void main(String[] args) throws Exception{
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Driver driver = new Driver();
DriverManager.registerDriver(driver);
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "123456";
con = DriverManager.getConnection(url, user, password);
stmt = con.createStatement();
String sql = "select * from users";
rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getNString("name");
String psw = rs.getNString(3);
String email = rs.getNString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " " + name + " " + email + " " + birthday);
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
System.out.println("资源会被关闭吗-----");
}
}
}
(1)连接MySQL
(2)创建jdbc数据库,并连接数据库
(3)填充表的信息
在实现第一个JDBC程序中,SQL语句的执行是通过Statement对象实现。Statement对象每次执行SQL语句是,都会对其进行编译,当相同的SQL语句执行多次时,Statement对象就会使数据库频繁编译相同的SQL语句,从而降低数据库的访问效率。
在chapter09的包中参加一个example02的类,在该类中使用PreparedStatement对象对数据库进行插入数据的操作,如下:
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example02 {
public static void main(String[] args) throws SQLException{
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con=JDBCUtils.getCon();
String sql = "insert into users values(?,?,?,?,?)";
stmt=con.prepareStatement(sql);
stmt.setInt(1,6);
stmt.setString(2,"liuyaowen");
stmt.setString(3."0923");
stmt.setString(4."[email protected]");
java.sql.Date date = new java.sql.Date(new Date().getTime());
stmt.setDate(5,date);
int row = stmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
System.out.println("资源会被关闭吗-----");
JDBCUtils.realse(rs, stmt, con);
}
}
}
查询information表查看程序是否添加信息
ResultSet对象主要用于存储结果集,可以通过next()方法由前向后逐个获取结果集中的数据。若想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResulSset定义的常量,具体设置方式如下:
Statement smet=conn.create.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs =smet.executeQuery(sql);
1.在chapter09的项目下创建一个名为example03的类,该类使用了ResultSet对象去除指定对象的信息,代码如下:
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example03 {
public static void main(String[] args) throws SQLException {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:2222","lyw","0923");
rs=stmt.executeQuery("select * from users");
rs.absolute(2);
System.out.println("第二行数据"+rs.getString("name"));
rs.beforeFirst();
rs.next();
System.out.println("第一行数据"+rs.getString("name"));
rs.afterLast();
rs.previous();
System.out.println("最后一行数据"+rs.getString("name"));
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
System.out.println("资源会被关闭吗-----");
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
1.在chapter09的项目下创建一个名为User的类,用于保存用户数据,代码如下:
package cn.itcast.jdbc.example;
import java.sql.Date;
public class User {
private int id;
private String username;
private String paasword;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPaasword() {
return paasword;
}
public void setPaasword(String paasword) {
this.paasword = paasword;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
2.然后再创建一个工具类名称为JDBCUtils :
package cn.itcast.jdbc.example;
import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCUtils {
public static Connection getCon() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","123456");
return con;
}
public static void realse(ResultSet rs,Statement stmt,Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}rs=null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}stmt=null;
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}con=null;
}
}
}
3.创建一个名为UserDao的类,该类封装了对表information的添加、删除、查询和更新等操作。
package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.Statement;
import java.util.List;
public class UserDao {
//添加用户
public boolean insert(User user) {
Connection con = null;
Statement stmt = null;
try {
con=JDBCUtils.getConnection();
stmt=con.createStatement();
SimpleDateFormat sdf=new SimpleDateFormat();
String birthday=sdf.format(user.getBirthday());
String sql="INSERT INTO information(id,name,password,email,birthday)"+
"VALUES("+user.getId()+"','"+user.getName()+"','"+
uesr.getPassword()+"','"+user.getEmail()+"','"+user.getBirthday;
int num=stmt.executeUpdate(sql);
if(num>0){
return true;
}
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
System.out.println("资源会被关闭吗-----");
JDBCUtils.realse(null, stmt, con);
}
return false;
}
public List<User> findAllUser(){
return null;
}
public User findUserById(int id) {
return null;
}
public boolean update(User user) {
return false;
}
public boolean delete(int id) {
return false;
}
}
4,创建一个名称为jdbcInsertTest类,用来测试程序
文章浏览阅读1.2w次,点赞20次,收藏28次。输入~$ rosrun turtlesim错误Usage: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS] rosrun will locate PACKAGE and try to find an executable named EXECUTABLE in the PACKAGE tree. If it finds it, it will run it with ARGS.解决方法在输入~$ rosrun t_usage: rosrun [--prefix cmd] [--debug] package executable [args] rosrun will
文章浏览阅读1.2w次,点赞9次,收藏54次。根据傅里叶级数的定义我们知道:对于任意一个周期为的周期信号,都可以求出它在三角函数集中各函数中的分量,从而可将在区间内表示为三角函数集中各函数的加权和。即:其中:借助Matlab编写M文件,以方波信号为例,选取不同的级数项数进行合成,观察与原方波的逼近情况。源码如下:%该m文件用于绘制方波信号及其傅立叶级数谐波叠加clc;clear;close all;syms x; %定义符号变量x,用..._方波信号分解
文章浏览阅读110次。映射了file文件夹和application的配置文件。kkfile 文件预览的docker命令。_docker kkfile
文章浏览阅读2.1k次。上一篇讲了mybatisplus的介绍以及入门教程,这一片介绍关于它的CRUD直接上代码。三、CRUD接口一、insert1、插入操作@RunWith(SpringRunner.class)@SpringBootTestpublic class CRUDTests { @Autowired private UserMapper userMapper; @..._mybatis id全局唯一值
文章浏览阅读3.8k次。命令:grep -rl test | xargs sed -i ‘s/test/123456/g’报错:sed: can’t read test_file : No such file or directory原因:一开始以为自己的命令用错了,修改成sed -i ‘s/test/123456/g’`grep -rl test 依然不行。经过不断尝试,发现在centos6.9上不行。切换到centos7.6上就行了。有大佬知道这是为什么吗?cat /etc/redhat-release _windows bash sed: can't read : no such file or directory
文章浏览阅读148次。和一个屏蔽字符串“ux”,那么“78”可以组成多个字符串例如:“ux”,“uw”,“vx”,“vw”,过滤这些完全包含屏蔽字符串的每一个字符的字符串,然后输出剩下的字符串。例如7关联"u","v",8关联"x","w",输入一个字符串例如“78”,0 关联 "a","b","c"1 关联 "d","e","f"2 关联 "g","h","i"3 关联 "j","k","l"4 关联 "m","n","o"5 关联 "p","q","r"7 关联 "u","v"8 关联 "w","x"
文章浏览阅读1.5k次,点赞5次,收藏5次。背景闲鱼是一个典型的C2C场景的闲置交易平台,每个在闲鱼的用户都能享受到自由交易的乐趣,只要简单的输入商品名,商品价格,库存等信息就能完成一个商品的发布。充分的自由是闲鱼..._闲鱼服务端架构演进的心得
文章浏览阅读543次。=================复制虚拟机网卡问题=============== 每次复制的虚拟机的时候如果不选择复制的虚拟机网卡地址跟源的一样,这里点击上就会重新分配网卡mac地址。 重启后的虚拟机的网卡并不能用,这里需要设置。 这里是重新获得的mac地址, vi /etc/sysconfig/network-scripts/ifcfg-eth0将网卡的mac地址手动改成修改后的,_virtualbox 下的vi
文章浏览阅读2.5w次,点赞10次,收藏97次。-FM4550国产化开发板功能接口-- 系统框图-01- 产品参数-1.主要参数系统1: FPGA型号:FMQL45T900 PS内核:四核ARM Cortex-A7,主频800MHz PS端内存:1GB DDR3,数据速率1066Mbps,32bit PL端内存:1GB DDR3,数据速率1600Mbps,32bit GTX收发器:16X 速度等级:对标进口-2 ..._fmql45t900
文章浏览阅读489次。这是一台困难靶机,靶机内容主要考察了web漏洞利用,逆向,权限维持,提权等各个方面的内容,这个靶机非常适合入门逆向,并且对提升渗透思维帮助很大,我从中也获益良多。_padbuster
文章浏览阅读960次,点赞17次,收藏16次。这篇文章主要介绍了python简单编程小游戏,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。哈喽铁子们。_python编程小游戏
文章浏览阅读735次。在操作学生管理系统时,想实现一个效果就是 清屏,试了好几种都不满意,终于让我找到一个合适的printf("\033c");这个可以 效果杠杠的_lvgl清屏