• jdbc(1)(一)


    1.连接数据库,准备mysql连接jar包导入项目:

           Class.forName("com.mysql.jdbc.Driver");
           //建立连接是比较耗时,耗资源的,实际开发中多用连接池来管理
           Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","");

     2.statement接口:执行静态sql语句,返回生成结果的对象

    三种Statement类:

    statement:由createStatement创建,用于发送简单的SQL语句。(不带参数)
    preparedStatement:继承自statement接口,由prpareStatement创建,用于发送含有一个或者多个输入参数的sql语句,效率高于上面,并且可以防止sql注入。
    CallableStatement:继承preparedStatement,由prPareCall创建,用于调用存储过程。

    常用的statement方法:

    execute():执行后返回是否有结果集,只有查询才有结果集,插入返回的是行数,而只有返回结果集是true,返回是null或者是数字就是false;
    executeQuery():运行select,返回ResultSet结果集。
    executeUpdate():运行insert/update/delete操作,返回新的行数。

    例子:

         1.Statement statement = connection.createStatement();
           String id="4 or 1=1";//采用这种拼接字符串的方式容易出现这种类似的sql注入
           statement.execute("delete from t_user where id="+id);
           
         2.//preparestatement有预先编译的功能对于传递的参数会做一个检查(排查特殊意义的符号)
           PreparedStatement prepareStatement = connection.prepareStatement("delete from t_user where id=?");
           //可以指定类型
           prepareStatement.setString(1,"4");//编号是从开始对应占位符号?
           //也可以交给程序推断
           prepareStatement.setObject(1, 4);
           
         3.//数据库的java.sql.Date的对象和java的date不是同一对象。
           Date date = new Date(System.currentTimeMillis());

    3.ResultSet接口:执行sql语句返回ResultSet结果集。

           //只有executeQuery返回结果集
           ResultSet rs = prepareStatement.executeQuery();
           //是否存在下条记录
           while(rs.next()){
               //纪录的第几个字段值
               String string = rs.getString(1);
               int int1 = rs.getInt(2);
           }

    4.对于connection statement resultSet都需要关闭,必须每个都需要分开捕获,防止关闭异常相互影响。

    5.批处理:

    1.一般使用statement,因为prepareStatement的预编译大小有限,数据太大可能出异常。

    2.设置事务不自动提交。

            // 事务不自动提交
            connection.setAutoCommit(false);
            Statement statement = connection.createStatement();
    
            for (int i = 0; i < 22222; i++) {
                //批处理语句,now()当前时间,数据库函数方法
                statement.addBatch("insert into t_user(name,pwd,time) values('xiao" + i + "',1234,now())");
            }
            //批处理执行方法
            statement.executeBatch();
            connection.commit();//提交事务

    6.事务:一组sql语句同时成功或者同时失败。(默认事务的自动提交)(回滚必须保证不是自动提交)

    开始于:连接建立后,或者上一个事务结束,DML(insert delete update)执行

    结束于:

    执行commit或者rollback

    执行DDL语句:如create table

    执行DCL语句:如grant

    断开数据库

    执行DML语句失败,执行rollback

    7.事务的四个特点:(ACID)

    atomicity(原子性):事务内操作是一个整体,要么都成功,或都失败。

    consistency(一致性性):事务内一个操作失败,所有修改回滚到修改前的状态

    isolation(隔离性):事务查看数据的状态,可以是隔离的,不能看到另一个事务的数据中间状态。

    durability(持久性):事务完成对系统的影响是永久的。

    8.隔离性的隔离级别:

    读取未提交

    读取已提交

    可重读

    序列化

    9.数据库时间类型。是java.util.Date的子类:

    java.sql.Date: 表示年月日

    java.sql.Time: 表示时分秒

    java.sql.Timestamp:表示年月日时分秒

            Date date = new Date(System.currentTimeMillis());
            Timestamp timestamp = new Timestamp(System.currentTimeMillis());
            Time time = new Time(System.currentTimeMillis());
            System.out.println(date);//2017-01-08
            System.out.println(timestamp);//2017-01-08 20:46:49.413存入数据库并不会出现毫秒(.毫秒数)
            System.out.println(time);//20:46:49

    时间转换成数据库时间类型:

            //时间转换方法
    static
    long dateToLong(String s) throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd hh:mm:ss"); java.util.Date parse = simpleDateFormat.parse(s); return parse.getTime(); } //获得需要的时间对象 Date date1 = new Date(dateToLong("2017-1-8 00:00:00")); Timestamp timestamp1 = new Timestamp(dateToLong("2017-1-8 10:10:10")); System.out.println(date1);// 2017-01-08 System.out.println(timestamp1);//2017-01-08 10:10:10.0存入数据库并不会出现毫秒(.毫秒数)

    10.CLOB(character large object):可以存储大量文本数据,大字段数据读取采用数据流的方式一次读取。

    mysql中不同的大小有相关的类型:
    tinytext:最大长度:2552*8-1)字符的text.
    text(M):65535(2*16-1)
    mediumtext:16,777,215(2*24-1)
    longtext:4,294,967,295或者4G(2*32-1

    设置和获取Clob文本数据例子:

          1.// 设置文本数据
            void setCLOB(Connection con) throws SQLException, FileNotFoundException {
            PreparedStatement prepareStatement = con.prepareStatement("insert into t_user(name,info values(?,?)");
            prepareStatement.setObject(1, "wo");
            // 不管数据具体是哪种大文本类型都是setClob方法
            // 数据都是流的方式输入
            prepareStatement.setClob(2, new FileReader(new File("d:/test.txt")));
            // 如想输入字符串需要转换流(也可以用字节流转换
            BufferedReader bufferedReader = new BufferedReader(new CharArrayReader("我很长哦".toCharArray()));
            prepareStatement.setClob(3, bufferedReader);
            prepareStatement.executeUpdate();
        }
    
          2.// 获取文本数据
           void getClob(ResultSet r) throws SQLException, IOException {
            while (r.next()) {
                // 得到文本数据
                Clob clob = r.getClob("info");
                // 得到字符流
                Reader characterStream = clob.getCharacterStream();
                int i;
                while ((i = characterStream.read()) != -1) {
                    System.out.println((char) i);
                }
            }

    11.BLOB,二进制大数据和大文本数据操作极其类似。只是读取都是字节流:

    设置:

            //设置blob二进制数据
            prepareStatement.setBlob(2,new FileInputStream("d:/a.jpg"));

    12.一般配置从properties文件中获取配置。

            Properties properties = new Properties();
            //默认的加载路径bin目录下的
            properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
            //获取配置信息
            String property = properties.getProperty("dbName");

    总结:对于数据库操作,注意关闭一些资源文件和流。

    13.orm(object relationship map)对象关系映射(略)

    14.自定义ORM

    封装bean:

    columnInfo:封装字段信息(类型,名字,键类型)

    configuration:封装表的信息,(属性由字段生成,类名由表名生成)

    TableInfo:封装配置文件信息(配置信息,properties,可以xml,及注解

    15.连接池:

     数据库的连接是需要建立socket通信的,非常消耗时间和资源的。连接池,对连接进行管理,保留一部分连接不关闭,达到重复使用的目的。

  • 相关阅读:
    项目延期原因及应对之道
    我只是来刷屏的
    php学习1留言板的创建
    位运算
    hnu 12264 collisions
    数组和指针的区别
    hnu12263 Gluttonous robot
    解决Mac上安装Zookeeper问题:FAILED TO WRITE PID
    Dubbo问题记录:No provider available for the service xxx from registry localhost:9090
    SqlServer和mysql的日期函数备忘
  • 原文地址:https://www.cnblogs.com/straybirds/p/6261002.html
Copyright © 2020-2023  润新知