JDBC

JDBC

JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库,相当于一个NaviCat。
原来我们操作数据库是在控制台/DOS使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

三范式:

第一范式:

列的原子性(列不可再分),

第二范式:

1、表必须有主键;
2、非主键列必须完全依赖于主键列;
3、满足第一范式的基础上

第三范式:

非主键列必须直接依赖于主键列,不能存在传递依赖;

注意:

不满足第一范式,对列进行拆分;
不满足第二第三范式:把不满足的列提到另外一张表中。

三范式的根本目的是为了降低冗余,但是会提高查询复杂度;

JDBC核心类及接口:

1、DriverManger接口(驱动管理器):

①、注册驱动:装载特定厂商的数据库驱动程序

②、获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。

数据库驱动

安装好数据库之后,应用程序并不能直接使用数据库的,必须通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。
其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。

2、Connection接口:

①、获取Statement对象;

②、负责连接数据库

常用方法:

  • createStatement():创建向数据库发送sql的statement对象。
  • prepareStatement(sql):创建向数据库发送预编译sql的PrepareSatement对象。
  • prepareCall(sql):创建执行存储过程的callableStatement对象。
  • setAutoCommit(boolean autoCommit):设置事务是否自动提交。
  • rollback() :在此链接上回滚事务。

3、Statement接口:

①、用于执行静态SQL语句发送给数据库并返回它所生成结果的对象。

Statement类:

  • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
  • PreparedStatement :继承自Statement接口,预编译sql的Statement由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以一般使用PreparedStatement
  • CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法:

  • execute(String sql):运行语句,返回是否有结果集
  • executeQuery(String sql):运行select语句,返回ResultSet结果集。
  • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
  • addBatch(String sql) :把多条sql语句放到一个批处理中。
  • executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口:

①、ResultSet封装了查询的结果,ResultSet就是一个有行有列的虚拟表

②、ResultSet和查询的结果一致, 封装数据库执行完毕后的结果集

ResultSet提供检索不同类型字段的方法,常用的有:

  • getString(int index)getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
  • getFloat(int index)getFloat(String columnName):获得在数据库里是Float类型的数据对象。
  • getDate(int index)getDate(String columnName):获得在数据库里是Date类型的数据。
  • getBoolean(int index)getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
  • getObject(int index)getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet还提供了对结果集进行滚动的方法:

  • next():移动到下一行
    1.判断是否有下一行
    2.如果有一行则取出放入内存中
  • Previous():移动到前一行
  • absolute(int row):移动到指定行
  • beforeFirst():移动resultSet的最前面。
  • afterLast() :移动到resultSet的最后面。

5、使用后依次关闭对象及连接:

ResultSet → Statement → Connection

JDBC步骤:

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

1、导入数据库驱动jar包:mysql-connector-java-5.1.13-bin.jar;

2、给出URL、USER、PASSWORD、DRIVER参数值:

static String URL = "jdbc:mysql://127.0.0.1:3306/数据库名";

可加上这句解决乱码问题:"?unicode=true&characterEncoding=utf8";

这里写图片描述

static String USER = "用户名";

static String PASSWORD = "用户名对应的密码";

static String DRIVER = "com.mysql.jdbc.Driver"; 

3、获取连接:

a、注册驱动: DrvierManager加载驱动,通过类名反向加载类,加载后该驱动会注册到DriverManager中,相当于安装驱动。

方式一:Class.forName("DRIVER");
推荐这种方式,不会对具体的驱动类产生依赖。

方式二:DriverManager.registerDriver(DIRVER);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

装载MySql驱动:

Class.forName("com.mysql.jdbc.Driver");

装载Oracle驱动:

Class.forName("oracle.jdbc.driver.OracleDriver");

b、使用DriverManager类来得到Connection对象:

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);

连接MySql数据库:

Connection conn = DriverManager.getConnection
         ("jdbc:mysql://host:port/database", "user", "password");

连接Oracle数据库:

Connection conn = DriverManager.getConnection
         ("jdbc:oracle:thin:@host:port:database", "user", "password");

连接SqlServer数据库:

Connection conn = DriverManager.getConnection 
("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

4、创建执行SQL的语句Statement:

String sql = "select * from 表名 where id = ?";  //'?'占位符

使用PreparedStatement除了主键外,所有的参数值全部写成占位符
PreparedStatement pstmt = conn.PreparedStatement(sql); // 发送sql语句

pstmt.setObject(参数); //给占位符赋值

RsultSet rs = pstmt.executeQuery(); //获取查询结果

5、处理执行结果:(一般在DQL中使用)

ORM:(ObjectRelationshipModel)对象关系模型

对象数据库映射模型:

数据库中的表对应java的类
一行记录(一个实体)对应java中的一个对象,多行记录对应一个List
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
    //一行记录(一个实体)对应java中的一个对象
    Dog dog = new Dog();
    //通过列值给对象的属性赋值
    //取列值:rs.getXXX(列号/列名):一般使用列名,列号从1开头
    dog.setName(rs.getString("name"));
    dog.setHealth(rs.getInt("health"));
    dog.setLove(rs.getInt("love"));
    dog.setStrain(rs.getString("strain"));
    //最后把dog加入dogList中
    dogList.add(dog);
}

6、释放资源:

a、数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
b、都要加try catch 以防前面关闭出错,后面的就不执行了

//先开后关
try {
    if(rs != null){
        rs.close();
    }

    if(stmt != null){
        stmt.close();
    }

    if(conn != null){
        conn.close();
    } 

} catch (SQLException e) {
    e.printStackTrace();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值