数据库是一种储存结构,它允许使用各种格式输入,处理和检索数据,不必在每次是需要的数据时重新输入。
现在市面上的数据库多种多样详细,个人推荐使用MySQL。
具体介绍SQL语法介绍https://blog.csdn.net/PILIpilipala/article/details/113798383?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164881896616782184673299%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164881896616782184673299&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-113798383.142%5Ev5%5Epc_search_insert_es_download,157%5Ev4%5Econtrol&utm_term=sql%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口),使链接数据库和Java应用程序的纽带。
1.DriverManager类
方法 | 功能描述 |
---|---|
getConnection(String url,String user,String password) | 指定3个入口参数(依次是链接数据库的URL,用户名,密码)来获取与数据库的链接 |
setLoginTimeout() | 获取驱动程序试图登录到某一数据时可以等待的最长时间,以秒为单位 |
println(String message) | 将一条消息打印到当前JDBC日志流中 |
2.Connection接口
Connection接口代表与特定的数据库的连接,在连接上下文中执行SQL语句并返回结果
方法 | 功能描述 |
---|---|
createStatement() | 创建Statement对象 |
createStatement(int resultSetType,int resultSetConcurrency) | 创建一个Statement对象,该对象将生成具有给定类型,并发性和可保存性的ResultSet对象 |
preparedStatement() | 创建预处理preparedStatement |
isReadOnly() | 查看当前Connection对象的读取模式是否为只读形式 |
setReadOnly() | 设置当前Connection对象的读写模式,默认是非只读模式 |
commit() | 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁 |
roolback() | 取消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁 |
close() | 立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放 |
3.Statement接口
Statement接口用于用于在已经建立连接的基础上向数据库发送SQL语句。在JDBC中有3种Statement对象,分别Statement,PreparedStatement和CallableStatement.。Statement对象用于执行不带参数的简单SQL语句;PreparedStatement,用于执行对数据库的存储过程的调用
方法 | 功能描述 |
---|---|
execute(String sql) | 执行静态的SELECT语句,该语句可能返回多个结果集 |
executeQuery(String sql) | 执行给定的SQL语句,该语句返回单个ResultSet对象 |
clearBatch() | 清空此Statement对象的当前SQL命令列表 |
executeBatch() | 将一批命令提交给数据库来执行,如果全部命令成功,则返回更新计数组成的数组。数组元素的排序与SQL语句的添加顺序对应 |
addBatch(String sql) | 将给定的SQL命令添加到此Statement对象的当前命令中。如果驱动程序不支持批量处理,将抛出异常 |
close() | 释放Statement实力占用的数据库和JDBC资源 |
4.PreparedStatement接口
PreparedStatement接口用来动态地执行SQL语句,通过PreparedStatement实例执行的动态SQL语句,将被预编译并保存到PreparedStatement实力中,从而可以反复的执行该SQL语句。
方法 | 功能描述 |
---|---|
setInt(int index,int k) | 将指定位置的参数设置为int值 |
setFloat(int index,float f) | 将指定位置的参数设置为float值 |
setLong(int index,long f) | 将指定位置的参数设置为long值 |
setDoble(int index,doble f) | 将指定位置的参数设置为double值 |
setBoolean(int index,boolean f) | 将指定位置的参数设置为boolean值 |
setDate(int index,date date) | 将指定位置的参数设置为对应的data值 |
executeQuery() | 在此PreparedSeatement对象 |
setString(int index String s) | 将指定位置的参数设置为对应的String值 |
setNull(int index,intsqlType) | 将指定参数设置为SQL NULL |
executeUpdate() | 执行前面包含的参数的动态INSERT,UPDATE或DELETE语句 |
claeatParameters() | 清除当前所有参数的值 |
5.ResultSet接口
ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录前面,通过next()方法可将指针下移。在JDBC2.0(JDK1.2)之后,该接口添加了一组更新方法updateXXX(),该方法有两个重载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对数据进行的操作同步到数据库中,需要执行updateRow()方法或insertRow()方法更新数据库。
方法 | 功能描述 |
---|---|
getInt() | 以int形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回值时0 |
getFloat() | 以float形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回值是0 |
getDate() | 以date形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回值是null |
getBoolean() | 以boolean形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回null |
getString() | 以String形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回null |
getObject() | 以Object形式获取此ResultSet对象的当前行的指定列值。如果列值是NULL,则返回null |
first() | 将指针移到当前记录的第一行 |
last() | 将指针移到当前记录的最后一行 |
next() | 将指针向下移一行 |
beforeFirst() | 将指针移到集合的开头(第一行) |
afterLast() | 将指针移到集合的尾部(最后一行位置) |
absolute(int index) | 将指针移到ResultSet给定编号的行 |
isFrist() | 判断指针是否位于当前ResultSet集合的第一行。如果是返回true,否则返回false |
islast() | 判断指针是否位于单圈ResultSet集合的最后一行。如果是返回true,否则返回false用int值更新指定列 |
updateFloat() | 用float值更新指定列 |
updateLong() | 用指定的long值更新指定列 |
updateString() | 用只当的String值更新指定列 |
updateObject() | 用Object值更新指定列 |
updateNull() | 将指定的列修改为null |
updateDate() | 用指定的date值跟新指定列 |
updateDouble() | 用指定的double值更新指定列 |
getrow() | 查看当前行的索引号 |
insertRow() | 将插入行的内容插入数据库 |
updateRow() | 将当前行的内容同步到数据表 |
daleteRow() | 删除当前行,但并不同步到数据库中,而是执行close()方法后同步到数据库 |
package JDBC.sql;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class test {
public static void main(String[] args) {
//一下代码为链接数据库的
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//mydb1在数据库中必须有,如果没有就在Mysql中创建不然就找不到指定位置
String url = "jdbc:mysql://127.0.01:3306/mydb1";
String username = "root";
//数据库密码
String passord = "123456";
con = DriverManager.getConnection(url,username,passord);
System.out.println(con);
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if (con!=null){
System.out.println("成功连接数据库连接数据库");
System.out.println(con);
}
}
}
package JDBC.sql;
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
//一下代码为链接数据库的
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//mydb1在数据库中必须有,如果没有就在Mysql中创建不然就找不到指定位置
String url = "jdbc:mysql://127.0.01:3306/test";
String username = "root";
//数据库密码
String passord = "123456";
con = DriverManager.getConnection(url,username,passord);
Statement stmt = con.createStatement();
ResultSet res = stmt.executeQuery("select * from tb_stu");
while (res.next()){
String id = res.getString("id");
String name = res.getString("name");
String sex = res.getString("sex");
String birthday = res.getString("birthday");
System.out.println("编号:"+id);
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("生日:"+birthday);
System.out.println("=================================================");
}
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if (con!=null){
System.out.println("成功连接数据库连接数据库");
System.out.println(con);
}
}
}
package JDBC.sql;
import java.sql.*;
public class JDBCDome2 {
public static void main(String[] args) {
//一下代码为链接数据库的
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//mydb1在数据库中必须有,如果没有就在Mysql中创建不然就找不到指定位置
String url = "jdbc:mysql://127.0.01:3306/test";
String username = "root";
//数据库密码
String passord = "123456";
con = DriverManager.getConnection(url,username,passord);
Statement stmt = con.createStatement();
ResultSet res = stmt.executeQuery("select * from tb_stu where name like '张%'");
while (res.next()){
String id = res.getString("id");
String name = res.getString("name");
String sex = res.getString("sex");
String birthday = res.getString("birthday");
System.out.println("编号:"+id);
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("生日:"+birthday);
System.out.println("=================================================");
}
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if (con!=null){
System.out.println("成功连接数据库连接数据库");
System.out.println(con);
}
}
}
其实也就只修改了一个地方,关于sql的查询的语句进行了修改
预处理语句
对JDBC,可以通过Connection对象的preparedStatement(String sql)方法对SQL语句进行处理,生成数据库底层的内部文件命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法,可执行底层数据库命令。也就是说,应用程序能针对连接的数据库,将SQL语句解释为数据库底层的命令,然后让数据库执行这个命令。这样可以减轻数据库的负担,提高数据库的速度。
在顺序查询上修改创建JDBCDeom3类)
package JDBC.sql;
import java.sql.*;
public class JDBCDemo3 {
public static void main(String[] args) {
//一下代码为链接数据库的
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//mydb1在数据库中必须有,如果没有就在Mysql中创建不然就找不到指定位置
String url = "jdbc:mysql://127.0.01:3306/test";
String username = "root";
//数据库密码
String passord = "123456";
con = DriverManager.getConnection(url,username,passord);
Statement stmt = con.createStatement();
PreparedStatement ps = con.prepareStatement("select * from tb_stu where id = ?");
ps.setInt(1,3);
ResultSet rs = ps.executeQuery();
while (rs.next()){
String id = rs.getString(1);
String name = rs.getString("name");
String sex = rs.getString("sex");
String birthday = rs.getString("birthday");
System.out.println("编号:"+id);
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("生日:"+birthday);
System.out.println("=================================================");
}
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if (con!=null){
System.out.println("成功连接数据库连接数据库");
System.out.println(con);
}
}
}
添加,修改,删除记录
通过SQL语句可以对数执行添加,修改和删除操作。可通过PrepaedStatement类的指定参数,动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行跟新语句操作。
对学生表进行添加,修改和删除操作(创建JDBCDeom4类)
(id没有设置主键)
package JDBC.sql;
import java.sql.*;
public class JDBCDemo4 {
Connection con;
public void initConnection(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//通过访问数据库的URL,获取数据库连接对象
String url = "jdbc:mysql://127.0.01:3306/test";
String username = "root";
String passord = "123456"; //数据库密码
con = DriverManager.getConnection(url,username,passord);
System.out.println("成功连接数据库");
} catch (SQLException e) {
e.printStackTrace();
}
}
public void closeConnection() {
if (con != null) {
try {
con.close();
System.out.println("成功销毁数据库线程");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//显示所有学生数据
public void showAllData(){
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from tb_stu");
// ResultSet rs = stmt.executeQuery("select * from tb_stu");
while (rs.next()){//如果但钱语句不是最后一条,则进入循环
//将列值输出
//两种方式都可以
String id = rs.getString("id");
String name = rs.getString("name");
String sex = rs.getString("sex");
String birthday = rs.getString("birthday");
System.out.println("编号:"+id);
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("生日:"+birthday);
// System.out.print("编号:"+rs.getString("id"));
// System.out.print("姓名:"+rs.getString("name"));
// System.out.print("性别:"+rs.getString("sex"));
// System.out.print("生日:"+rs.getString("birthday"));
System.out.println("============================================");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//添加新学生
public void add(int id,String name,String sex,String birthday){
try {
String sql = "insert into tb_stu values(?,?,?,?)";
PreparedStatement ps =con.prepareStatement(sql);
ps.setInt(1,id); //设置编号
ps.setString(2,name); //设置名字
ps.setString(3,sex); //设置性别
ps.setString(4,birthday); //设置出生日期
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
//删除指定ID的学生姓名
public void delete(int id){
try {
Statement stmt = con.createStatement();
stmt.executeUpdate("delete from tb_stu where id="+id);
} catch (SQLException e) {
e.printStackTrace();
}
}
//修改指定ID的学生姓名
public void update(int id,String newName){
try {
String sql = "update tb_stu set name =? where id =?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,newName);
ps.setInt(2,id);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JDBCDemo4 demo = new JDBCDemo4();
demo.initConnection();
demo.showAllData();
System.out.println("--添加新同学--");
demo.add(5,"法外狂徒张三","男","1990—12—30");
demo.showAllData();
System.out.println("———修改编号为2的同学学生姓名———");
demo.update(2,"李美丽");
demo.showAllData();
System.out.println("———删除编号为3的学生———");
demo.delete(3);
demo.showAllData();
demo.closeConnection();
}
}