• day09学习总结


    一、事务

    案例分析:

     概念:

            事务是最小的原子单元,不能再进行拆分 在执行一条或者多条SQL语句的时候 要么都成功,要么都失败

    事务的指令:

    指令描述
    select @@autocommit查询提交方式 默认为1自动提交   0为手动提交
    set @@autocommit设置事务的提交方式(0表示手动提交 1表示自动提交))
    start  transaction开启事务
    rollback回滚
    commit提交事务

    事务执行的原理:

    事务的四大原则:

            A 事务的原子性 事务是最小的原子单位 不能进行再拆分

            C 事务的一致性:事务执行sql语句 要么是同时执行成功 (成功状态) 要么同时执行失败(失败状态)

            I 事务隔离性:每一个事务都是相互隔离的 互不影响

            D事务持久性: 只要commit 提交之后 数据将永久保存到数据中

    二、视图

    概念:

            视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样

    作用:

            简单性:

                    看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用 的查询可以被定 义为视图

            安全性:

                    通过视图用户只能查询和修改他们所能见到的数据。但不能授权到数据库特定行和特定的列上

    创建视图:

            语法:create view 视图名称  as  查询语句

                    CREATE VIEW v_acc AS SELECT aname FROM account

    查看视图:

            语法:select  *  from 视图名称

                    SELECT * FROM v_acc

    修改视图:

            语法:alter  view 视图名称  as 查询语句

                    ALTER VIEW v_acc AS SELECT aname,amoney FROM account

    删除视图:

            语法:drop view 视图名称

                    DROP VIEW v_acc

    三、DCL对用户的管理

    查看用户:

            切入mysql库

            查看用户表

    创建用户:

            语法:create user ‘用户名’@‘主机名’ identified by ‘密码’

                    CREATE USER 'lisi'@'localhost' IDENTIFIED BY '123'

    修改用户密码:

            语法:update user set password=password(新密码) where user=用户名

                    UPDATE USER SET PASSWORD =PASSWORD('456') WHERE USER='lisi'

    删除用户:

            语法:drop user ‘用户名’@‘主机名’

                    DROP USER 'lisi'@'localhost'

    注意点:

            A. mysql中的密码是使用MD5来进行加密

            B.md5加密方式不可逆(只能加密 不能解密) 同一个内容md5 加密都是一样的

            C.网站:https://www.cmd5.com/  

    四、客户端连接数据库

    缺点:

            在实际开发中 开发人员是使用客户端连接数据库 用户使用通过界面来(使用java代码来操作)操作数据 

    五、jdbc操作数据库

    简介:

            jdbc ==> java db connection 使用java来连接数据库 使用java代码来操作数据库

            jdbc是java代码操作数据库的桥梁 主要提供了一些类与接口 主要提供连接数据库的规范

       

    jdbc操作数据库的原理:

            

     

    mysql 驱动包:

    1.mysql-connector-java-5.xx-bin.jar ==>适用于mysql5的版本

    2.mysql-connector-java-8.xx-bin.jar ==>适用于mysql8的版本

    3.下载jar地址:https://mvnrepository.com/artifact/mysql/mysql-connectorjava/8.0.28 

    搭建基础:

            下载对应版本的驱动包jar包,添加到项目的lib目录下,添加依赖即可

    jdbc操作数据库流程:

            A.通过反射加载驱动

            B.获取连接对象

            C.根据连接对象获取执行sql的对象

            D.向数据库发送sql指令

            E.获取结果集

            F.关闭资源

    jdbc操作数据库的增删改:

    1. package com.qf.test.test01;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.SQLException;
    5. import java.sql.Statement;
    6. public class Test01 {
    7. public static void main(String[] args) throws SQLException, ClassNotFoundException {
    8. //通过反射加载驱动
    9. Class.forName("com.mysql.cj.jdbc.Driver");
    10. //获取连接对象
    11. Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/day09?characterEncoding=utf-8",
    12. "root", "123456");
    13. //获取发送指令对象
    14. Statement sta = root.createStatement();
    15. //编写sql语句
    16. String sql = "insert into user(uname,upwd) values('李四','123456')";
    17. //发送指令
    18. int num = sta.executeUpdate(sql);
    19. System.out.println(num);
    20. //关闭资源
    21. sta.close();
    22. root.close();
    23. }
    24. }

    jdbc API:

    常用方法:

     

    jdbc操作数据库的-查询:

            数据表与实体类的关系:

     

            ResultSet方法:

     

    1. package com.qf.test01;
    2. import java.sql.*;
    3. public class Test03 {
    4. public static void main(String[] args) throws SQLException,
    5. ClassNotFoundException {
    6. //加载驱动
    7. Class.forName("com.mysql.jdbc.Driver");
    8. //获取连接对象
    9. Connection con =
    10. DriverManager.getConnection("jdbc:mysql://localhost:3306/day09?
    11. characterEncoding=utf-8", "root", "root");
    12. //获取执行sql对象
    13. Statement sta = con.createStatement();
    14. String sql ="select * from user ";
    15. //发送指令 获取结果集
    16. ResultSet rs = sta.executeQuery(sql);
    17. //使用循环获取数据
    18. while (rs.next()) {
    19. //根据索引获取
    20. // int uid = rs.getInt(1);
    21. // String uname = rs.getString(2);
    22. // String upwd = rs.getString(3);
    23. int uid = rs.getInt("uid");
    24. // String uname = rs.getString("uname");
    25. String upwd = rs.getString("upwd");
    26. System.out.println(uid+"\t"+"uname"+"\t"+upwd);
    27. }
    28. //关闭资源
    29. rs.close();
    30. sta.close();
    31. con.close();
    32. }
    33. }

    案例: 登录验证

    需求:

     代码:

    1. package com.qf.test.test01;
    2. import java.sql.*;
    3. import java.util.Scanner;
    4. public class Test02 {
    5. public static void main(String[] args) throws SQLException, ClassNotFoundException {
    6. //实例化Scanner
    7. Scanner input = new Scanner(System.in);
    8. System.out.println("请输入用户名");
    9. String user = input.next();
    10. System.out.println("请输入密码");
    11. String pwd = input.next();
    12. if (show(user,pwd)){
    13. System.out.println("登录成功");
    14. }else {
    15. System.out.println("登录失败");
    16. }
    17. }
    18. public static boolean show(String user,String pwd) throws SQLException, ClassNotFoundException {
    19. //加载驱动
    20. Class.forName("com.mysql.cj.jdbc.Driver");
    21. //获取连接对象
    22. Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/day09?characterEncoding=utf-8", "root", "123456");
    23. //获取发送指令对象
    24. Statement sta = root.createStatement();
    25. //编写SQL语句
    26. String sql = "select * from user where uname='"+user+"' and upwd='"+pwd+"'";
    27. //获取结果集
    28. ResultSet rs = sta.executeQuery(sql);
    29. //判断
    30. if (rs.next()){
    31. return true;
    32. }
    33. return false;
    34. }
    35. }

    六、PreparedStatement

    刚才的登录案例会出现的问题:

     

    PreparedStatement 与 Statement 比较:

            PreparedStatement 是Statement的子类

            PreparedStatement 会预编译 SQL语句  检测SQL语句是否正常

            PreparedStatement 可以防止SQL注入问题,执行率比较高

    PreparedStatement 常用方法:

    改造登录案例:

     

    1. package com.qf.test.test01;
    2. import java.sql.*;
    3. import java.util.Scanner;
    4. public class Test02 {
    5. public static void main(String[] args) throws SQLException, ClassNotFoundException {
    6. //实例化Scanner
    7. Scanner input = new Scanner(System.in);
    8. System.out.println("请输入用户名");
    9. String user = input.next();
    10. System.out.println("请输入密码");
    11. String pwd = input.next();
    12. if (show(user,pwd)){
    13. System.out.println("登录成功");
    14. }else {
    15. System.out.println("登录失败");
    16. }
    17. }
    18. public static boolean show(String user,String pwd) throws SQLException, ClassNotFoundException {
    19. //加载驱动
    20. Class.forName("com.mysql.cj.jdbc.Driver");
    21. //获取连接对象
    22. Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/day09?characterEncoding=utf-8", "root", "123456");
    23. String sql = "select * from user where uname=? and upwd=?";
    24. PreparedStatement ps = root.prepareStatement(sql);
    25. //给占位符设置值
    26. ps.setString(1,user);
    27. ps.setString(2,pwd);
    28. //提交SQL语句
    29. ResultSet rs = ps.executeQuery();
    30. if (rs.next()){
    31. return true;
    32. }
    33. return false;
    34. }
    35. }

    七、数据库工具类封装

    分析:

     

    代码:

    BaseDao:

    1. package com.qf.test.test01;
    2. import java.sql.*;
    3. public class BaseDao {
    4. private static final String className="com.mysql.cj.jdbc.Driver";
    5. private static final String driveUrl="jdbc:mysql://localhost:3306/day09?characterEncoding=utf-8";
    6. private static final String userName = "root";
    7. private static final String password="123456";
    8. //获取连接对象方法
    9. public static Connection getConn(){
    10. Connection conn = null;
    11. try {
    12. //通过反射加载驱动
    13. Class.forName(className);
    14. //获取连接对象
    15. conn = DriverManager.getConnection(driveUrl, userName, password);
    16. } catch (ClassNotFoundException e) {
    17. e.printStackTrace();
    18. } catch (SQLException e) {
    19. e.printStackTrace();
    20. }
    21. return conn;
    22. }
    23. //增删改方法
    24. public static int update(String sql,Object[] objects){
    25. Connection conn=null;
    26. PreparedStatement ps=null;
    27. int num = -1;
    28. try {
    29. //获取连接对象
    30. conn = getConn();
    31. //执行SQL语句
    32. ps= conn.prepareStatement(sql);
    33. //判断数组非空
    34. if (objects!=null&&objects.length>0){
    35. for (int i=0;i
    36. //给占位符赋值
    37. ps.setObject(i+1,objects[i]);
    38. }
    39. }
    40. //发送SQL语句
    41. num = ps.executeUpdate();
    42. } catch (SQLException e) {
    43. e.printStackTrace();
    44. }finally {
    45. //关闭资源
    46. close(null,ps,conn);
    47. }
    48. return num;
    49. }
    50. //查询方法
    51. public static ResultSet getRs(String sql,Object [] objects){
    52. ResultSet rs = null;
    53. Connection conn=null;
    54. PreparedStatement ps=null;
    55. try {
    56. //获取连接对象
    57. conn = getConn();
    58. //执行SQL语句
    59. ps = conn.prepareStatement(sql);
    60. //判断数组非空
    61. if (objects!=null&&objects.length>0){
    62. for (int i=0;i
    63. //给占位符赋值
    64. ps.setObject(i+1,objects[i]);
    65. }
    66. }
    67. //发送SQL语句
    68. rs = ps.executeQuery();
    69. } catch (SQLException e) {
    70. e.printStackTrace();
    71. }
    72. return rs;
    73. }
    74. //关闭资源方法
    75. public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
    76. try {
    77. if (rs!=null){
    78. rs.close();
    79. }
    80. if (ps!=null){
    81. ps.close();
    82. }
    83. if (conn!=null){
    84. conn.close();
    85. }
    86. } catch (SQLException e) {
    87. e.printStackTrace();
    88. }
    89. }
    90. }

    测试类:

    1. package com.qf.test.test01;
    2. import java.sql.ResultSet;
    3. import java.sql.SQLException;
    4. public class Test03 {
    5. public static void main(String[] args) throws SQLException {
    6. //增
    7. /*String sql = "insert into user(uname,upwd) values(?,?)";
    8. Object [] objects={"王五","123456789"};
    9. int num = BaseDao.update(sql, objects);
    10. System.out.println(num);*/
    11. //删
    12. /* String sql ="delete from user where uid=6";
    13. int num = BaseDao.update(sql, null);
    14. System.out.println(num);*/
    15. //改
    16. /* String sql = "update user set uname=?,upwd=? where uid=?";
    17. Object [] objects = {"班长","666","4"};
    18. BaseDao.update(sql,objects);*/
    19. //查
    20. String sql = "select * from user";
    21. ResultSet rs = BaseDao.getRs(sql, null);
    22. //遍历结果集
    23. while (rs.next()){
    24. System.out.println(rs.getInt("uid"));
    25. System.out.println(rs.getString("uname"));
    26. System.out.println(rs.getString("upwd"));
    27. }
    28. }
    29. }

     

  • 相关阅读:
    Nebula Graph图数据库教程介绍
    2024年阿里云创建【幻兽帕鲁/Palworld】32人联机服务器教程
    Acwing.4736步行者(模拟)
    智能油烟机 优化烹饪体验
    运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
    超全Chat GPT论文修改指令
    [AutoSAR系列] 1.2 AutoSar 综述
    Nginx反向代理
    <二>强弱指针使用场景之 多线程访问共享对象问题
    etcd之读性能主要影响因素
  • 原文地址:https://blog.csdn.net/qq_53884348/article/details/126585207