MySQL之JDBC编程增删改查

打印 上一主题 下一主题

主题 622|帖子 622|积分 1866

MySQL之JDBC

一、JDBC是什么

Java DatabaseConnectivity (java语言连接数据库)
二、JDBC的本质

JDBC是SUN公司制定的一套接口(interface)。
接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口编程。
三、为什么要面向接口编程

解耦合:降低程序的耦合度,提高程序的扩展力。解耦合可以理解为淘宝的两个页面,你在将商品加入订单的时候出现错误,但是不会影响你在主页浏览商品,就是两个模块之间的联系不那么紧密,说明两个模块内聚就高。

四、为什么SUN制定一套JDBC接口

因为每一个数据库产品都有自己独特的实现原理
五、JDBC编程六步

1、注册驱动(告诉Java程序要连接哪个品牌的数据库)
2、获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,使用完后记得关闭通道)。
3、获取数据库操作对象(专门执行sql语句的对象)
4、执行SQL语句(DQL,DML...)
5、处理查询结果集 (只有当第四步执行的是select语句的时候,才有本步)
6、释放资源(使用完资源后一定要关闭资源,Java和数据库之间属于进程间的通信,开启之后一定要记得关闭)
六、IDEA编写JDBC连接MySQL

第一种方法:

1.进入mysql官网
2.点击下载downloads

3.点击下载社区版[MySQL Community (GPL) Downloads »]

4.选择jdbc连接器Connector/J

5.选择Archives下载5.1版本的(支持的数据库版本更多)

两个都可以下载,自己选一个

6.解压后拿到一个mysql-connector-java-5.1.49.jar的包
7.在idea创建一个工程,点击file


8.点击Java,选择你解压后的jar包,不要选择带bin的,是二进制的意思。点击ok就行。
第二种方法

先检查jar包位置:在目录里新建一个文件夹 libs,把jar包复制进去

然后右键选择新建文件夹libs转成library

然后就可以写代码啦!



七、jdbc连接mysql程序编写

7.1 第一种注册驱动方式
  1. public class JDBCTest1 {
  2.     private static Statement stat;
  3.     private static Connection conn;
  4.     public static void main(String[] args) {
  5.         //1.注册驱动
  6.         try {
  7.             DriverManager.registerDriver(new Driver());
  8.             //2.获取连接
  9. //            DriverManager.getConnection("jdbc:mysql://192.168.137.150:3306?" +
  10. //                    "useUnicode=true&characterEncoding=utf8&useSSL=false","root","123456");
  11.             /*
  12.             url: 统一资源定位系统
  13.              *          http/https: 通过网络请求去访问网络上的资源
  14.              *          jdbc:mysql: 是驱动提供的请求头
  15.              *          请求的地址: 指定mysql的服务器地址:192.168.254.150
  16.              *          端口号: 3306
  17.              *          useUnicode=true&characterCharset=utf8
  18.              */
  19.             String url ="jdbc:mysql://192.168.137.150:3306/bigdata19?useUnicode=true&characterEncoding=utf8&useSSL=false";
  20.             String user = "root";
  21.             String password = "123456";
  22.             conn = DriverManager.getConnection(url, user, password);
  23.             System.out.println("与mysql连接成功"+conn);
  24.             //获取数据库操作对象
  25.             stat = conn.createStatement();
  26.             //DQL
  27.             //ResultSet executeQuery(String sql)
  28.             //执行给定的SQL语句,该语句返回单个 ResultSet对象。
  29.             //DML(数据库操作语言,增删改)
  30.             //int executeUpdate(String sql)
  31.             //执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。
  32.             // 方法的返回值指的是受影响的行数: Affected rows: 1
  33.             int count = stat.executeUpdate("insert into dept(deptno,dname,loc) values(50,'教学部','合肥')");
  34.             System.out.println(count==1?"数据保存成功":"数据保存失败");
  35.         } catch (SQLException e) {
  36.             e.printStackTrace();
  37.         }finally {
  38.             //释放资源
  39.             if (stat!=null){
  40.                 try {
  41.                     stat.close();
  42.                 } catch (SQLException e) {
  43.                     e.printStackTrace();
  44.                 }
  45.             }
  46.             if (conn!=null){
  47.                 try {
  48.                     conn.close();
  49.                 } catch (SQLException e) {
  50.                     e.printStackTrace();
  51.                 }
  52.             }
  53.         }
  54.     }
  55. }
