zoukankan      html  css  js  c++  java
  • Mybatis学习笔记(0)---- JDBC

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

    在介绍Mybatis之前需要先了解一下JDBC,才能更清楚Mybatis究竟帮我们做了什么。

    JDBC

    JDBC(Java Database Connectivity,Java数据库连接)是java中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

    JDBC的层次结构

    (jdbc是sun公司提供一套用于数据库操作的接口,java程序员只需面向这套接口编程即可。不同数据库厂商,需要针对这套接口,提供不同的实现。不同的实现的集合即为不同数据库的驱动)

    jdbc接口(API)包括两个层次:

      面向应用的API:java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)

      面向数据库的API:java Driver API,供开发商开发数据库驱动使用。

    JDBC程序编写步骤

    获取数据库连接

      要素一:Driver接口实现类

      Driver接口介绍

      java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。

      在程序中不需要直接去访问实现了Driver接口的类,而是由驱动程序管理类(java.sql.Driveranager)去调用这些Driver实现。

      加载和注册JDBC驱动

      加载驱动:加载JDBC驱动需调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名。Class.forName("com.mysql.jdbc.Driver")

      注册驱动:DriverManager类是驱动程序管理类,负责管理驱动程序。使用DriverManager.registerDriver类的registerDriver()方法来注册驱动了的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例。

      要素二:URL

      JDBC URL用于标志一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接。

      JDBC URL的标准由三部分组成,各部分用冒号分割(jdbc:子协议:子名称)【jdbc:mysql://localhost:3306/test】

    public Connection getConnection(){
      //第一种
        Driver driver = com.mysql.jdbc.Driver();
      //第二种
      //Class clazz = Class.forName("com.mysql.jdbc.Driver");
      //Driver driver = (Driver)clazz.newInstance();
      String url = "jdbc:mysql://localhost:3306/test";
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");
        Connection connection = driver.connect(url, info);
        return connextion;
      //第三种
      //DriverManager.registerDriver(driver);//driver为第二种中的driver
      //上面注册可以不要,在Mysql的Driver实现类中,有一块静态代码块,已经实现了注册
      //return DriverManager.getConection(url, user, password);//获取到连接
    }
    //第四种,将基本信息放在配置文件中
    public Connection getConnection(){
        //1.读取配置文件中的4个基本信息
        InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");//ClassLoader.getSystemClassLoader()
        Properties pros = new Properties();
        pro.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        //2.加载驱动
        Class.forName(driverClass);
        //3.获取连接
        return DriverManager.getConnection(url, user, password);
    }
    
    jdbc.properties
    user=root
    password=1234567
    url=jdbc:mysql://localhost:3306/test
    driverClass=com.mysql.jdbc.Driver

    使用PreparedStatement实现CRUD操作

      操作和访问数据库

      数据库连接被用于向数据库服务器发送命令和上去了语句,并接受数据库服务器返回的结果,其实一个数据库连接相当于一个socket连接。

      在java.sql包中有3个接口分别定义了对数据库的调用的不同方式:

      Statement:用于执行静态SQL语句并返回它所生成结果的对象。(弊端:需要拼写Sql语句,可能存在Sql注入问题。)

      PreparedStatement:SQL语句被预编译并存储在此对象中,可以使用此对象多次高效的执行该语句。

      CallableStatement:用于执行SQL存储过程。

    public void testPreparedStatement(){
      //获取连接
      Connection conn = getConnnection();
      //预编译sql语句,返回PreparedStatement实例
      String sql = "insert into student(name,email) values (?,?)";
      PreparedStatement ps = conn.preparedStatement(sql) ;
      //填充占位符
      ps.setString(1, "哪吒");
      ps.setString(2, "nezha@gmail.com");
      //执行操作
      ps.execute();
      conn.close();
      ps.close();  
    }
    public void testQuery() {
      Connection conn = getConnection();
      String sql = "select * from student where id = ?";
      PreparedStatement ps  = conn.prepareStatement(sql);
      ResultSet resultSet = ps.executeQuery();
      if(resultSet.next()){//判断结果集中是否有数据,并指针下一
        int id = resultSet.getInt(1);
        String name = resultSet(2) ; 
      }
    }

        

  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/lin0/p/14238989.html
Copyright © 2011-2022 走看看