继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

数据库之JDBC小知识点总结(I)

霜花似雪
关注TA
已关注
手记 163
粉丝 1.5万
获赞 8507

OOP:封装,继承,多态
语句对象的作用就是用来执行SQL语句
DDL(create table/alter table/drop table/truncate table)
DML(insert/update/delete)
DQL(select)

不同的数据库中DDL语音不同
//ORacle
create table users(
id integer not null,
username nvarchar2(20),
password nvarchar2(20),
constraint users_pk primary key(id)
);
create table users(
id integer primary key users_pk,
username nvarchar2(20),
password nvarchar2(20)
);

//students表中插入数据,注意插入时间的方法
insert into students values (15,'萧峰','男',to_date('1998-12-12', 'yyyy-MM-dd'),'民族武术','河南省开封市')

//注意Oracle数据库的日期和MySQL,SQLServer有区别,
//Oracle日期写法:to_date('1998-12-12', 'yyyy-MM-dd')
//Oracle数据库的insert,update,create等语句结尾处不加;
在Navicate中建立Oracle数据表,所有字段名均要大写,才不会出错

//MySQL
create table users(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);

create table students(
sid int primary key auto_increment,
sname varchar(20) not null,
gender varchar(1),
birthday date,
marjor varchar(50),
address varchar(50)
);

insert into students (sname,gender,birthday,address) values('李四','男','1992-12-21','云南');

//SQL Server
create table users(
id int primary key identity(1,1),
username nvarchar2(20),
password nvarchar2(20)
);

insert into users (username,password) value ('成龙','123456');
select @@identity; //获得新插入语句的主键(与插入语句同时执行)

结构体就是类的前身,结构体里面只能定于属性不能定于方法。
而类即可以定义属性也可以定于方法

加强for循环写法:不需要知道循环次数
for(数组类型 数组类型的变量:数组名)
{
System.out.println(数组类型变量+" ");
}

数据库主键:唯一的,不能修改,不能为空

10.50.1600
10主版本号
50次版本号

分层:
view:视图层
db:数据库层(工具类)
entity:实体层
util:工具层
dao:业务逻辑接口层(数据库的增删查改)

1)加载驱动(在JDBC4即JDK1.6情况下,可以省略)
Class.forName("oracle.jdbc.driver.OracleDriver");
2)建立数据库连接,orcl数据库名,test用户名,test123456密码
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "test", "test123456");//oracle数据库
3)创建Statement实例
stmt = conn.createStatement();
4)执行SQL语句
sql = "select * from student";
rs = stmt.executeQuery(sql);
5)处理执行结果
while(rs.next()){
System.out.print(rs.getInt(1) + "\t");
System.out.print(rs.getString(2) + "\t");
System.out.print(rs.getInt(3) + "\n");
}

驱动用来连接到数据库
可以装载多个驱动
DBC API使用驱动与数据库引擎建立连接
语法
Class.forName(driverName);
示例
//不同的数据库,驱动各不相同
//由数据库厂商提供,可以在数据库厂商的网站下载
Class.forName("oracle.jdbc.driver.OracleDriver”);//Oracle数据库
Class.forName("com.mysql.jdbc.Driver");// MySQL数据库
// oracle.jdbc.driver.OracleDriver是Oracle数据库的Java驱动类名
// com.mysql.jdbc.Driver是MySQL数据库的Java驱动类名

常用的数据库对应的JDBC驱动
JDBC-ODBC:sun.jdbc.odbc.JdbcOdbcDriver
Oracle:oracle.jdbc.driver.OracleDriver
MySQL:com.mysql.jdbc.Driver
Sybase:com.sybase.jdbc2.jdbc.SybDriver
SQL Server:com.microsoft.jdbc.sqlserver.SQLServerDriver

不是固定不变的,与数据库的版本有关
在数据库厂商的网站上下载

建立数据库的连接:
使用驱动创建连接,连接建立后就可以访问数据
创建数据库连接
DriverManager类调用getConnection(urlString)方法
获得一个Connection对象
URL被解析用来查找数据库服务器的位置
当驱动收到URL(数据库)的确认响应时, DriverManager创建一个连接
当驱动不能匹配会返回null,并对下一个驱动进行检测
连接创建失败时,会抛出SQLException异常

使用getConnection()方法:
方法:getConnection(String url)
语法:Connection conn = DriverManager.getConnection(参数)
示例(不同的数据库URL字符串格式不同)
1)Oracle
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl", " test ", " test123456");
2)mysql
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?user=root&password=root");

JDBC URL语法:
使用URL来查找数据库服务器的位置
常见数据库的URL
JDBC-ODBC:jdbc:odbc:ODBC名称
Oracle:jdbc:oracle:thin:@ computerName或IP地址:端口:数据库名称
MySQL: jdbc:mysql://computerName或IP地址 :端口/数据库名称
Sybase:jdbc:sybase:Tds:computerName或IP地址:端口
SQL Server:jdbc:microsoft:sqlserver://computerName或IP地址:端口;databaseName=数据库名称