复制代码

7.2第二种注册驱动方式
  1. public class JDBCTest2 {
  2.     public static void main(String[] args) {
  3.         //注册驱动的第二种方式
  4.         //注册驱动底层实际上就是用驱动包中对应的类,而驱动包中的类都是class后缀的编译好的文件
  5.         //       要想直接使用编译好的类,使用反射来实现。
  6.         //       想一想,反射是如何获取一个类的class文件对象呢?3种方式
  7.         //       1、getClass
  8.         //       2、.class
  9.         //       3、Class.forName()
  10.         Connection conn = null;
  11.         Statement stat = null;
  12.         try {
  13.             //加载驱动
  14.             Class.forName("com.mysql.jdbc.Driver");
  15.             //创建与数据库连接的对象
  16.             String url = "jdbc:mysql://192.168.137.150:3306/bigdata19?useUnicode=true&characterEncoding=utf8&useSSL=false";
  17.             String user="root";
  18.             String password="123456";
  19.             conn = DriverManager.getConnection(url, user, password);
  20.             //获取与操作数据库的对象
  21.             stat = conn.createStatement();
  22.             //编写sql语句并执行
  23.             //增
  24.             String sql="insert into dept(deptno,dname,loc) values(60,'行政部','合肥')";
  25.             int count2 = stat.executeUpdate(sql);
  26.             System.out.println(count2==1?"数据增加成功":"数据增加失败");
  27.             //改
  28.             String sql1 ="update dept set dname='研发部'where deptno=60";
  29.             int count3 = stat.executeUpdate(sql1);
  30.             System.out.println(count3==1?"数据修改成功":"数据修改失败");
  31.             //删
  32.             String sql2 = "delete from dept where deptno=50";
  33.             int count4 = stat.executeUpdate(sql2);
  34.             System.out.println(count4==1?"数据删除成功":"数据删除失败");
  35.         } catch (ClassNotFoundException e) {
  36.             e.printStackTrace();
  37.         } catch (SQLException e) {
  38.             e.printStackTrace();
  39.         }finally{
  40.             if (stat!=null){
  41.                 try {
  42.                     stat.close();
  43.                 } catch (SQLException e) {
  44.                     e.printStackTrace();
  45.                 }
  46.             }
  47.             if (conn!=null){
  48.                 try {
  49.                     conn.close();
  50.                 } catch (SQLException e) {
  51.                     e.printStackTrace();
  52.                 }
  53.             }
  54.         }
  55.     }
  56. }
复制代码


7.3将连接数据库的所有信息配置到配置文件中
  1. public class JDBCTest3 {
  2.     /*
  3.     使用配置文件将连接数据库的相关参数进行保存,然后在代码中使用
  4.         使用jdk自身提供的Properties类来加载配置文件
  5.      */
  6.     public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
  7.         //使用无参构造方法创建Properties类的对象
  8.         Properties prop = new Properties();
  9.         //使用字符流读取配置文件
  10.         BufferedReader br = new BufferedReader(new FileReader("F:\\software\\IdeaProjects\\bigdata19_mysql\\resource\\jdbc.properties"));
  11.         prop.load(br);
  12.         String driver = prop.getProperty("driver");
  13.         String url = prop.getProperty("url");
  14.         String user = prop.getProperty("user");
  15.         String password = prop.getProperty("password");
  16.         //加载驱动
  17.         Class.forName(driver);
  18.         //获取连接对象
  19.         Connection conn = DriverManager.getConnection(url, user, password);
  20.         //获取数据库操作对象
  21.         Statement stat = conn.createStatement();
  22.         //执行sql语句
  23.         int count = stat.executeUpdate("insert into dept(deptno,dname,loc) values(70,'教学部','合肥')");
  24.         System.out.println(count==1?"数据插入成功":"数据插入失败");
  25.         //释放资源
  26.         if (stat!=null){
  27.             stat.close();
  28.         }
  29.         if (conn!=null){
  30.             conn.close();
  31.         }
  32.     }
  33. }
