Java连接MySQL数据库

  • Post author:
  • Post category:java

数据库DataBase,简称DB。

        按照一定的格式存储数据的一些文件的组合。

        顾名思义,存储数据的仓库。实际上就是一些文件,文件中存储了具有特定格式的数据。

数据库管理系统DataBaseManagement,简称DBMS。

        专门用来管理数据库中的数据。数据库管理系统可以对数据库中的数据进行增删改查。

        常见的数据库管理系统:Mysql、Oracle、MS、SqlServer、DB2

SQL:结构化查询语言

程序员编写SQL语句,DBMS执行语句,最终完成数据库路中数据的增删改查。

即:DBMS –执行–> SQL语句 –操作–> 数据库DB

MySql具有默认端口号:3306

        端口号port:任何一个软件(应用)都会有的。端口号是应用的唯一代表。

        端口号和IP地址在一块。IP地址用来定位计算机,而端口号用来定位计算机上的某个服务。

        在同一台计算机上,端口号不能重复,具有唯一性。

数据库中存储数据最基本的单位就是表。任何一张表都有行、列。行被称为数据、列被称为字段。

SQL语句的分类:

        DQL:数据查询语言,对数据进行查询:select

        DML:数据操作语言,对数据进行增删改:insert、delete、update

        DDL:数据定义语言,对数据进行定义:create、drop、alter

        TCL:事务控制语言,包括事务提交commit、事务回滚rollback

        DCL:数据控制语言,包括授予权限grant、撤销权限revoke

MySQL服务监听3306端口,因此客户端应该去连接3306端口。

连接Mysql的指令:mysql -h 主机IP -P 端口 -u 用户名 -p密码

        -p密码中间没有空格

        如果不写-h、-P,默认会是主机的3306端口

        实际工作中,大多不用3306端口号作为Mysql的端口号,因为很容易被攻击。

JDBC:为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。

        Java程序使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统·,从而操作数据库。

JDBC原理示意:

        Java程序如果想要操作不同的数据库,方法不统一,不利于整个程序的管理。

        因此改进:规定一套接口规范,让不同的数据库厂商实现,Java程序中统一调用接口的方法

即:Mysql、Oracle、DB2、SQL Server等等DBMS实现接口【驱动程序jar文件】

        Java程序中调用接口中的方法完成数据库的连接

利用JDBC完成对数据库的操作:

1.在项目下创建lib文件夹,将mysql.jar包拷贝到文件中,并add to project加入到项目中

2.注册驱动

// 创建Driver对象
Driver driver = new Driver();

3.得到连接

String url = "jdbc:mysql://127.0.0.1:3306/db01";
    // jdbc:mysql://  :表示规定好协议,按照jdbc的方式连接到mysql数据库
    // 127.0.0.1  :主机,也可以是localhost,表示连接ip地址
    // 3306  :表示监听3306端口
    // db01  :表示连接到db01数据库
// 将数据库的用户名、密码放在properties对象中
Properties properties = new Properties();
    // 其中,“user”、“password”是规定好的,后面的value值根据实际填写即可。
properties.setProperty("user", "root"); // 用户名
properties.setProperty("password", "kxg"); // 密码
// 建立连接
Connection connection = driver.connect(url, properties);

4.执行SQL语句

String sql = "insert into actor values(1, 'jack', '男', '1970-1-1', '110');
// Statement对象:用于执行静态的SQL语句并返回其生成的结果对象
Statement statement = connect.createStatement();
    // 如果是DML语句,则返回影响的行数。即statement中存放的是执行语句数据库中受影响的行数
int rows = statement.executeUpdate(sql);
    // 通过rows判断是否执行成功
System.out.println(rows > 0 ? "成功" : "失败");

5.关闭资源

statement.close();
connect.close();

优化:        

        1.可以将数据库的相关信息写入properties配置文件中,通过配置文件读取信息

        2.注册驱动时,通过反射获得类对象,newInstance()获得Driver实例

        3.通过DriverManger代替Driver进行统一管理

// 相关properties配置文件:
user=root
password=kxg
url=jdbc:mysql://localhost:3306/db01
driver=com.mysql.cj.jdbc.Driver
// 连接数据库
    // 通过properties对象读取配置文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("src//mysql.properties"));
    // 获取配置文件中的相关值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
    // 利用反射加载driver类
