JDBC
注意:
部分代码存在乱码问题,直接复制会出现错误!
大二小白一枚,初学java,有任何问题和建议欢迎指教
jdbc配置四大参数:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost::3306/数据库名
username: root
password: ***********
对数据库的增,删,改
1.通过connection 对象创建statement(向数据库发送sql语句的发送器)
2.调用它的int executeUpdate(String sql),它可以发送DML,DDL (返回对数据库几行有影响)
3.关闭资源(倒着关)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class main {
public static void main(String arg[]) throws ClassNotFoundException, SQLException {
//数据库四件套
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/mouse";
String username="root";
String password="111111";
Connection con= DriverManager.getConnection(url,username,password);// System.out.println(con);
//获取statement对象
Statement sta=con.createStatement();
//使用statement发送sql语句
String sql="INSERT INTO student VALUES('204361111','mouse','男',18,'信息学院')";
int m=sta.executeUpdate(sql);
System.out.println(m);
//关闭资源
sta.close();
con.close();
}
}
查询:
1.通过connection 对象创建statement(向数据库发送sql语句的发送器)
2.调用ResultSet rs=executeQuery(String querysql)
3.解析resultset 该方法自带一个行光标 默认指向beforefirst 需要调用next()语句将行光标往下
4.关闭资源(倒着关)
import java.sql.*;
public class main {
public static void main(String arg[]) throws ClassNotFoundException, SQLException {
//数据库四件套
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/mouse";
String username="root";
String password="111111";
Connection con= DriverManager.getConnection(url,username,password);// System.out.println(con);
//获取statement对象
Statement sta=con.createStatement();
//查询
ResultSet rs=sta.executeQuery("select *from student");
//解析resultset
//调用next方法把光标使光标移动
if(rs.next()){
String x=rs.getString("xuehao");
String n=rs.getString("name");
String s=rs.getString("sex");
int a=rs.getInt("age");
String d=rs.getString("sdept");
System.out.println(x+" "+n+" "+s+" "+a+" "+d);
}
rs.close();
sta.close();
con.close();
}
}
规范化:
在try外定义对象,在try内获取实例化对象,在finally中关闭对象(防止发生异常后执行不到关闭资源的语句)
ResultSet结果集光标挪动:
获取结果集元数据:
- 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;
- 获取结果集列数:int getColumnCount();
- 获取指定列的列名: String getColumnName(int collindex)
preparestatement
在进行con获取时,url为url=“jdbc:mysql://localhost:3306/数据库名称?useServerPrepStmts=true&cachePrepStmts=true”;(?)
来打开mysql的预编译功能(mysql默认关闭预编译功能)
- 是statement的子接口
- 可以防止SQL攻击
- 提高代码的可读性,可维护性
- 提高效率
使用前提:
- 连接的数据区必须支持预处理
- 每个pstmt都与一个sql模板绑定在一起,先把sql给数据库,数据库先进行效验,再进行编译。执行时只是把参数传递过去,若二次执行时就不用再校验语法,也不用再次编译,直接执行,从而提高效率。
书写例子(用户登录防止SQL攻击查询):
String sql="select *from user where username=? and password=?";
PreparedStatement pstm=con.prepareStatement(sql);
//为参数(?)赋值
pstm.setString(1,username);//第一个参数为第几个括号
pstm.setString(2,password);
ResultSet rs=pstm.executeQuery();
批处理:
mysql默认关闭批处理,在url中加入?rewriteBatchenStatements=true打开
当需要向数据库发送的指令过多时,为了提高效率,可以使用批处理,即一批一批的处理需要发送的指令
String sql="select *from user where username=? and password=?";
PreparedStatement pstm=con.prepareStatement(sql);
for(int i=0;i<=10000;i++){
pstm.setString(1,"user"+i);
pstm.setString(2,"1234"+i);
pstm.addBatch(); //添加批
}
pstm.executeBatch(); //执行批