复制代码


7.4处理查询

工具类封装
  1. public class MySqlTool {
  2.     /*
  3.     工具类
  4.     1.不能让外界实例化(构造方法私有化)
  5.     2.方法必须是静态
  6.      */
  7.     private static Connection conn;
  8.     private MySqlTool(){}
  9.     public static Connection init(){
  10.         try {
  11.             Properties prop = new Properties();
  12.             //使用字符流读取配置文件
  13.             BufferedReader br = new BufferedReader(new FileReader("F:\\software\\IdeaProjects\\bigdata19_mysql\\resource\\jdbc.properties"));
  14.             prop.load(br);
  15.             String driver = prop.getProperty("driver");
  16.             String url = prop.getProperty("url");
  17.             String user = prop.getProperty("user");
  18.             String password = prop.getProperty("password");
  19.             //加载驱动
  20.             Class.forName(driver);
  21.             //获取连接对象
  22.             conn = DriverManager.getConnection(url, user, password);
  23.         }catch (Exception e){
  24.             e.printStackTrace();
  25.         }
  26.         return conn;
  27.     }
  28. }
复制代码
  1. public class JDBCTest4 {
  2.     public static void main(String[] args) throws SQLException {
  3.         //通过工具类获取数据库连接对象
  4.         Connection conn = MySqlTool.init();
  5.         //获取数据库操作对象
  6.         Statement stat = conn.createStatement();
  7.         //执行sql语句
  8.         ResultSet result = stat.executeQuery("select deptno,dname,loc from dept");
  9.         //处理查询结果集
  10.         boolean b = result.next();
  11.         //将光标从当前位置向前移动一行。
  12.         //如果光标移动的位置有值,这里的返回值是true
  13. //        if (b){
  14. //            //获取一行中每一列的数值,第一种方式
  15. //            String deptno = result.getString(1);
  16. //            String dname = result.getString(2);
  17. //            String loc = result.getString(3);
  18. //            System.out.println("部门编号:"+deptno+",部门名称:"+dname+",部门地址:"+loc);
  19. //
  20. //        }
  21.         //正常情况下,一张结果表的行数我们不确定,但是我们知道,当next的结果是false的时候,表示读取到末尾
  22.         while(result.next()){
  23.             //获取一行中每一列的数值,第一种方式
  24. //            String deptno = result.getString(1);
  25. //            String dname = result.getString(2);
  26. //            String loc = result.getString(3);
  27. //            System.out.println("部门编号:"+deptno+",部门名称:"+dname+",部门地址:"+loc);
  28.             //第二种方式,根据列名获取对应的列值
  29.             //注意事项:当查询sql语句中存在起别名的情况时,通过列名获取列值的时候,使用名字是别名
  30.             String deptno = result.getString("deptno");
  31.             String dname = result.getString("dname");
  32.             String loc = result.getString("loc");
  33.             System.out.println("部门编号:"+deptno+",部门名称:"+dname+",部门地址:"+loc);
  34.         }
  35.         //注意事项2:同一个结果resultSet对象,只能遍历一次
  36.         System.out.println("=========================");
  37.         //再次遍历,结果不显示
  38.         while(result.next()){
  39.             //获取一行中每一列的数值,第一种方式
  40. //            String deptno = result.getString(1);
  41. //            String dname = result.getString(2);
  42. //            String loc = result.getString(3);
  43. //            System.out.println("部门编号:"+deptno+",部门名称:"+dname+",部门地址:"+loc);
  44.             //第二种方式,根据列名获取对应的列值
  45.             //注意事项:当查询sql语句中存在起别名的情况时,通过列名获取列值的时候,使用名字是别名
  46.             String deptno = result.getString("deptno");
  47.             String dname = result.getString("dname");
  48.             String loc = result.getString("loc");
  49.             System.out.println("部门编号:"+deptno+",部门名称:"+dname+",部门地址:"+loc);
  50.         }
  51.         //释放资源
  52.         if (stat!=null){
  53.             stat.close();
  54.         }
  55.         if (conn!=null){
  56.             conn.close();
  57.         }
  58.     }
  59. }
