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) ; 
      }
    }

        

  • 相关阅读:
    莫队模板
    CF600E Lomsat gelral
    JZOJ 捕老鼠
    JZOJ 4896. 【NOIP2016提高A组集训第16场11.15】兔子
    JZOJ 4895【NOIP2016提高A组集训第16场11.15】三部曲
    双端队列xLIS问题
    最大K段和
    你真的了解ES6的promise吗?
    JS对象和数组深浅拷贝总结②
    当前页码删除唯一数据后加载前一页内容
  • 原文地址:https://www.cnblogs.com/lin0/p/14238989.html
Copyright © 2011-2022 走看看