目录
1、JDBC基础编写
/* 使用图形化工具操作数据库:步骤:1、连接数据库
1.1、启动mysql:
管理员身份运行cmd:net start【stop】 mysql 密码:123123
1.2、图形化界面连接数据库
JDBC:Java DataBase Connectivity java语言操作数据库
JDBC本质:官方(sun公司)定义的操作所有的关系型数据库的规则(接口);各个数据库厂商去实现这套接口,提供数据库驱动jar包。
我们可以使用这套接口编程,真正执行代码的是驱动jar包中的实现类
快速入门:【注意:mysql8驱动版本必须设置时区和设置驱动为com.mysql.cj.jdbc.Driver】
步骤:1、导入驱动jar包
1.1、赋值jar包到项目的libs目录下
1.2、Add As Library
2、注册驱动
3、获取连接对象,Connection
String url="jdbc:mysql://localhost:3306/数据库名" +
"?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT";//设置编码方式为UTF-8 设置数据库时间标准为东八区
Unicode;Encode:编码 timezone:时区 userssl:关闭证书验证【下有补充】
4、定义sql语句
5、获取执行对象,Statement
6、执行sql,接受返回结果
7、处理结果
8、释放资源
*/
/*详解创建的各个对象:
1*、DriverManager接口:驱动管理对象
功能:1、注册驱动 【.5之后的驱动jar包可以省略】
static void registerDriver(Driver driver) 向DriverManager 注册给定驱动程序。
写代码的话用 例子:Class.forName("com.mysql.cj.jdbc.Driver");
通过查看源码发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
2、获取数据库连接
static Connection getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。
参数:url:指定连接的路径,
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 //.5jar版本
例子:"jdbc:mysql://localhost:3306/db1"
细节:如果连接的是本机的mysql服务器,并且mysql服务默认为3306;则url可以写为:jdbc:mysql://数据库名称
user:用户名,
passwd:密码
2*、Connection接口:数据库连接对象
功能:1、获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2、管理事务
开启事务
void setAutoCommit(boolean autoCommit) 调用该方法设置参数为false,即开启事务
提交事务
void commit()
回滚事务
void rollback()
3*、Statement:执行sql的对象 java.sql
功能:1、执行sql
boolean execute(String sql) 可以执行任意sql【了解】
int executeUpdate(String sql 执行DML语句【返回影响行数】、DDL语句【返回0】
返回值:数据库中影响的行数 返回值>0 执行成功
ResultSet executeQuery(String sql) 执行DDL语句
4*、ResultSet:结果集对象
功能:封装查询结果
boolean next():游标向下移动一行;判断当前行是否是最后一行末尾【是否有数据;true--有数据】
xxx getXxx(参数):获取数据 其中,Xxx是数据类型
参数:1、int:代表列的编号,从1开始
2、String:代表列的名称
注意:使用步骤:
1、游标向下移动一行
2、判断是否有数据
3、获取数据
5*、PreparedStatement:执行动态sql的对象 Statement的子类
补充:
SSL协议提供服务主要:
1)认证用户服务器,确保数据发送到正确的服务器; .
2)加密数据,防止数据传输途中被窃取使用;
3)维护数据完整性,验证数据在传输过程中是否丢失;
当前支持SSL协议两层:
SSL记录协议(SSL Record Protocol):建立靠传输协议(TCP)高层协议提供数据封装、压缩、加密等基本功能支持
SSL握手协议(SSL Handshake Protocol):建立SSL记录协议用于实际数据传输始前通讯双进行身份认证、协商加密算法、 交换加密密钥等。
*/
/*PreparedStatement和Statement:
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高???
详解:
1、PreparedStatement:表示预编译的 SQL 语句的对象。
接口:public interface PreparedStatement extends Statement之间的继承关系
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.以此类推。
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 1533.00)
pstmt.setInt(2, 1102)
pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment */
//使用PrepareStatement
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class PreparedStatementTest {
public static void main(String[] args) {
test_autoCommit();
}
public static void test_autoCommit()
{
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user="admin";
String password="admin";
Connection conn=null;
PreparedStatement ps=null;
try {
//1、注册驱动
Class.forName(driver);
//2、获取连接
conn= DriverManager.getConnection(url, user, password);
//System.out.println(conn);
//3、创建prepareStatement对象
String sql="insert into lover values(?,?,?)";
ps=conn.prepareStatement(sql);
//4、执行sql语句
ps.setInt(1,21);//代表设置给第一个?号位置的值为Int类型的21
ps.setString(2,"suwu150");//代表设置给第二个?号位置的值为String类型的suwu150
java.util.Date utilDate=new java.util.Date();//进行类型转换,由util类型的date转化为sql类型的
ps.setDate(3, new java.sql.Date(utilDate.getTime()));
//ps.execute();//执行
System.out.println(ps.execute());//执行表输出返回的结果,结果为false,因为没有返回的结果集
//5、处理结果集
} catch (Exception e) {
e.printStackTrace();
}
finally{
//6、关闭资源
try {
if(ps!=null)ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//使用Statement
public class Jdbc05 {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {//1
Class.forName("com.mysql.cj.jdbc.Driver");
//2 、获取连接对象
String url="jdbc:mysql://localhost:3306/db1"+
"?useUniocde=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT";
conn = DriverManager.getConnection(url, "root", "123123");
//3 定义sql
String sql="select * from student";
//4 获取执行sql对象
stmt = conn.createStatement();
//5 执行sql 创建结果集对象
rs = stmt.executeQuery(sql);
int count=rs.getMetaData().getColumnCount();//通过结果集元数据,得到列数
//6 处理结果
//6.1 让游标向下移动一行
while(rs.next()){//循环判断游标是否是最后一行末尾 //和迭代器相似
//6.2 获取数据
for (int i = 1; i <= count; i++) {//光标从1开始
System.out.print(rs.getString(i));
if(i<count) System.out.print(",");
}
System.out.println();
}
//7 释放资源
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally{
if(rs!=null){
try {
stmt.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();
}
}
}
}
}
2、编写工具类
1、编写jdbc.properties文件
//jdbc.properties
url=jdbc:mysql://localhost:3306/db1?useDemode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT
user=root
password=123123
driver=com.mysql.cj.jdbc.Driver
2、编写工具类
/*
*获取连接需求:不想传递参数(麻烦),还要保证工具类的通用性。
* 解决方案:配置文件
* jdbc.properties
* url=
* user=
* password=
* 文件的读取只需读取一次。使用静态代码块完成
* */
public class JDBCUtils {
private static String url;//静态变量才能被静态代码块和静态方法访问
private static String user;
private static String password;
private static String driver;
static{
//读取配置文件,获取值
//1 Properties集合类
Properties pro=new Properties();
try {
/* 2 加载文件 */
//获取配置文件路径的方式 ClassLoader 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");//获取统一资源定位符 定位文件路径
String path = res.getPath();//获取字符串路径
System.out.println(path);///E:/IdeaProjects/java_lianxi/out/production/java_lianxi/jdbc.properties
// pro.load(new FileReader("src/jdbc.properties"));
pro.load(new FileReader(path));
//3 获取属性
url=pro.getProperty("url");
System.out.println(url);
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//4 注册驱动
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源方法
public static void close(Statement stmt, Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//释放资源重载方法
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();
}
}
}
}
3、编写封装数据的Javabean
//(id,name,age,sex,address,math,english)
//对应封装student表数据的JavaBean
public class Stu {
private int id;
private String name;
private int age;
private String sex;
private String address;
private int math;
private int english;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
@Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
", math=" + math +
", english=" + english +
'}';
}
}