复制代码

7.5登录注册案例
  1. public class JDBCTest5 {
  2.     public static void main(String[] args) throws SQLException {
  3.         /*
  4.         使用jdbc模拟登录注册案例
  5.         1、注册账号:往数据库插入一条数据
  6.         2、登录账号:查询数据库
  7.          */
  8.         //1.建表user
  9.         //创建键盘录入对象
  10.         System.out.println("欢迎来到提瓦特大陆,准备好开始冒险了吗?");
  11.         Scanner scanner = new Scanner(System.in);
  12.         System.out.println("请输入旅行者的名字:");
  13.         String username = scanner.next();
  14.         System.out.println("请输入密码:");
  15.         String password = scanner.next();
  16.         //创建数据库驱动
  17. //        try {
  18. //            DriverManager.registerDriver(new Driver());
  19. //        } catch (SQLException e) {
  20. //            e.printStackTrace();
  21. //        }
  22. //
  23. //        Connection conn = DriverManager.getConnection();
  24.         //直接采用工具类获取与数据库的连接对象
  25.         Connection conn = MySqlTool.init();
  26.         //获取数据库操作对象
  27.         Statement stat = conn.createStatement();
  28.         //编写sql语句
  29.         String sql= "select username,password from user where username='"+username+"'and password='"+password+"'";
  30.         //执行sql语句
  31.         ResultSet rs = stat.executeQuery(sql);
  32.         //处理查询结果集
  33.         boolean b = rs.next();
  34.         if (b){
  35.             System.out.println("旅行者"+username+",欢迎来到提瓦特大陆!");
  36.         }else{
  37.             System.out.println("您还未注册成为旅行者,是否注册(Y/N)");
  38.             String choice = scanner.next();
  39.             if ("Y".equals(choice)){
  40.                 while (true){
  41.                     System.out.println("请输入旅行者的名字:");
  42.                     String new_username = scanner.next();
  43.                     System.out.println("请输入密码:");
  44.                     String new_password = scanner.next();
  45.                     System.out.println("请确认密码:");
  46.                     String again_password = scanner.next();
  47.                     if (again_password.equals(new_password)) {
  48.                         UUID uuid = UUID.randomUUID();//随机生成uuid
  49.                         String new_uuid = uuid + "-" + System.currentTimeMillis();
  50.                         String sql2 = "insert into user(uid,username,password) values('" + new_uuid + "','" + new_username +"','"+ new_password +"')";
  51.                         int count = stat.executeUpdate(sql2);
  52.                         if (count == 1) {
  53.                             System.out.println("注册成功");
  54.                         } else {
  55.                             System.out.println("注册失败");
  56.                         }
  57.                         break;
  58.                     }else {
  59.                         System.out.println("两次密码输入不一致,请重新输入:");
  60.                     }
  61.                 }
  62.             }
  63.         }
  64.         stat.close();
  65.         conn.close();
  66.     }
  67. }
复制代码