创建Statement:
Statement对象用来执行SQL语句,对数据进行操作
通过conn.createStatement()方法得到Statement对象
语法
Statement stmt = conn.createStatement();
示例
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.crateStatement();
rs = stmt.executeQuery("select id, name,age from student");
}catch(SQLException e) {}

执行SQL语句:
通过Statement对象将SQL语句原样传送到已经建立连接的数据库并执行
查询数据的SQL语句执行后得到的结果集以表数据的形式存储在java.sql.ResultSet对象中,通过ResultSet对象访问查询结果
executeQuery(sqlString):执行查询相关的SQL语句,返回ResultSet对象
添加,删除,修改数据的SQL语句执行后返回整数,表示受到影响的行数
executeUpdate(sqlString):执行增加,修改,删除相关SQL语句或不返回任何内容的SQL语句

executeQuery(sqlString)
语法
Connection conn = DriverManger.getConnection(urlString);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.excuteQuery(sqlString);
示例
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from student");

executeUpdate(sqlString)
语法
Connection conn = DriverManger.getConnection(urlString);
Statement stmt = conn.createStatement();
int count = stmt.excuteUpdate(sqlString);
示例
Statement stmt = conn.createStatement();
int count= stmt.executeUpdate("update student set age=25 where id=1");

处理Results:
对数据进行添加、删除、修改等操作,SQL执行结束就已经完成
对数据进行查询,查询结果存放在ResultSet对象中
ResultSet对象是满足查询条件的数据行,是数据库表数据的子集
ResultSet
使用游标指向数据行
游标最初定位在第一行之前
boolean rs.next();
当游标指向某行数据,我们就可以从当前行取出需要的数据
在ResultSet对象中使用getXxx(索引或列名)方法获得数据
使用列名称或索引检索数据
rs.getString(2);
rs.getInt("age");

语法
while(rs.next()){
System.out.println(rs.getXxx(索引或列名);
}
示例
ResultSet rs = stm.executeQuery("select * from student");
while(rs.next()){
System.out.print("id: " + rs.getInt(1));
System.out.print("\tname: " + rs.getString(2));
System.out.print("\tage: " + rs.getInt(3));
System.out.println("");
}
getDate(),getDouble(),getFloat(),getInt(),getLong(),getShort(),
getTime(),getString(),getBoolean(),getByte()……

关闭JDBC对象:
所有JDBC对象都需要关闭,关闭顺序应该是从小到大
ResultSet
Statement
Connection
示例
//关闭JDBC对象,释放资源
if(rs != null) try{ rs.close(); }catch(Exception e){}
if(stmt != null) try{ stmt.close(); }catch(Exception e){}
if(conn != null) try{ conn.close(); }catch(Exception e){}

JDBC操作数据的核心:
Connection
应用程序与数据库之间的桥梁
数据库驱动程序是构建桥梁的基石和材料
DriverManager类是基石和材料的管理员
Statement
桥梁上的汽车,在应用程序和数据库之间运送SQL语句和执行结果
ResultSet
执行查询得到的数据集,由若干行和列组成的数据表,是数据库中数据表的子集,有游标


应用JDBC的小结:
注册驱动
1)oracle
Class.forName("oracle.jdbc.driver.OracleDriver");
2)mysql
Class.forName("com.mysql.jdbc.Driver");
建立到数据库的连接
1)oracle
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl","test ", " test123456");
2)mysql
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?user=root&password=root");
创建statement
Statement stmt = conn.createStatement();
执行SQL语句
int count = stmt.executeUpdate("update student set age=25 where id=1");
ResultSet rs = stmt.executeQuery("select * from student");
处理results
while(rs.next()){
rs.getString(2);
}
关闭JDBC对象
try {
if(rs!=null){ rs.close(); }
if(stmt!=null){ stmt.close(); }
if(conn!=null){ conn.close(); }
} catch (SQLException e) {
e.printStackTrace();
}

驱动注册的其他方式:
注册驱动的方式有多种
使用类装载器(Class.forName("类名"))
Class.forName("oracle.jdbc.driver.OracleDriver");//oracle
Class.forName("com.mysql.jdbc.Driver");//mysql
使用new关键字实例化驱动类
在属性文件中配置jdbc.drivers属性
省略驱动程序注册步骤
使用JDBC4.0以上版本(对应JDK1.6)
可以使用new关键字对驱动进行显式的实例化
语法
Driver drv = new DriverConstructor();
DriverManager.registerDriver(drv);
示例
1)oracle
Driver drv = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(drv);
2)mysql
Driver drv = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(drv);
在配置文件中指定驱动类名
语法
jdbc.drivers = driverName

