JDBC工作原理
• JDBC定义接口
• 数据库厂商实现接口
• 程序员调用接口,实际调用的是底层数据库厂商的实现部分
JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet。
1.连接:Connection
2.操作数据 Statement
3.结果 ResultSet
具体实现步骤
1.导jar包 数据库驱动包-JDBC实现类
mysql-connector
ojdbc
2.连接数据库
a.加载驱动类
com.mysql.jdbc.Driver
oracle.jdbc.OracleDriver
可能产生异常:
1.类名写错 2.jar包没有导入
mysql: Class.forName(“com.mysql.jdbc.Driver”);
oracle: Class.forName(“oracle.jdbc.OracleDriver”);
b.获得数据库连接 工具类 DriverManager
oracle :ip port sid username password
mysql:ip port username password database
oracle-jdbc:oracle:@thin:192.168.6.66:1521:orcl ip 端口 sid
mysql-jdbc:mysql://127.0.0.1:3306/test ip 端口 库
mysql-jdbc:mysql:///test 只适用于本地默认端口号的数据库
误
可能产生异常 SQLException
账号密码错
url错误
例:
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection(“jdbc:mysql:///test”, “root”, “123456”);
Statement stmt=conn.createStatement();
c.操作数据库
String sql1=“alter table func add(agee int(2))”;
boolean b=stmt.execute(sql1);
System.out.println(b);//返回false 因为修改表结构无返回值
stmt.executeQuery();//DQL,有返回集ResultSet
stmt.execute();//DDL DML DQL
stmt.executeUpdate();//DML
sql注入
例:通过字符串拼接,拼接成一个恒成立的条件
改变了原来的语义
password=‘a’ or ‘b’=‘b’
解决:预编译的Statement
半成品sql 先进行预编译 确定了语义
Connection conn= JDBCUtils.getConnection();
String sql= "insert into user_cj values(null,?,null,?)";
PreparedStatement stmt=conn.prepareStatement(sql);//注入sql语句了
for(int i=0;i<100;i++){
stmt.setInt(1,i);
stmt.setInt(2,i);
stmt.addBatch();//将sql语句加入执行队列中
}
stmt.executeBatch();//批量执行sql语句
分页查询
oracle:rownum 5~10 下标从1开始
select * from
(select rownum n, name from user) u
where u.n between 5 and 10;
mysql:
select * from user limt 4,6; 下标从0开始 从4开始 取6条
效率较低,将数据全部查询后 取需要的数据
数据量越大 效率越低