7.6解决sql注入问题
  1. public class JDBCTest6 {
  2.     public static void main(String[] args) throws SQLException {
  3.         /*
  4.         我们写完程序后发现,当我们将密码输入成1234' or '1'='1这个样子的时候,发现登录成功
  5.         原因:sql在编译的时候,会将我们输入的内容存在关键字or,会把or当作sql语法关键字进行执行
  6.         如何解决呢?
  7.             这样的问题,称之为sql注入的问题
  8.             解决的思路就是在sql编译完后再传入数据
  9.        获取数据库操作对象另外一种方式,预编译的方式
  10.          */
  11.         /*
  12.         使用jdbc模拟登录注册案例
  13.         1、注册账号:往数据库插入一条数据
  14.         2、登录账号:查询数据库
  15.          */
  16.         //1.建表user
  17.         //创建键盘录入对象
  18.         System.out.println("欢迎来到提瓦特大陆,准备好开始冒险了吗?");
  19.         Scanner scanner = new Scanner(System.in);
  20.         System.out.println("请输入旅行者的名字:");
  21.         String username = scanner.nextLine();
  22.         System.out.println("请输入密码:");
  23.         String password = scanner.nextLine();
  24.         //创建数据库驱动
  25. //        try {
  26. //            DriverManager.registerDriver(new Driver());
  27. //        } catch (SQLException e) {
  28. //            e.printStackTrace();
  29. //        }
  30. //
  31. //        Connection conn = DriverManager.getConnection();
  32.         //直接采用工具类获取与数据库的连接对象
  33.         Connection conn = MySqlTool.init();
  34. //        //获取数据库操作对象
  35. //        Statement stat = conn.createStatement();
  36. //
  37. //        //编写sql语句
  38. //        String sql= "select username,password from user where username='"+username+"'and password='"+password+"'";
  39. //        //执行sql语句
  40. //        ResultSet rs = stat.executeQuery(sql);
  41.         //这里的问号相当于一个占位符,为了后面传值
  42.         String sql = "select username,password from user where username=? and password=?";
  43.         //创建预编译数据库操作对象
  44.         PreparedStatement pps = conn.prepareStatement(sql);
  45.         //将sql中的占位符附上值
  46.         //第一个参数表示给第几个问号传值,第二个参数表示具体的值,序号从1开始
  47.         pps.setString(1,username);
  48.         pps.setString(2,password);
  49.         //执行sql语句
  50.         ResultSet rs = pps.executeQuery();
  51.         //处理查询结果集
  52.         boolean b = rs.next();
  53.         if (b){
  54.             System.out.println("旅行者"+username+",欢迎来到提瓦特大陆!");
  55.         }else{
  56.             System.out.println("您还未注册成为旅行者,是否注册(Y/N)");
  57.             String choice = scanner.next();
  58.             if ("Y".equals(choice)){
  59.                 while (true){
  60.                     System.out.println("请输入旅行者的名字:");
  61.                     String new_username = scanner.next();
  62.                     System.out.println("请输入密码:");
  63.                     String new_password = scanner.next();
  64.                     System.out.println("请确认密码:");
  65.                     String again_password = scanner.next();
  66.                     if (again_password.equals(new_password)) {
  67.                         UUID uuid = UUID.randomUUID();//随机生成uuid
  68.                         String new_uuid = uuid + "-" + System.currentTimeMillis();
  69.                         String sql2 = "insert into user(uid,username,password) values('" + new_uuid + "','" + new_username +"','"+ new_password +"')";
  70.                         int count = pps.executeUpdate(sql2);
  71.                         if (count == 1) {
  72.                             System.out.println("注册成功");
  73.                         } else {
  74.                             System.out.println("注册失败");
  75.                         }
  76.                         break;
  77.                     }else {
  78.                         System.out.println("两次密码输入不一致,请重新输入:");
  79.                     }
  80.                 }
  81.             }
  82.         }
  83.         pps.close();
  84.         conn.close();
  85.     }
  86. }
复制代码

7.7JDBC实现模糊查询
  1. public class JDBCTest7 {
  2.     public static void main(String[] args) throws SQLException {
  3.         //获取数据库连接对象
  4.         Connection conn = MySqlTool.init();
  5.         //获取预编译数据库操作对象
  6.         String sql="select uid,username,password from user where username like ?";
  7.         PreparedStatement pps = conn.prepareStatement(sql);
  8.         pps.setString(1,"%bfy%");
  9.         //执行sql语句
  10.         ResultSet rs = pps.executeQuery();
  11.         //处理查询结果集
  12.         while (rs.next()){
  13.             String uid=rs.getString(1);
  14.             String username=rs.getString(2);
  15.             String password=rs.getString(3);
  16.             System.out.println(uid+','+username+','+password);
  17.         }
  18.         pps.close();
  19.         conn.close();
  20.     }
  21. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表