DBMS里有多个数据库,每个库中又有多张表。
客户端有命令终端(DoS)、SQLyog、Java等。
Mysql数据库、普通表的本质仍然是文件。
表的一行称为一条记录,对应Java中的一个对象。
SQL语句的分类为
1、DDL数据定义语言 create 表、库
2、DML 数据操作语言 insert、delete、update
3、DQL 数据查询语言 select
4、DCL 数据控制语言 管理数据库 grant revoke(撤销权限)
备份数据库
备份数据库命令行为:在DoS中执行
mysqldump -u 用户名 -p -B数据库1 数据库2 数据库n > 文件名.sql
恢复数据库:需要进入MySQL命令行再执行
Source 文件名.sql(路径名) 例如D:\\back.sql
备份数据库中的表
mysqldump -u 用户名 -p -数据库 表1 表n > 文件名.sql(路径 例如:D:\\back.sql)
JDBC
JDBC是为了访问不同数据库提供了统一的接口,Java程序员可以使用JDBC连接任何提供了JDBC驱动程序的数据库系统,完成对数据库的操作。不同的数据库厂商编写不同的实现类。这些实现类也叫做数据驱动jar包。
java程序不直接操作数据库,只跟JDBC接口编程。不同的数据库厂商针对这些接口,实现不同的需求。相关类的接口主要在java.sql和javax.sql包中。
JDBC程序编写的步骤是
1、注册驱动 加载Driver类
2、获取连接 得到Connection
3、执行增删改查 发送SQL命令,给MySQL执行。
4、释放资源 关闭相关连接。
前置工作
首先需要在项目路径下,新建libs文件夹,用于存放jar包,然后右击jar包,选择最后一个选项。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class JDBC_02 {// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/demo";static final String USER = "root";static final String PASS = "123456";public static void main(String[] args) throws Exception{Class.forName(JDBC_DRIVER);//注册驱动 mysql5之后的驱动jar包可以省略这个步骤 Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);String sql = "insert into actor values(null,'刘德华','男','1970-11-11','110')";Statement statement = conn.createStatement();int i = statement.executeUpdate(sql);//i表示 如果是DML语句,则为影响的行数if (i>0){System.out.println("添加成功");}else {System.out.println("添加失败");}//关闭连接statement.close();conn.close();}
}
- DriverManager数据库驱动管理对象 有两个功能1、注册驱动 2、获取数据库连接。
- Connection数据库连接对象 1、获取执行sql的statement对象 2、管理事务
开启事务 setAutoCommit 调用该方法,设置参数为false,即开启事务。
提交事务 commit方法
回滚事务 rollback方法 - Statement执行sql的对象 方法 execute()方法 执行任意sql语句,不常用。 executeUpdate()执行DML语句、DDL语句,执行DML语句返回一个int值,表示影响的行数。(常用于判断DML语句是否执行成功,大于0则成功)。 executeQuery()执行DQL查询语句,返回一个结果集对象。
import java.sql.*;
import java.sql.DriverManager;public class JDBC_01 {// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/demo";static final String USER = "root";static final String PASS = "123456";public static void main(String[] args) {Statement stmt = null;//提升作用域Connection conn = null;//提升作用域try {Class.forName(JDBC_DRIVER);try {conn = DriverManager.getConnection(DB_URL,USER,PASS);String sql = "insert into actor values(null,'Mary','女','1999-11-11','220')";stmt = conn.createStatement();int i = stmt.executeUpdate(sql);//影响的的行数if (i>0){System.out.println("添加成功");}else {System.out.println("添加失败");}} catch (SQLException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}finally {if (stmt != null){//防止空指针异常try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
- ResultSet结果集对象
next()游标向下移动一行。默认为表头行。返回一个bool值,判断当前行是否为最后一行末尾。如果是末尾,则返回false。
getXxx(参数)为获取数据,Xxx为数据类型例如int、String等。参数可以为int,代表列的编号,从1开始,也可以为String,列的名称
import java.sql.*;
import java.sql.DriverManager;public class JDBC_03 {// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/demo";static final String USER = "root";static final String PASS = "123456";public static void main(String[] args) {Statement stmt = null;//提升作用域Connection conn = null;//提升作用域ResultSet resultSet = null;try {Class.forName(JDBC_DRIVER);try {conn = DriverManager.getConnection(DB_URL,USER,PASS);String sql = "select * from actor";stmt = conn.createStatement();resultSet = stmt.executeQuery(sql);while (resultSet.next()){int anInt = resultSet.getInt(1);String string = resultSet.getString(2);System.out.println(anInt+" "+string);}} catch (SQLException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}finally {if (resultSet != null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
案例:查询表中的数据,然后将其封装成对象(使用hashMap),返回。
import java.sql.*;
import java.sql.DriverManager;
import java.util.HashMap;public class JDBC_03 {// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/demo";static final String USER = "root";static final String PASS = "123456";public static void main(String[] args) {Statement stmt = null;//提升作用域Connection conn = null;//提升作用域ResultSet resultSet = null;try {Class.forName(JDBC_DRIVER);try {conn = DriverManager.getConnection(DB_URL,USER,PASS);String sql = "select * from demo1";stmt = conn.createStatement();resultSet = stmt.executeQuery(sql);HashMap hashMap = new HashMap();while (resultSet.next()){int anInt = resultSet.getInt(1);String string = resultSet.getString(2);hashMap.put(anInt,string);}System.out.println(hashMap);} catch (SQLException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}finally {if (resultSet != null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
抽取JDBC工具类JDBCUtils,作用减少代码的冗余度。
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;static {//静态代码块,随着类的加载只执行一次,实现文件的读取操作。Properties pro = new Properties();try {pro.load(new FileReader("src/jdbc.properties"));url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}//获取连接的工具包public static Connection getConnection() throws Exception{//不传递参数,使用配置文件的方法来解决。return DriverManager.getConnection(url,user,password);}//释放资源的方法public static void close(Statement stmt, Connection conn){if (stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}//方法的重载public static void close(Statement stmt, Connection conn, ResultSet res){if (stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if (res != null){try {res.close();} catch (SQLException e) {e.printStackTrace();}}}
}
import java.sql.*;
import java.sql.DriverManager;
import java.util.HashMap;public class JDBC_04 {// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";static final String DB_URL = "jdbc:mysql://localhost:3306/demo";static final String USER = "root";static final String PASS = "123456";public static void main(String[] args) {Statement stmt = null;//提升作用域Connection conn = null;//提升作用域ResultSet resultSet = null;try {try {conn = JDBCUtils.getConnection();String sql = "select * from demo1";stmt = conn.createStatement();resultSet = stmt.executeQuery(sql);HashMap hashMap = new HashMap();while (resultSet.next()){int anInt = resultSet.getInt(1);String string = resultSet.getString(2);hashMap.put(anInt,string);}System.out.println(hashMap);} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}} finally {JDBCUtils.close(stmt, conn, resultSet);}}
}
案例:键盘录入用户名和密码,判断用户是否登录成功
java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;public class JDBC_05 {public static void main(String[] args) {Statement stmt = null;Connection conn = null;ResultSet res = null;try {conn = JDBCUtils.getConnection();stmt = conn.createStatement();Scanner scanner = new Scanner(System.in);String name = scanner.next();int pwd = scanner.nextInt();String sql = "select * from my_class where name = '"+name+"'and id = '"+pwd+"' ";res = stmt.executeQuery(sql);if (res.next()){System.out.println("登陆成功");}else {System.out.println("登陆失败");}} catch (Exception e) {e.printStackTrace();}finally {JDBCUtils.close(stmt,conn,res);}}
}
- PreparedStatement
sql注入问题:在拼接sql时,有一些sql的特殊关键字(and、or)参与字符串的拼接,会造成安全性问题。解决的方法是使用PreparedStatement对象。
预编译的sql:参数使用?作为占位符。