1、JDBC(Java数据库连接)
1)导jar包:驱动!
2)加载驱动类:Class.forName(“类名”);
3)给出url、username、password,
4)使用DriverManager类来得到Connection对象!
2、JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
1)DriverManger(驱动管理器)
注册驱动:这可以让JDBC知道要使用的是哪个驱动;
2)Connection对象表示连接,与数据库通讯:获取到Connection,则数据库连接成功
Connection对象用来获取Statement对象;
3)Statement:SQL语句发射器
void executeUpdate(String sql):执行更新操作(insert、update、delete等);
ResultSet executeQuery(String sql):执行查询操作,返回值为ResultSet;
4)ResultSet:表的结果集对象。
1)Connection
//获取Statement:
Statement stmt = con.createStatement();
2)Statement
方法:
//执行更新操作
int executeUpdate(String sql):即执行insert、update、delete等语句。
//执行查询操作,
ResultSet executeQuery(String sql):执行查询操作会返回ResultSet,即结果集。
//执行增、删、改、查所有SQL语句。
boolean execute() :boolean类型,表示SQL语句是否有结果集!
//使用execute()方法执行的是更新语句,
还需调用int getUpdateCount()来获取insert、update、delete语句所影响的行数。
//使用execute()方法执行的是查询语句,
还需调用ResultSet getResultSet()来获取select语句的查询结果。
3)ResultSet对象表示结果集
结果集:一个二维的表格,有行有列。
ResultSet内部的含有“行光标”。用来指示当前被操作的行
方法:
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值
参数就是列数,列数从1开始,而不是0。
3.1)ResultSet滚动结果集:移动”行光标”
获取结果集元数据
得到元数据: .getMetaData(). 返回值为RsultSetMetaData
方法:
getColumnCount(); 得到结果集列数
getColumnName(int colindex); 获取指定的列名称
结果集特性:
是否可滚动
是否敏感 -- 结果集数据是否跟随数据库而变化
是否可更新
需要在connection创建statement时,确定特性
Statement stmt = con.createStatement(int,int);
第一个参数:
ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
第二个参数:
CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。
4)Preparedstatement(预编译)
是statement的子接口:
强大之处:
1)防SQL攻击
2)提高代码可读性。可维护性
3)提高效率。
用法:
// 一、得到PreparedStatement
// a.给出SQL模板:所用参数用"?" 替代
// b.调用Connection.PrepareStatement();方法
//二、 使用setXxx();方法给参数? 赋值。
//三、调用pstmt的executeQuery(); 此方法无参
服务器的工作:
校验sql语句语法。
编译:把sql语句变为函数。
执行:调用函数
PreparedStatement(预处理语句)原理:
前提:数据库支持预处理。(现在都支持)
每个PreparedStatement都与sql模板绑定在一起。
1)校验:先把sql模板给数据库进行校验
2)编译
3)执行:执行时只把参数传递过去即可。
若第二次执行时,则不用再次编译
注:mysql默认预编译关闭,需要开启
3、使用.executeQuery(sql)使用Statement 查询数据库
@Test
public void fun3() throws Exception {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydb1";
String username = "root";
String password = "123456";
Class.forName(driverClassName);
con = DriverManager.getConnection(url, username, password);
stmt = con.createStatement();
String sql = "select * from stu";
rs = stmt.executeQuery(sql);
int count = rs.getMetaData().getColumnCount();
while(rs.next()){
for(int i = 1; i <= count; i++){
System.out.print(rs.getString(i));
if(i < count)
System.out.print(", ");
}
System.out.println();
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
}
}
4、使用.executeUpdate(sql)对数据库做增、改、删。
@Test
public void fun1() throws SQLException, ClassNotFoundException {
String driverClassName = "com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/mydb1";
String username = "root"; String
password = "123456";
Class.forName(driverClassName);
Connection con =DriverManager.getConnection(url, username, password);
Statement stmt = con.createStatement();
String sql ="INSERT INTO stu VALUES('0003','WANGWU','23','3')";
String sql2 ="UPDATE stu SET NAME='王五' WHERE NUMBER='0003'";
String sql3 ="DELETE FROM stu";
int r = stmt.executeUpdate(sql);
System.out.println(r);
}
5、Preparedstatement(预编译) 及sql注入案例
public boolean login2(String username, String password)
throws ClassNotFoundException, SQLException {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydb1";
String sqlusername = "root";
String sqlpassword = "123456";
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, sqlusername, sqlpassword);
String sql = "select * from t_user where username=? and password=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
return rs.next();
}
@Test
public void fun2() throws ClassNotFoundException, SQLException{
String username = "zhagnsan";
String password = "123";
boolean bool = login2(username,password);
System.out.println(bool);
}