Java学习之路-第七周小结-上

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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值