Day37
基础知识
DriverManger驱动管理类
registerDriver(Driver对象) : 注册驱动,不推荐使用
Connection连接对象接口
createStatement() : 生成命令对象
preparedStatement(sql) : 生成预编译命令对象
Statement命令对象接口
executeUpdate(sql):执行增删改语句,返回受到影响的行数
executeQuery(sql):执行查询语句,返回结果集
execute(sql): 执行任意语句,返回boolean
PreparedStatement预编译命令对象接口
executeUpdate(sql):执行增删改语句,返回受到影响的行数
executeQuery(sql):执行查询语句,返回结果集
execute(sql): 执行任意语句,返回boolean
setXX(占位符索引,占位符的值):设置对应索引的占位符的值,类型为xx类型.
setObject(占位符索引,占位符的值):设置对应索引的占位符的值,类型为Object类型.
ResultSet结果集对象接口
next() : 下移一行, 返回当前行是否有值
previous() : 上移一行, 返回当前行是否有值
getXX(列索引| 列名 | 别名 ):返回对应列的值,接受类型为XX
getObject(列索引| 列名 | 别名 ):返回对应列的值,接受类型为Object
用java连接数据库的步骤
1.加载驱动
2.获取连接
3.执行sql语句
4.获取执行sql命令的对象
5.执行sql语句,返回一个结果集
6.关闭资源
PreparedStatement 和 Statement的区别
关系: PreparedStatement 和 Statement 都属于执行sql语句的命令接口,都提供了一系列执行sql语句的犯法
PreparedStatement继承了 Statement
区别:
-
1.不再使用+拼接sql语句,减少语法错误,语义性强
-
2.将模板sql(固定的部分)和参数部分进行分离,提高了维护性
-
3.有效解决了sql注入问题.
-
4.大大减少了编译次数,效率较高.
例如: 10条sql语句,仅仅知识参数不同
使用Statement , 则需要编译10 次. 执行10次
使用PreparedStatement ,则只需要编译1 次, 执行10次(预编译了.所以只需要编译一次,就可以不用再编译了.)
从这个角度说明PreparedStatement,它效率高.
使用Statement
package com.sorrymaker.test04;
import com.mysql.jdbc.Driver;
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
public class Test04 {
public static void main(String[] args) throws Exception {
Properties info = new Properties();
info.load(new FileInputStream("src\\jdbc.properties"));
String user = info.getProperty("user");
String password = info.getProperty("password");
String url = info.getProperty("url");
String driver = info.getProperty("driver");
//1.加载驱动
Class.forName(driver);
//2.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.执行增删改查
String sql = "select id,name,sex,borndate from beauty";
//获取执行sql的命令对象
Statement statement = connection.createStatement();
//执行sql语句,返回一个结果集.
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String sex = resultSet.getString("sex");
Date borndate = resultSet.getDate("borndate");
System.out.println(id + "\t" + name + "\t" + sex + "\t" + borndate);
}
}
}
使用prepareStatement
package com.sorrymaker.test05;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;
import java.util.Set;
/**
* @author 喜
* 使用PreparedStatement的好处
* 1.不再使用+拼接sql语句,减少语法错误,语义性强
* 2.将模板sql(固定的部分)和参数部分进行分离,提高了维护性
* 3.有效解决了sql注入问题.
* 4.大大减少了编译次数,效率较高.
*
*/
public class TestPrepareStatement {
//使用PreparedStatement实现登录
// @Test
// public void testStatement() throws Exception {
public static void main(String[] args) throws Exception{
Scanner input =new Scanner(System.in);
System.out.print("输入 username:");
String username = input.next();
System.out.print("输入 password:");
String pwd = input.next();
//-----以下为连接数据库的步骤
Properties info =new Properties();
info.load(new FileInputStream("src\\jdbc.properties"));
String user = info.getProperty("user");
String password = info.getProperty("password");
String driver = info.getProperty("driver");
String url = info.getProperty("url");
//1.注册驱动
Class.forName(driver);
//2.获取连接
Connection connection = DriverManager.getConnection(url, user, password);
//3.执行查询
//3-1.编写sql语句
String sql ="select count(*) from admin where username=? and password = ?";
//3-2.获取preparedStatement对象
PreparedStatement statement = connection.prepareStatement(sql);
//3-3.设置占位符
statement.setString(1,username);
statement.setString(2,pwd);
//3-4.执行sql命令
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
int count = resultSet.getInt(1);
System.out.println(count>0?"登录成功":"登录失败");
