数据库

xiaoxiao2021-02-28  111

1.外键的作用:约束两张表的 分为主表和副表,外键设置在副表中 CREATE TABLE employee( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), deptId INT, CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) --             外键名称                 外键字段  参考(关联)           ) 2.外键起作用的时间: 当副表插入了主表不存在的数据时 当主表删除了副表正在使用的数据时 当副表修改为主表不存在的数据时 有了外键后: 插入数据先插入主表在插入副表              修改数据,先修改主表,在修改副表 3.有了级联技术后,直接修改主表或删除主表就能直接影响副表 CREATE TABLE employee( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), deptId INT, -- 添加级联修改: ON UPDATE CASCADE -- 添加级联删除: ON DELETE CASCADE  CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE              外键名称                  外键字段    参考 CASCADE ON DELETE CASCADE                           ) 4.内连接查询 SELECT e.name,d.name FROM employee e,dept d WHERE e.deptId=d.id; -- 另一种语法 SELECT e.name,d.name FROM employee e INNER JOIN dept d ON e.deptId=d.id; 5.一个存储过程的标准形式 Delimiter $ create procedure 执行这个过程的方法名(参数) begin sql语句 end$ 调用一个存储过程 call 方法名(参数); 一 .JAVA程序连接数据库步骤:     1.mysql数据库的主机地址端口号(url = "jdbc:mysql://localhost:3306/day20") jdbc协议:mysql协议://主机地址:端口号/需要连接的数据库名称     2.用户名(user = "root")     3.密码(password = "123456")     4.连接数据库     第4点的连接数据库又分为两步:       1.这册驱动       Class.forName("com.mysql.jdbc.Driver");       2.获取java连接对数据库的对象(Connection)       Connection conn = DriverManager.getConnection(url, user, password);   (create/alter/drop) DDL语句     (insert/update/delete)DML语句         (select)DQL语句     执行DDL和DML语句都用的是stmt.executeUpdate(String sql)     执行DDL返回0,执行DML返回执行当前操作数     执行DQL要使用stmt.executeQuery(String sql),返回ResultSet对象    Connection相当于一个通道连接起了java程序和数据库,但要想执行sql语序    还需要一个执行对象,那么这个对象就是Statement       int executeUpdate(String sql)throws SQLException 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)返回值为0;      用java写sql语句并执行分为几步?       1.注册驱动 2.通过管理驱动类获取连接 conn = DriverManager.getConnection(url, user, password);   3.创建执行sql语句的对象   stmt = conn.createStatement(); 4.创建sql语句 5.执行sql语句()   int count = stmt.executeUpdate(sql); 6.释放资源  工具类的抽取:将1放在静态代码块中,将23封装成静态的方法        以后就可以直接通过这个工具类的类名直接调用了 1.注册驱动 :Class.forName(className); 2.获取连接: Connection conn = DriverManager.getConnection(url, user, password);   3.释放资源      while(rs.next()){ System.out.println(rs.getInt("id")+"--"+rs.getString ("name")+"--"+rs.getString("age")); }           在查询数据时最好用列名称,这样可以提高程序的维护性   因为表的列名称一旦改变或者增加了某列,我们只需要修 改查询的名称就好,而根据列号则无法判断查询的是什么数据          列的索引编号这种方式高效但不利于维护 列名则不那么高效但利于维护 使用PreparedStatement执行sql语句:进行预编译 PreparedStatement stmt = null; String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)";  /** * 参数一: 参数位置。从1开始 * 参数二: 参数实际值 * 注意: 所有参数必须要赋值 */ stmt.setString(1, "rose");          set后面跟的是第二个参数的类型 一、语法结构不同 1)Statment执行静态sql语句,且sql可以拼接。 2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面 在进行参数赋值 二、原理不同 1)Statement不能进行sql缓存 2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!! 三、安全性不同 1)Statement存在sql注入的风险(使用登录注册讲解sql注入) 2)而PreparedStatement可以有效防止用户注入。 注入:对于字符的过滤不严造成的问题,可能存在恒成立这种满足一切要求的指令,这时就需要考虑安全性,所以使用PreparedStatement,自己设置传参值
转载请注明原文地址: https://www.6miu.com/read-64457.html

最新回复(0)