数据库

来源:互联网 发布:9月7经济数据 编辑:程序博客网 时间:2024/06/06 12:57
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,自己设置传参值

原创粉丝点击