JDBC基本介绍
获取connection的方式
TIP:把这个选中取消可以让文件夹分层
前置工作:在项目下创建一个文件夹比如libs, 将 mysql.jar 拷贝到该目录下,点击 add as library
在mysql官网上下载连接的jar包_18你磊哥的博客-优快云博客 mysql.jar包下载教程
第一种(操作完整版)
import java.sql.*;
import java.util.Properties;
import com.mysql.cj.jdbc.Driver; //注意引这个 新版有cj
public class Jdbc01{
public static void main(String[] args) throws Exception{
//1.注册驱动
Driver driver = new Driver();
//2.得到连接 (mysql的连接本质就是socket连接)
String url = "jdbc:mysql://localhost:3306/shang_02";
// jdbc:mysql:// 规定好表示协议,通过jdbc的方式连接mysql
// localhost 主机,可以是ip地址
// 3306 表示mysql监听的端口号
// shang_02 连接到mysql的哪个数据库
//3.将用户名和密码放入到Properties对象,用url和properties得到连接
Properties properties = new Properties();
properties.setProperty("user","root"); //用户
properties.setProperty("password","shang"); //密码
Connection connection = driver.connect(url,properties);
//4.执行sql (用statement)
String sql = "insert into t01 values('张三',21)";
Statement statement = connection.createStatement();
int rows = statement.executeUpdate(sql);
//如果是dml语句,返回的就是影响行数
System.out.println(rows>0?"成功":"失败");
//5.关闭连接资源
statement.close();
connection.close();
}
}
第二种
public void connect02() throws Exception{
//使用反射加载Driver类,动态加载,更加灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.cj.jdbc.Driver");
Driver dirver = (Driver)aClass.newInstance();
...//后面就一样了
}
第三种
public void connect03() throws Exception{
//用DriverManager替代Driver
Class<?> aClass = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//创建url,user和password
String url = "jdbc:mysql://localhost:3306/shang_02";
String user = "root";
String password = "shang";
//注册Driver驱动
DriverManager.registerDriver(driver);
Connection connection = DriverManager.getConnection(url,user,password);
}
第四种(第三种的极简版本)
自动完成注册,简化代码
public void connect04() throws Exception{
//Class.forName("import com.mysql.cj.jdbc.Driver");
//创建url,user和password
String url = "jdbc:mysql://localhost:3306/shang_02";
String user = "root";
String password = "shang";
Connection connection = DriverManager.getConnection(url,user,password);
System.out.println(connection);
}
注:1. 调用DriverManager的getConnection方法,直接获取连接,不用生成Driver。
2. 并且mysql驱动5.1.6可以无需Class.forName("..."),但还是建议写上,更加明确。
3. register那句代码省略,因为Driver类在加载时,它源码的静态代码块已经注册过DriverManager了
第五种
增加配置文件,让连接mysql更加灵活
注意:都不加双引号!
public void connect05() throws Exception{
//通过Properties对象获取配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("D:\\JavaProject\\Hello\\src\\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driver");
Class.forName(driver); //建议写上
Connection connection = DriverManager.getConnection(url,user,password);
System.out.println(connection);
}
ResultSet 结果集
... //获取connection的五种方法
//得到statement
Statement statement = connection.createStatement();
//sql指令
String sql = "select * from t01";
//获取resultSet
ResultSet resultSet = statement.executeQuery(sql);
//使用while取出数据
while(resultSet.next()) { //让光标向后移动,如果没有更多行,则返回false
String name = resultSet.getString(1); //获取该行第一列
int age = resultSet.getInt(2); //获取该行第二列
System.out.println(name + "\t" + age);
}
//关闭连接
connection.close();
statement.close();
resultSet.close();
Statement
SQL注入
输入用户名为 1' OR
输入密码为 OR '1' = '1
SELECT *
FROM admin
WHERE NAME = '1' OR ' AND pwd = ' OR '1' = '1'
最终机器会执行为 : WHERE NAME = '1' OR ' AND pwd = ' OR '1' = '1' 也即中间有两个OR
但是 '1' = '1' 是绝对正确的,因此会恶意攻击数据库
PreparedStatement
public static void main(String[] args) throws Exception{
Scanner scanner = new Scanner(System.in);
System.out.print("请输入管理员的名字:");
String admin_name = scanner.nextLine(); //next遇到空格会结束
System.out.println("请输入管理员的密码:");
String admin_pwd = scanner.nextLine();
...//获取connection
//得到PreparedStatement
//1. 组织SQL,?相当于占位符
String sql = "select name,pwd from admin where name =? and pwd =?";
//2. 获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//3. 给?赋值
preparedStatement.setString(1,admin_name);//第一个问号
preparedStatement.setString(2,admin_pwd);
//4. 执行select语句使用 executeQuery dml语句用 executeUpdate
ResultSet resultSet = preparedStatement.executeQuery(sql);
...//while循环查看
}
dml语句: