/**
* jdbc的规范模式
*/
import java.sql.*;
public class learn1 {
public static void main(String[] args) {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
//1.注册驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
}catch(Exception e) {
e.printStackTrace();
}
/*
* url:统一资源定位符,(网络中某个资源的绝对路径
* URL包括哪几个部分:协议,IP,port,资源名
* eg:https://www.baidu.com/ 也可以用 http://182.61.200.7:80/index.html
* 其中 http:// 表示通信协议 , 182.61.200.7 是百度服务器的ip , 80 是服务器上软件的端口
* (IP是计算机的代号,而端口号是这台计算机上某个软件的代号
* index.html 是服务器上的某个资源名
* 例如数据库中url: “ jdbc:mysql://127.0.0.1:3306/powernode "
* jdbc:mysql:// 是指协议,127.0.0.1 或localhost(本机) 指明你连的是哪个机器,3306指明连的是哪个端口,powernode指明连接的是
*/
try {
//2,获取连接
String url="jdbc:mysql://localhost:3306/runoob?serverTimezone=GMT";
String username="root";
String password="1746996100mao";
conn = DriverManager.getConnection(url,username,password);
System.out.println("数据库连接对象:"+conn); //com.mysql.cj.jdbc.ConnectionImpl@6b57696f
//3.获取数据库操作对象 (Statement专门执行SQL语句的)
st = conn.createStatement();
//4.执行SQL
/*SQL语句分为两种:返回信息的语句->executeQuery()方法(select语句),返回类型为ResultSet
* 和不返回信息的语句->executeUpdate()方法(update,delete,insert语句),返回类型为int
* JDBC语句写SQL语句不需要提供分号!!!
*/
String sql = "select * from employee_tbl"; //SQL语句
rs = st.executeQuery(sql); //把SQL语句传入
//或者直接 ResultSet rs = st.executeQuery("select * from employee_tbl");
System.out.println(rs);
String sql2 = "insert into employee_tbl (id,name,date) values (10,'sherry',NOW())";
int count = st.executeUpdate(sql2); //count 表示“影响数据库的记录条数”
System.out.println(count==1?"保存成功":"保存失败");
//5.处理查询结果集
}catch(Exception e) {
e.printStackTrace();
}finally {
//6.释放连接
/**
① 为了保证资源一定释放,在finally语句中释放资源
②并且遵循从小到大依次关闭,依次对其进行try...catch...(都放在自己单独的异常处理语句中)
(因为如果放到一个异常处理里面,则如果前面任意一个发生异常,后面的关闭操作就不会再进行,导致后面的资源没有被释放)
③且只有不为空的时候关闭才有意义
*/
try {
if(rs!=null) {
rs.close();
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(st!=null) {
st.close();
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 处理查询结果集
*/
import java.sql.*;
public class learn2 {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/runoob?serverTimezone=GMT","root","1746996100mao");
System.out.println("数据库连接对象:"+conn); //com.mysql.cj.jdbc.ConnectionImpl@6b57696f
//3.获取数据库操作对象
st = conn.createStatement();
//4.执行SQL语句
String sql = "select id as a,name,date from employee_tbl";
rs = st.executeQuery(sql);
//5.处理查询结果集
/**
* 刚开始rs指向第一行,也就是属性那一行
* rs.next指向数据第一行
*/
/*
boolean flag1 = rs.next();
if(flag1) {
//getString()方法的特点:不管数据库中的类型是什么,都以String的形式取出
//jdbc的列数是从1开始的
String id = rs.getString(1); //1表示第一列
String name = rs.getString(2); //得到该行第二列的值
String date = rs.getString(3); //得到该行第3列的值
System.out.println(id+','+name+','+date); //得到flag1那一行的前三列的值
}
boolean flag2 =rs.next(); //第2行
if(flag2) {
String name = rs.getString("name"); //得到第二行,属性名为"name"的那列值
System.out.println(name);
}
*/
// //遍历得到的数据表
// while(rs.next()) { //rs.next为false,即光标已经移到不存在的行数时
// /*
// String id = rs.getString(1); //1表示第一列
// String name = rs.getString(2); //得到该行第二列的值
// String date = rs.getString(3); //得到该行第3列的值
// */
// //上述直接用列的下标1,2,3,这样不健壮,如下,直接用列名使程序更加健壮
// //注意下述列名称是指查询结果的列名称,还是查询结果的列名称
// //答案是:下述列名称是查询结果的列名称,如下述id是查询a,而不是id (原来是id,但在sql语句中id as a改名成了a,所以下述也要用a去查询,而不是用id去查询
// String num = rs.getString("a"); //1表示第一列
// String name = rs.getString("name"); //得到该行第二列的值
// String date = rs.getString("date"); //得到该行第3列的值
// System.out.println(num+','+name+','+date); //得到flag1那一行的前三列的值
// }
//除了getString(),getInt(),还有getDouble(),用int和double的好处是,可以直接进行数据运算
boolean flag1 = rs.next();
double id = rs.getDouble(1);
System.out.println(id+100);
}catch(Exception e) {
e.printStackTrace();
}finally {
//6.释放连接
if(rs != null) {
try {
rs.close();
}catch(Exception e) {
e.printStackTrace();
}
}
if(st != null) {
try {
st.close();
}catch(Exception e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}