Class.forName(driver);
    // DriverManger创建连接
Connection connection = DriverManger.getConnection(url, user, password);
    // 创建statement对象
Statement statement = connection.createStatement();
    // 编写SQL语句
String sql = "CREATE TABLE NEWS(id INT AUTO_INCREMENT, content VARCHAR(255), primary key(id));";
    // 执行SQL语句
statement.executeUpdate(sql);
    // 关闭连接
statement.close();
connect.close();

介绍JDBC中常用的接口、类及其中的方法:

DriverManger:驱动管理类

        getConnection(url, user, password):获取与数据库的连接

Connection接口:

        createStatement():创建Statement对象

        PreparedStatement(sql):生成预处理对象

Statement接口:

        executeUpdate(sql):执行DML(update、insert、delete)语句,返回受到影响的行数

        executeQuery(sql):执行查询(select)语句,返回ResultSet对象

        execute(sql):执行任意SQL语句,返回布尔值

// 演示SQL注入
// 用户通过输入用户名、密码进行登录
Scanner scanner = new Scanner(System.in);
String name = "";
String pwd = "";
System.out.print("请输入用户名:");
name = scanner.nextLine();
System.out.print("请输入密码:");
pwd = scanner.nextLine();
// 建立与mysql的连接
Properties properties = new Properties();
properties.load(new FileInputStream("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);
Statement statement = connection.createStatement();
String sql = "select * from admin where name = '" + name + "' and password = '" + pwd + "';";
// 执行SQL语句
ResultSet resultSet = statement.executeQuery(sql);
// 关闭资源
resultSet.close();
statement.close();
connection.close();

// 用户在进行登录时,输入数据库中已经存在的用户名、密码,显示登录成功
// 但是如果用户输入用户名输入的是:"1' or",而密码输入的是"or '1' = '1"时,也可登录成功
// 这就是SQL注入,同时 or '1' = '1 也被称为万能密码。

PreparedStatement接口:

        executeUpdate(sql):执行DML(update、insert、delete)语句,返回受到影响的行数

        executeQuery(sql):执行查询(select)语句,返回resultSet对象

        execute(sql):执行任何SQL语句,返回布尔值

        setObject(占位符索引, 占位符的值):解决SQL注入的问题

// prepareStatement:预处理,可以解决statement中的SQL注入问题
Scanner scanner = new Scanner(System.in);
String name = "";
String pwd = "";
System.out.print("请输入用户名:");
name = scanner.nextLine();
System.out.print("请输入密码:");
pwd = scanner.nextLine();
// 获取相关值
Properties properties = new Properties();
properties.load(new FileInputStream("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);
// 组织SQL语句
String sql = "select * from admin where name = ? and password = ?;"; // ?:相当于占位符
// 创建prepareStatement对象,并且与SQL语句建立连接
PreparedStatement preparedStatement = connection.preparedStatement(sql);
// 赋值操作
preparedStatement.setString(1, name); // sql语句中第一个?补成name
preparedStatement.setString(2, pwd);  // SQL语句中第二个?补成pwd
// 接收结果集
ResultSet resultSet = preparedStatement.executeQuery();
// 关闭连接
resultSet.close();
preparedStatement.close();
connection.close();

ResultSet结果集:

        (光标一开始指向的是表格的最上面-第一行的上面(表头))

        next():光标向下移动一行,如果没有下一行,返回false

        previous():光标向上移动一行

        getObject(列的索引/列名):返回对应列的值,接收类型为object

// 通过ResultSet遍历表中的数据
    // resultSet.next():光标向后移动,如果没有下一行,则直接返回false
while (resultSet.next()) { 
    // 得到每一行的数据
    int id = resultSet.getInt(1);
    String name = resultSet.getString(2);
    String sex = resultSet.getString(3);
    String birth = resultSet.getString(4);
    String phone = resultSet.getString(5);
    System.out.println(id + "\t" + name + "\t" + sex + "\t" + birth + "\t" + phone);
}

版权声明:本文为m0_63404275原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。