zoukankan      html  css  js  c++  java
  • JDBC入门

    JDBC 概述 

    什么是 JDBC

    JDBC(Java Data Base Connectivity,java数据库连接),执行SQL语句的API。  

    JDBC 常用API

    Driver 接口

    Class.forName("com.mysql.jdbc.Driver"); //注册驱动

    DriverManager 接口

    getConncetion(String url, String user, String password) //建立数据库连接,返回Connection 对象

    Connection 接口

    createStatement() //创建Statement对象将SQL语句发送到数据库

    createStatement(int resultSetType, int resultSetConcurrency)

    //创建Statement对象将SQL语句发送到数据库(生成具有给定类型和并发性的ResultSet)

    resultSetType - 结果集类型

    ResultSet.TYPE_FORWARD_ONLY(不滚动结果集)

    ResultSet.TYPE_SCROLL_INSENSITIVE(滚动结果集,但数据不会再跟随数据库而变化)

    ResultSet.TYPE_SCROLL_SENSITIVE(滚动结果集,但数据不会再跟随数据库而变化,敏感(数据库更新,未查看的结果集也随之更新)且无数据库驱动支持)

    resultSetConcurrency - 并发类型

    ResultSet.CONCUR_READ_ONLY(结果集只读,不能通过修改结果集而反向影响数据库)

    ResultSet.CONCUR_UPDATABLE(结果可更新,对结果集的更新可反向影响数据库)

    Statement 接口

    executeUpdate(String sql) //执行sql 中的 insert、update 和 delete 语句。返回int 类型,表示数据库中受该SQL语句影响的记录的数目

    executeQuery(String sql) //执行sql 中的 select 语句。返回一个表示查询结果的ResultSet 对象

    ResultSet 接口

    getString(int columnIndex) //用于获取指定列数字段的String 类型的值

    getString(String columnName) //用于获取指定字段名称的String 类型的值

    getInt(int columnIndex) //用于获取指定字段名称的int 类型的值

    getInt(String columnName) //用于获取指定字段名称的int 类型的值

    next() //将游标从当前位置向下移一行

    getMetaData() //返回ResultSetMetaData类型对象,再通过该对象的getColumnCount()和String getColumnName(int,colIndex)获取所有列数 和列名

    结果集特性

    当使用Connection 的createStatement 时已经确定生成结果集的特性

    是否可滚动

    是否敏感

    是否可更新

    注意:导入的是java.sql.*

    实现一个JDBC程序

    	public void query() {
    		Connection con = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		try{
    			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs","root","root");
    			stmt = con.createStatement();
    			String sql = "select * from article";
    			rs = stmt.executeQuery(sql);
    			int count = rs.getMetaData.getColumnCount();
    			while(rs.next()){
    				for(int i=1; i<=count, i++){
    					System.out.println(rs.getObject(i));	//不知列类型,rs.getObject通用
    					if(p<count){
    						System.out.println();
    					}
    				}
    				System.out.println();
    				//int id = rs.getInt(1);
    				//String title = rs.getString("title");
    			}
    		}catch(Exception e){
    			throw new RuntimeException(e);
    		}finally{
    			try{
    				if(rs != null) rs.close();
    				if(stmt != null) stmt.close();
    				if(con != null) con.close();
    			}catch(Exception e){}
    		}
    	}
    

    PreparedStatement

    它是Statement接口的子接口

    作用

    防SQL攻击

    提高代码可读性、可维护性

    提高效率

    疑问:为什么是双引号还有两个加号?

    String userName = "baron";

    String sql = "select * from student where username = '"+ userName+"'";

    步骤

    //1、sql语句中的参数用?来代替

    String sql = "select * from student where username = ?";

    //2、通过Conncetion 得到 PreparedStatement

    PreparedStatement pstmt = con.PreparedStatement(sql);

    //3、调用pstmt 的 setXxx()系列方法为sql 中的? 赋值

    pstmt.setString(1,userName); //给第一个?赋值userName

    //4、调用pstmt 的 executeUpdate(没有参数) 或 executeQuery(没有参数)方法,注意没有参数

    resultSet rs = pstmt.executeQuery();

    JdbcUtils1.0小工具

    面向接口编程

    步骤

    1、创建UserDao接口

    2、创建UserDaoImpl实现UserDao

    3、在类中对UserDao进行实例化:private UserDao = DaoFactory.getUserDao()

    4、创建user.properties配置文件,配置UserDao接口实现类名称

    5、DaoFactory得到UserDao实现类名称,通过反射完成创建对象,提供getUserDao()

    InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");

    props = new Properties();

    props.load(in)

    String daoClassName = props.getProperty("...UserDao");

    Class clazz = Class.forName(daoClassName);

    return (UserDao)clazz.newInstance();

    注意:java.sql包下的东西不能出现在Dao以外的地方

    util包下的Date类型与sql包下的Date类型之间转换

    背景:数据库中存储java.sql包下下的Date类型,然而我们需要用java.util包下的Date类型进行操作

    1、java.util.Date --> java.sql.Date、Time、Timestamp

    把util包下的Date转化成毫秒值,然后使用毫秒值创建sql包下Date

    java.util.Date date = new java.util.Date();

    long l = date.getTime();

    java.sql.Date sqlDate = new java.sql.Date(l);

    2、java.sql.Date、Time、Timestamp --> java.util.Date

    java.sql.Date是java.util.Date的子类,无需转换

    大数据处理 

    大数据即大的字节或字符数据

    准备:配置MySQL数据库的my.ini 文件,最后一行加max_allowed_packed = 10485760(10M)

      处理CLOB数据

    在实际开发中,CLOB用于存储大文本数据,但是对于MySQL而言,大文本数据的存储是用TEXT类型表示的

      处理BLOB数据

    CLOB用于存储二进制数据,如图片、电影等

    eg:

    //存入数据库

      byte[] bytes = IOUtils.toByteArray(new FileInputStream("D:/好久不见.mp3"));

      Blob blob = new SerialBlob(bytes);

      pstmt = setBlob(3,blob);

    //从数据库取

      if(rs.next()){

        Blob blob = rs.getBlob("data");

        InputStream in = blob.getBinaryStream();

        OutputStream out = new FileOutputStream("c:/nolongsee.mp3");

        IOUtils.copy(in,out);

      }

    JDBC批处理 

      Statement批处理

      PreparedStatement批处理

      准备:jdbc:mysql://localhost:3306/bbs?rewriteBatchedStatements=true

      eg:

        String sql = "insert into users values(?,?,?,?)";

        preStmt = conn.prepareStatement(sql);

        for(int i = 0; i<5; i++){

          preStmt.SetString(1,"name"+i);

          preStmt.SetString(2,"password"+i);

          preStmt.SetString(3,"email"+1+"@baron.com")

          preStmt.SetString(4,Date.valueOf("1989-02-19"));

          preStmt.addBatch();

        }

        preStmt.executeBatch();

  • 相关阅读:
    统一回复《怎么学JavaScript?》
    nodejs配置简单HTTP服务器
    web跨域解决方案
    JavaScript 调试小技巧
    我从编程总结的 22 个经验
    Sublime Text 3103 Crack 破解 注册码(亲测有效)
    mstsc 远程序桌面登录的 c#开发
    突然顿悟的Javascript中的this
    解决Electron加载带jquery的项目报错问题
    ES6+ 开发 React 组件
  • 原文地址:https://www.cnblogs.com/zhanwang/p/7392401.html
Copyright © 2011-2022 走看看