1.JDBC API
做的三件事情主要是通过以下类/接口实现:
DriverManager 管理jdbc驱动
Connection 连接(通过DriverManager产生)
Statement(PreparedStatement) 增删改查(通过Connection产生)
CallableStatement 调用数据库中的存储过程/存储函数(通过Connnection产生)
Result 返回的结果集(通过上面的Statement等产生)
方法简介:
Connection 产生操作数据库对象:
Connnection产生Statement对象:createStatement()
Connnection产生PreparedStatement对象:prepareStatement()
Connnection产生CallableStatement对象:prepareCall()
Statement操作数据库:
增删改:executeUpdate()
查询:executeQuery()
ResultSet:保存结果集 select * from xxx
next():判断下一行是否有数据(true/false)
getXXX(字段名|位置):获取具体的字段值
PreparedStatement操作数据库:
因为public interface PreparedStatement extends Statement
因此
增删改:executeUpdate()
查询:executeQuery()
赋值操作:setXXX()
PreparedStatement与Statement在使用时的区别:
1.Statement
写String sql=”xxx”;
之后executeUpdate(sql)
2.PreparedStatement
在String sql=”xxx”中可能存在占位符?(在创建PreparedStatement时,将sql预编译)
executeUpdate()
SetXXX()替换占位符?(两个参数,第一个用1234表示第几个?;第二个则是对应的值,数字就直接写,字符串加双引号)
推荐使用PreparedStatement原因如下:
1.编码更加简便(虽然代码长点,但是避免了字符串拼接)
String name="zs";
int age=23;
//stmt:(stmt要先创建为null)
String sql="insert into student(stuno,stuname) values('"+name+"',"+age+")";//字符串拼接
stmt.executeUpdate(sql);
pstmt:(也要先创建为null)
String sql="insert into student(stuno,stuname) values(?,?)";
pstmt=connection.preparedStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
2.提高性能(因为预编译)
3.安全(可以有效地防止sql注入)
2.JDBC访问数据库的具体步骤
a.导入驱动,加载具体的驱动类(eclipse里面先把jar包复制过来,再buildpath):
Class.forName(“具体驱动类”);
b.与数据库建立连接:
Connection connection=DriverManager.getConnection(“连接字符串”,”用户名”,”密码”);
c.发送sql,执行sql命令(增删改、查):
Statement stmt=connection.createStatement();
String sql=”xxxx”;(按照表的属性来写,自己写代码主要是改这个sql,其他的都是模板)
int count=stmt.executeUpdate(sql);//返回值表示增删改几条数据;如果是查询,则是executeQuery,同时返回的不是一个数,而是结果集
//ResultSet
//最后记得关闭一下
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();//先开的后关
d.处理结果集(需要查询时)
3.数据库驱动
驱动jar | 具体驱动类 | 连接字符串(数据库名:IP+端口号) | |
---|---|---|---|
Oracle | ojdbc-x.jar | oracle.jdbc.OracleDriver | jdbc:oracle:thin:@localhost:1521:ORCL |
MySQL | mysql-connector-java-x.jar | com.mysql.jdbc.Driver | jdbc:mysql://localhost:3306/数据库实例名 |
SQLServer | sqljdbc-x.jar | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:microsoft:sqlserver:localhost:1433;databasename=数据库实例名 |
4.JDBC总结(模板)
1.模板:
try{
a.导入驱动包,加载具体驱动类Class.forName("具体驱动类")
b.与数据库建立连接
connection=DriverManager.getConnection(...)
c.通过connection,获取操作数据库的对象(Statement\preparedStatement\callablestatement)
stmt=connection.createStatement()
d.(查询)处理结果集rs=pstmt.executeQuery()
while(rs.next()){
rs.getXxx(..);}
}catch(ClassNotFoundException e)
catch(SQLException e)
catch(Exception e)
finally{
//打开顺序与关闭顺序相反
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();
}
[注]: JDBC中,除了Class.forName() 抛出ClassNotFoundException,其余方法都抛SQLException
2.JSP访问数据库
JSP就是在html中嵌套JAVA代码,因此JAVA代码可以直接写在JSP里(<%…%>)
导包操作
JAVA项目:1.JAR包复制到工程中;2.右键该JAR:build path->add to buile path
Web项目:JAR包复制到WEB-INF中lib即可
核心:就是把JAVA中JDBC代码复制到JSP的<%..%>中
[注]: 如果JSP出现:XXX import is not resolved …
尝试解决步骤:
a.可能是tomcat、jdk版本问题:右键项目->build path,将其中报错的library或lib删除后重新导入
b.情空各种缓存:右键项目->clean tomcat… (project->clean或进tomcat目录删除里面work的子目录)
c.删除之前的tomcat,重新解压缩、配置tomcat重启电脑
d.把java类放到包里面(新建一个),然后在JSP里面导包
3.JAVABean(一个JAVA类)
将JSP里面登陆操作的代码,转移到了java文件中,其中的LoginDao.java就叫JAVABean
JAVABean的作用:提高代码复用、减轻JSP复杂度
JAVABean的定义:public修饰的类,public无参构造以及所有属性(有的话)都是private,并且提供set/get(如果是Boolean类型,则get可以换成is)
使用层面JAVABean分为两类:
a.封装业务逻辑的JAVABean(LoginDao.java封装了登陆逻辑)
可以将JSP中的JDBC代码封装到Login.java类中
b.封装数据的JAVABean(实体类、Student.java、Person.java)
对应于数据库中的一张表
Login login=new Login(uname,wpwd);//即用Login对象封装了2个数据(用户名和密码)
封装数据的JAVABean对应于数据库中一张表:Login(name,pwd)
封装业务逻辑的JAVABean用于操作一个封装数据的JavaBean