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