-0----------------------demo1------------
package DAY02;
/**
* 登入
*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
import day01.DBUtil;
public class demo1 {
public static void main(String[] args) {
Connection conn=null;
try {
Scanner scanner=new Scanner(System.in);
System.out.println("欢迎登陆");
System.out.println("请输入用户名:");
String username=scanner.nextLine();
System.out.println("请输入密码:");
String password=scanner.nextLine();
conn=DBUtil.getConnection();
Statement state=conn.createStatement();
String sql="SELECT id,username,account,email "
+ "FROM userinfo "
+ "WHERE username='"+username+"' AND password='"+password+"'";
/**
* 1' OR '1'='1
*/
ResultSet rs=state.executeQuery(sql);
if(rs.next()) {
int account=rs.getInt("account");
System.out.println("欢迎您:"+username+","+"账户余额"+account);
}else {
System.out.println("用户名或者密码不正确");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
------------------------------------demo2-------------------------------------------------------------
package DAY02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
import day01.DBUtil;
/**
* Statement通常用来执行静态SQL语句。
* 静态SQL;SQL内容不含有任何动态信息
*
* Statement执行费静态SQL有两个问题:
* 1.若SQL语句是动态拼接的,那么或造成SQL注入攻击,
* 2.若仅是数值变化,而SQL语句并没有变化,批量执行多条SQL语句对数据库性能开销大
* @author Ward
*
*PrepareStatement
*专门用来执行含有动态内容的SQL语句。
*解决了Statement执行动态SQL的两个不足。
*
*PrepareStatement执行的是预编译SQL,将动态信息以"?"的形式占位。
*数据库在接受预编译SQL后,会生成执行计划。我们接下来的工作就是传入动态信息即可
*多次执行也无非就是多次传入动态信息,但是可以重用同一个执行计划了,
*就好像JAVA程序中定义方法,动态信息被定义为参数,
*多次调用方法传入不同参数即可,但是方法不用每次都重新定义
*
*/
public class demo2 {
public static void main(String[] args) {
Connection conn=null;
try {
conn=DBUtil.getConnection();
String sql="SELECT id,username,account,email "
+ "FROM userinfo "
+ "WHERE username=? AND password=? ";
/**1' OR '1'='1
* 在创建PS的同时需要将预编译SQL语句传入,
* 并通过Connection传递给数据库了,这时候数据库会将执行计划生成
* ,但是并不会执行该计划,因为语义虽然确定,但是还缺少具体的数据。
*/
PreparedStatement ps= conn.prepareStatement(sql);
ps.setString(1, "jack");
ps.setString(2, "1' OR '1'='1");
ResultSet rs=ps.executeQuery();
if(rs.next()) {
int account=rs.getInt("account");
System.out.println("欢迎您,您的余额为"+account);
}else {
System.out.println("用户名或密码错误");
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.closeConnection();
}
}
}
-----------------demo3------------------------------------------
package DAY02;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.ResultSetMetaData;
import day01.DBUtil;
/**
* 查看结果集元数据 结果集除了可以查看查询的内容外,也可以查看结果集自身的元数据,如 查询到多少个字段,字段叫什么名字等信息
*
* @author Ward
*
*/
public class demo6 {
public static void main(String[] args) {
Connection conn = null;
try {
conn = DBUtil.getConnection();
Statement state=conn.createStatement();
String sql="SELECT * FROM userinfo";
ResultSet rs=state.executeQuery(sql);
//获取结果集元数据对象
ResultSetMetaData rsmd= rs.getMetaData();
//获取结果集查询的字段数
int colCount=rsmd.getColumnCount();
System.out.println("总工查询了:"+colCount+"个字段");
//查看每个字段的名字
for(int i=1;i<=colCount;i++) {
String colName=rsmd.getColumnName(i);
System.out.println(colName);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection();
}
}
}