获得连接的其他方法:
通过DriverManager类获得连接对象
方法
getConnection(String url)
getConnection(String url, String user, String passwd)
getConnection(String url, java.util.properties info)
示例
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","test","test123456");
Properties pro = new Properties();
pro.setProperty("user","test"); //键是user,不是username pro.setProperty("password","test123456"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl",pro);
通过驱动对象直接调用connect()方法获得连接
语法
Connection conn = Driver.connect(urlString, properties)
示例
Driver drv = new oracle.jdbc.driver.OracleDriver();
Properties pro = new Properties();
pro.setProperty("user","test");
pro.setProperty("password","test123456");
Connection conn = drv.connect("jdbc:oracle:thin:@localhost:1521:orcl",pro);

Statement相关接口:
Statement:执行静态SQL语句,对数据库进行操作。
Statement stmt = conn.createStatement();
stmt.executeQuery(sql):查询数据
stmt.executeUpdate(sql):添加数据,删除数据,修改数据
PreparedStatement:执行动态SQL语句,对数据库进行操作。
扩展自Statement接口。
对预编译的SQL语句进行处理,提高效率。
CallableStatement:执行数据库存储过程。
扩展自PreparedStatement接口。

PreparedStatement:
对SQL语句的编译结果在缓存中保留,提高多次执行的效率
statement每次执行sql语句,相关数据库都要先将sql语句进行编译,然后执行。
preparedstatement则将sql语句编译的结果保留,可以多次执行。

语法
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setXxx(parameterIndex, x);//设置参数值(参数位置,参数值)
pstmt.executeQuery();//查询数据
pstmt.executeUpdate();//添加数据,删除数据,修改数据

使用prepareStatement查询数据
示例
String sql = "select * from student where id=?";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery();
……
pstmt.setInt(1, 2);
rs = pstmt.executeQuery();//多次查询,效率提升

使用prepareStatement修改数据
示例
String sql = "update student set age=age+? where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 10);
pstmt.setInt(2, 1);
int count = pstmt.executeUpdate();//count值为受影响的记录数

使用prepareStatement添加数据
示例
String sql = "insert into student(id,name,age) values(?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 11);
pstmt.setString(2, "xiaoli");
pstmt.setInt(3,20);
int count =pstmt.executeUpdate(); //count值为受影响的记录数

使用prepareStatement删除数据
示例
String sql = "delete from student where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 11);
int count = pstmt.executeUpdate();

Statement与PreparedStatement比较:
每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,存在sql注入风险。

预编译执行的。在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,
因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。安全性更好,有效防止sql注入问题。由于采用Cache机制,预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来。
执行数据库存储过程—添加数据到数据库
语法
CallableStatement cstmt = conn.prepareCall(sqlString);
示例

String sql = "{call myproc2(?,?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setInt(1,10);
cstmt.setString(2,"sunxin");
int result =cstmt.executeUpdate();

执行数据库存储过程—查询数据
语法
CallableStatement cstmt = conn.prepareCall(sqlString);
示例
String sql = "{call myproc3(?)}";
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, Types.INTEGER);
stmt.execute();
System.out.println("学生数量是:"+stmt.getInt(1));

Mysql创建存储过程:
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
//表示存储过程的结束符号
mysql> DELIMITER //
mysql> create procedure myproc (OUT s int)
BEGIN
select COUNT(*) into s from users;
END

MySQL中文乱码问题:
jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=UTF-8
注意:XML配置文档中的&必须使用实体引用&
properties配置文档可以直接写&

应用JDBC的基本步骤:
注册驱动
使用类装载器(Class.forName(“类名”))
使用new关键字实例化驱动类
在属性文件中配置jdbc.drivers属性
建立到数据库的连接
DriverManager.getConnection(url)
DriverManager.getConnection(url,name,pass)
DriverManager.getConnection(url,properties)
驱动类connect()
创建statement
statement
PreparedStatement
CallableStatement
执行SQL语句
处理results
关闭JDBC对象

JDBC操作Oracle数据库注意事项:
1.表名和字段名必须大写(数据库当中)
2.java中的执行SQL语句字符串末尾不能有;(分号)
3.对于默认格式为'yyyy-MM-dd'的日期格式字符串必须使用
TO_DATE函数转换,转换方法为TO_DATE('XXX','yyyy-mm-dd hh24:mi:ss');

方式二:把oracle的默认日期格式改为yyyy-MM-dd

JDBC操作Mysql:
1.出现中文乱码问题
1)安装MySQL时是否选择使用UTF-8.
检查:MySQL安装目录中,my.ini
2)创建数据库时,是否选择使用了UTF-8.
3)配置文件中,使用加入了UTF-8字符集编码的选项。
A.properties
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
B.xml
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8

打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP