一.JDBC简介
jdbc(java DateBase connection):java数据库连接.是建立数据库与java代码的连接桥梁.
二.配置jdbc的步骤
使用框架的话,直接在xml文件里配置就可以了.在这里写下在java代码连接数据库的步骤
(1)首先加入jar包并build path
mysql-connector-java-5.0.8-bin.jar 这个包可以自行网上下载,
(2)加载驱动
try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
(3)建立连接
url:jdbc:mysql://localhost:3306/house
端口号3306是安装的时候选择的
house就是你在数据库建立的数据库名称
user:root
password:root
用户名跟密码是自己当初安装数据库自行设计的
Connection con=DriverManager.getConnection(url,user,password);
(4)获取执行sql语言的对象
sql=" ";
PreparedStatement p=con.preparedStatement(sql);
(5)执行sql语句
增删改
p.executeUpdate()
列如:sql语句sql="INSERT into employees values (?, ?, ?)");
PreparedStatement p=con.preparedStatement(sql);
for (int n = 0; n < 100; n++) {
ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.executeUpdate();
}
顺便讲解下PreparedStatement 与 Statement的区别
(1)JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的. PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询.
JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.
Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性发送多个查询给数据库. 例如, 让我们来比较一下同样引用上面的例子.
例 1: 多次执行
PreparedStatement ps = conn.prepareStatement( "INSERT into employees values (?, ?, ?)");
for (n = 0; n < 100; n++) {
ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.executeUpdate(); }
例 2: 使用Batch PreparedStatement ps = conn.prepareStatement( "INSERT into employees values (?, ?, ?)"); for (n = 0; n < 100; n++) {
ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.addBatch(); }
ps.executeBatch();
在例 1中, PreparedStatement被用来多次执行INSERT语句. 在这里, 执行了100次INSERT操作, 共有101次网络往返. 其中,1次往返是预储statement, 另外100次往返执行每个迭代. 在例2中, 当在100次INSERT操作中使用addBatch()方法时, 只有两次网络往返. 1次往返是预储statement, 另一次是执行batch命令. 虽然Batch命令会用到更多的数据库的CPU周期, 但是通过减少网络往返,性能得到提高.
记住, JDBC的性能最大的增进是减少JDBC驱动与数据库之间的网络通讯.
(2)最主要的就是安全问题,防止sql的注入
在后面加入 or 1=1;因为数据库进行判断的时候select * from user where user=' 'and password=' ' or 1=1;
这个时候数据库还是能通过的,但是你用preparestament可以避免这个.'
查询
ResultSet rs=p.executeQuery(sql);
输出结果集的内容:
while(rs.next()){
xx 变量名=rs.getxx(列名或者列序号);
举例:
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
(列是从左到右编号的,并且从列1开始)
}
(6)执行完需要关闭jdbc对象
1、关闭记录集 2、关闭声明 3、关闭连接对象
try {
if (rs != null) {
rs.close();//关闭查询结果集rs对象
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (p != null) {
p.close();//关闭数据库对象
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (con != null) {
con.close();
}//关闭连接对象
} catch (SQLException e) {
e.printStackTrace();
}