day30、外键、联查
mysql> create table emp (
-> emp_id int primary key auto_increment,
-> emp_name varchar(32) ,
-> dept_id int,
-> reg_time timestamp default current_timestamp,
#constraint 约束的意思
#fk_emp_dept 外键的名字 随意起
#foreign key(dept_id) 外键 使用本表中的一个字段作为外键去和别的表产生关系
#references 关联 引用的意思,去关联主表里面的某一个字段(外键所在的表叫副表)
-> constraint fk_emp_dept foreign key(dept_id) references dept(dept_id)
-> );
#级联修改 和级联删除
mysql> create table emp (
-> emp_id int primary key auto_increment,
-> emp_name varchar(32) ,
-> dept_id int,
-> reg_time timestamp default current_timestamp,
-> constraint fk_emp_dept foreign key(dept_id) references dept(dept_id)
#加的两个状态
-> on delete cascade
-> on update cascade
-> );
inner join
left join
right join
mysql> select emp.emp_name, dept.dept_name
-> from emp
-> inner join dept
-> on emp.dept_id = dept.dept_id
-> where emp.emp_name = "erjia";
DDL database defined Language 数据库定义语言 建表 建库 等
DML 数据库操作语言 增删改
DQL 数据库查询语言 查询
DCL 数据库控制语言 权限
DTL 数据库事务语言 事务
day31、JDBC
下载jar包
1.百度 https://mvnrepository.com/
2.在搜索框中输入mysql
3.找到版本 5.1.47 版本jar包点进去
下好jar包之后,将jar包导入自己的工程
1.在src文件夹下面新建一个lib文件
2.将下载好的jar包复制到lib文件夹下面
3.右键jar包,add as Libaray... 即可
初步使用,创建与数据库的链接,代码如下
package com.qf.a_mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载mysql的驱动
//Driver驱动是mysql厂商提供的
Class.forName("com.mysql.jdbc.Driver");
//连接数据库的时候需要
//主机: 是一个url jdbc:mysql://localhost:3306/java2304
//用户名: root
//密码: 123456
//2.准备连接数据库的一些参数
String url = "jdbc:mysql://localhost:3306/java2304?useSSL=false";
String user = "root";
String password = "******";
//static Connection getConnection(String url, String user, String password)
//3.尝试建立与给定数据库URL的连接。
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
//Connection 与特定数据库的连接(会话) 执行SQL语句并在连接的上下文中返回结果
//4.关闭连接的资源
connection.close();
}
}
1、对数据库添加、删除、修改
Class.forName("com.mysql.jdbc.Driver");//加载驱动
String url = "jdbc:mysql://localhost:3306/库名?useSSL=false";
String user = "root";
String password = "******";
//创建与数据库的链接
Connection connection = DriverManager.getConnectioin(url, user, password);
//创建搬运工对象
Statement statement = connection.createStatement();
//准备sql
String sql = "insert into person (name, age, info) values ("校长", 23, "信息")";
//执行sql语句
int i = statement.executeUpdate(sql);
//返回受影响行数
//关闭资源
statement.close();
connection.close();
2、查询
Class.forName("com.mysql.jdbc.Driver");//加载驱动
//准备连接数据库的数据
String url = "jdbc:mysql://localhost:3306/库名?useSSL=false";
String user = "root";
String password = "******";
//创建与数据库的链接
Connection connection = DriverManager.getConnectioin(url, user, password);
//创建搬运工对象
Statement statement = connection.createStatement();
//准备sql
String sql = "select * from person";
//执行sql语句,获得结果集对象
ResultSet resultSet = statement.executeQuery(sql);
//对结果集进行操作,取得数据信息
while(resultSet.next()){
//通过字段名字,获取当前字段的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
}
//关闭资源
result.close();
statement.close();
connection.close();
day32、预处理搬运工对象、封装工具类、BeanUtils类、元数据
1、预处理搬运工对象,添加,删除,修改(executeUpdate)
//预处理搬运工对象,支持参数化sql
//参数化sql:insert into person (name,age, info) values (?,?,?);
Class.forName("com.mysql.jdbc.Driver");//加载驱动
//准备连接数据库的数据
String url = "jdbc:mysql://localhost:3306/库名?useSSL=false";
String user = "root";
String password = "******";
//创建与数据库的链接
Connection connection = DriverManager.getConnectioin(url, user, password);
//参数化的sql
String sql = "insert into person (name,age, info) values (?,?,?);"
//获取预处理搬运工对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给sql参数赋值
preparedStatement.setObject(1, "波波");
//参数的含义,给第一个问号,传参为 波波
preparedStatement.setObject(2, 23);
preparedStatement.setObject(3, "一些信息");
//执行sql
int i = preparedStatement.executeUpdate();
//返回受影响的函数\
//关闭资源
preparedStatement.close();
connection.close();
预处理的查询,除了赋值操作之外,别的和之前一样
2、封装工具类
封装两件事
1、获取connection对象
2、关闭资源
数据库的参数信息,可以放到配置文件中,让java去读取配置文件。
步骤:
1.在src文件夹下面新建一个叫 db.properties
2.在 db.properties 去写连接数据库的参数 以键值对的数据
驱动
url
user
password
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2304?useSSL=false
user=root
password=123456
封装:
public class JdbcUtil {
private static String url = null;
private static String user =null;
private static String password = null;
static {
try {
//只要JdbcUtil类加载了,就会执行静态代码块中的代码
//读取配置文件中的信息:properties文件
//Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。
// 属性列表中的每个键及其对应的值都是一个字符串。
Properties properties = new Properties();
properties.load(new FileInputStream("src/db.properties"));
//数据都在properties 对象中
String diver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(diver);
} catch (Exception e) {
e.printStackTrace();
}
}
//返回一个connection对象的方法
public static Connection getConnection () {
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//关闭资源
//增删改 需要关闭两个 查 关闭三个
public static void close (Connection connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close (Statement statement, Connection connection) {
try {
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close (ResultSet resultSet, Statement statement, Connection connection) {
try {
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3、sql注入
使用sql时,会有漏洞
delete from emp where id = 6 or 1=1
一旦or 1=1 ,前面的条件就没有用了
搬运工对象Statement是无法防止sql注入的
预处理搬运工对象PreparedStatement,可以防止sql注入
4、JavaBean规范
写实体类时,要注意的一些规范
1.私有化成员变量
2.一定要提供一个无参构造方法
3.一定要提供set和get方法
4.每个类都要单独成为一个文件
5、BeanUtils类
是第三方提供的一个类
BeanUtils类是动态的对属性赋值和取值的
使用BeanUtils类需下载两个jar包:beanutils和logging
//setProperty 设置属性
//第一个参数: Object bean 属性所在的类对象
//第二个参数: String name 属性的名字
//第三个参数: Object value 属性的值
// static void setProperty(Object bean, String name, Object value)
BeanUtils.setProperty(work, "name", "大黄");
//getProperty 获取属性
//static String getProperty(Object bean, String name)
String name = BeanUtils.getProperty(work, "name");
6、元数据
MetaData
1、关于sql参数的元数据
String sql = "insert into work (name, age, info) values(?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//借助于搬运工对象,获取参数元数据对象
ParameterMetaData prameterMetaData = preparedStatement.getParameterMetaData();
//得到参数的个数
int count = prameterMetaData.getParameterCount();
//对参数赋值
Object[] objs = {"小张", 12, "一些信息"};
for (int i = 1; i <= parameterCount; i++) {
preparedStatement.setObject(i, objs[i - 1]);
}
2、关于结果集(ResultSet)的元数据
//查询结果的结果集
ResultSet resultSet = preparedStatement.executeQuery();
//通过结果集,对获取结果集元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取字段个数,再通过个数获取字段名
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount ; i++) {
String columnName = metaData.getColumnName(i);
}
//通过字段名和元数据,取出结果集中的数据
while (resultSet.next()){
for (int i = 1; i <= columnCount ; i++) {
String columnName = metaData.getColumnName(i);
Object obj = resultSet.getObject(columnName);
}
}