一、jdbc学习:
问题:
在学习了数据库之后,我们可以使用数据库的客户端书写SQL语句
完成对数据的操作。但是数据库只是帮助我们将数据合理的进行存储。
而我们的最终目的是将数据库中的数据和java代码联系起来。那么怎么办呢?
方案:
使用java代码实现类似数据库客户端的功能即可。
细节:
首先数据库厂商是不会将其底层的代码给我们看的,也就说
我们没有办法自己声明数据库链接的工具类。数据库厂商为了
让java代码可以对数据库进行操作,对外提供了操作的工具包。
实现:
jdbc驱动包
注意:
jdbc驱动包由数据库厂商提供。
用来链接以及操作数据库。
新创建的项目中是没有数据库操作相关的类文件的。
使用
1、导入jar包
jar包:jar是class文件的压缩包,能够被jdk虚拟机直接使用。
流程:
1)选择项目右键新建文件夹,命名为lib.
2)将mysql的jar包放入到lib文件夹中
作用:
1)可以书写java代码, 并在自己的代码中调用jdbc中的类文件完成数据库操作。
2)使用jdbc中的类完成增加
3)使用jdbc中的类完成更新
4)使用jdbc中的类完成删除
5)使用jdbc中的类完成查询
注意:
IDE工具在我们创建项目时,会自动的将jdk的相关jar包,自动导入进来。
二、获取数据库连接
Class. forName ( "com.mysql.jdbc.Driver" );
Connection conn =DriverManager. getConnection
( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
505为需要连接的数据库的名字,root为用户名,1234为密码。
对于新版本的mysql的driver,需要设置为
driver="com.mysql.cj.jdbc.Driver"
三、对数据库的增删改
package com.bjsxt.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* jdbc 学习之增加数据:
* 1 、加载驱动
* 2 、获取链接对象
* 3 、创建 SQL 命令对象
* 4 、创建 SQL 命令
* 5 、执行。
* @author Administrator
*
*/
public class TestAdd {
public static void main(String[] args ) throws ClassNotFoundException , SQLException {
// 加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//1 、链接数据库 --- 桥
Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//2 、创建 SQL 命令对象 -- 车
Statement stmt = conn .createStatement();
//3 、创建 SQL 命令 --- 货物
String sql = "insert into person values (default,' 赵丽颖 ','28','2')" ;
//4 、将 SQL 命令放到命令对象中 , 并执行 --- 装车并发货
int i = stmt .executeUpdate( sql );
//5 、打印结果
System. out .println( " 执行结果 :" + i );
}
}
除sql语句不一样,其他都一样。
四、对数据库的查询
package com.bjsxt.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.bjsxt.pojo.Person;
/**
* 问题 :
* 查询所有的用户信息到 java 代码中
* 实现:
* jdbc 查询
* 流程:
* //1 、加载驱动
//2 、获取链接
//3 、创建 Sql 命令对象
//4 、创建 Sql 命令
//5 、执行查询
//6 、遍历
* 问题:
* 如果在循环体中直接将数据获取并打印,这样每次循环的数据都会丢失,怎么办?
* 解决:
* 每条数据应该使用对象进行存储。需要创建和数据库表构造类似的 java 类。
* 该类的一个实例化对象,存储一条数据。最终将该类的实例化对象存储到集合中。
* 完成数据的查询。
* 实现:
* 在 java 项目专门创建一个包,该包中专门用来声明和数据库表相对应的实体类。
* 包的命名规则为 :
* XXX.XXX.XXX.pojo
* 示例:
* com.bjsxt.pojo
* 类的命名规则:
* 原则上尽量保证类目和表名一致。
* 属性的命名规则
* 属性名原则上和字段名一致。
* 属性的类型
* 类型原则上和字段类型一致。
*
* 总结 :
* 使用 jdbc 的查询, stmt.executeQuery(String sql ); 该方法返回 ResultSet 结果集对象
* 而该对象是一个指向了要查询的数据的流对象。 使用流读取将数据读到 java 代码中,该流对象是基于指针的
* 每次指向一条数据。每循环一次读取一条数据到 java 代码中。
*
*/
public class TestSelect2 {
public static void main(String[] args ) throws ClassNotFoundException, SQLException {
// 创建 List 集合
List<Person> list = new ArrayList<>();
//1 、加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//2 、获取链接
Connection conn = DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//3 、创建 Sql 命令对象
Statement stmt = conn .createStatement();
//4 、创建 Sql 命令
String sql = "select * from person" ;
//5 、执行查询
ResultSet rs = stmt .executeQuery( sql );
//6 、遍历
while ( rs .next()){
// 创建实体类对象存储数据,每个对象存储一条数据
Person p = new Person();
// 将数据存储到实体类对象中
p .setUid( rs .getInt( "uid" ));
p .setUname( rs .getString( "uname" ));
p .setAge( rs .getInt( "age" ));
p .setClassid( rs .getInt( "classid" ));
// 将对象存储到 list 集合中
list .add( p );
}
System. out .println( list );
}
}
五、使用PreparedStatement预处理进行增删改查
package com.bjsxt.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 问题:
* 在使用 statement 对象发送和执行 Sql 语句到数据库时发现,如果连续多次执行相同的 Sql 语句,只有数据不同时
* 例如:连续增加三条用户数据到数据库, Sql 语句会被多次发送。
* 方案:
* 希望 Sql 语句只被解析发送一次。
* 实现:
* 使用 PreparedStatement 对象
* 特点:
* PreparedStatement 是 statement 的子类
* 使用 :
* 1 、加载驱动
* 2 、获取链接
* 3 、创建 Sql 命令
* 在 Sql 语句中使用 ? 对数据进行占位
* 示例 :
* String sql ="insert into person values(default,?,?,?)";
* 4 、创建 Sql 命令对象 (prepareStatement)
* PreparedStatement ps = conn.prepareStatement( sql );
* 注意:在通过 conn 对象获取 ps 对象时就已经将 sql 语句赋值给了 ps 对象。
* 5 、给占位符赋值
* 注意:占位符从左至右数,角标从 1 开启
* 示例:
* ps.setObject( 角标 , 数据 );
* 6 、执行
* ps.executeUpdate()// 增加,删除,修改 返回 int
* ps.executeQuery()// 查询 返回 ResultSet
* 能力:
* 使用 Statement 对象完成对数据库的增删改查
* 使用 preparedStatement 对象完成对数据库的增删改查
* @author Administrator
*
*/
public class TestPrepareStatement {
public static void main(String[] args ) throws ClassNotFoundException, SQLException {
// 传统方式之使用 statement 对象操作数据库
//operByStatement();
// 使用 PreparedStatement 对象操作数据库
operByPreparedStatement ();
}
//PreparedStatement 对象
private static void operByPreparedStatement() throws ClassNotFoundException, SQLException {
//1 、加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//2 、获取链接
Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//3 、创建 Sql 命令
String sql = "insert into person values(default,?,?,?)" ;
//4 、创建 Sql 命令对象
PreparedStatement ps = conn .prepareStatement( sql );
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 " );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 2" );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 3" );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
}
//Statement 对象
private static void operByStatement() throws ClassNotFoundException, SQLException {
//1 、加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//2 、获取链接
Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//3 、创建 sql 命令对象
Statement stmt = conn .createStatement();
//4 、创建 Sql 命令
String sql = "insert into person values(default,' 赵六 ',18,2)" ;
String sql1 = "insert into person values(default,' 赵六 1',18,2)" ;
String sql2 = "insert into person values(default,' 赵六 2',18,2)" ;
//5 、执行
int i = stmt .executeUpdate( sql );
int i2 = stmt .executeUpdate( sql1 );
int i3 = stmt .executeUpdate( sql2 );
System. out .println( " 执行增加结果为 :" +( i + i2 + i3 ));
}
}
六、事务管理
package com.bjsxt.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 问题:
* 在使用 statement 对象发送和执行 Sql 语句到数据库时发现,如果连续多次执行相同的 Sql 语句,只有数据不同时
* 例如:连续增加三条用户数据到数据库, Sql 语句会被多次发送。
* 方案:
* 希望 Sql 语句只被解析发送一次。
* 实现:
* 使用 PreparedStatement 对象
* 特点:
* PreparedStatement 是 statement 的子类
* 使用 :
* 1 、加载驱动
* 2 、获取链接
* 3 、创建 Sql 命令
* 在 Sql 语句中使用 ? 对数据进行占位
* 示例 :
* String sql ="insert into person values(default,?,?,?)";
* 4 、创建 Sql 命令对象 (prepareStatement)
* PreparedStatement ps = conn.prepareStatement( sql );
* 注意:在通过 conn 对象获取 ps 对象时就已经将 sql 语句赋值给了 ps 对象。
* 5 、给占位符赋值
* 注意:占位符从左至右数,角标从 1 开启
* 示例:
* ps.setObject( 角标 , 数据 );
* 6 、执行
* ps.executeUpdate()// 增加,删除,修改 返回 int
* ps.executeQuery()// 查询 返回 ResultSet
* 能力:
* 使用 Statement 对象完成对数据库的增删改查
* 使用 preparedStatement 对象完成对数据库的增删改查
* @author Administrator
*
*/
public class TestPrepareStatement {
public static void main(String[] args ) throws ClassNotFoundException, SQLException {
// 传统方式之使用 statement 对象操作数据库
//operByStatement();
// 使用 PreparedStatement 对象操作数据库
operByPreparedStatement ();
}
//PreparedStatement 对象
private static void operByPreparedStatement() throws ClassNotFoundException, SQLException {
//1 、加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//2 、获取链接
Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//3 、创建 Sql 命令
String sql = "insert into person values(default,?,?,?)" ;
//4 、创建 Sql 命令对象
PreparedStatement ps = conn .prepareStatement( sql );
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 " );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 2" );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
//5 、给占位符赋值
// 增加一条
ps .setString(1, " 周周 3" );
ps .setInt(2, 18);
ps .setInt(3, 2);
//6 、执行
ps .executeUpdate();
}
//Statement 对象
private static void operByStatement() throws ClassNotFoundException, SQLException {
//1 、加载驱动
Class. forName ( "com.mysql.jdbc.Driver" );
//2 、获取链接
Connection conn =DriverManager. getConnection ( "jdbc:mysql://localhost:3306/505" , "root" , "1234" );
//3 、创建 sql 命令对象
Statement stmt = conn .createStatement();
//4 、创建 Sql 命令
String sql = "insert into person values(default,' 赵六 ',18,2)" ;
String sql1 = "insert into person values(default,' 赵六 1',18,2)" ;
String sql2 = "insert into person values(default,' 赵六 2',18,2)" ;
//5 、执行
int i = stmt .executeUpdate( sql );
int i2 = stmt .executeUpdate( sql1 );
int i3 = stmt .executeUpdate( sql2 );
System. out .println( " 执行增加结果为 :" +( i + i2 + i3 ));
}
}
——————————————————————————————————————————
关于jdbc详细笔记见https://blog.csdn.net/m2606707610/article/category/7681555