1.JDBC总体开发流程 1.加载驱动(只需要加载一次,也可自动加载)
Class.forName
2.获得连接
public Connection getConn(){
Connection conn=null;
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost/test","root","zx199710170019");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
3.创建声明
conn.createStatement(sql)
conn.prepareStatement(sql)
4.执行sql
stat.execute(sql)等等
5.关闭资源(close)
public void close(AutoCloseable auto){
if(auto!=null){
try {
auto.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.JDBC主要的三个接口:
Coonection
Statement
ResultSet
3.JDBC中的日期类型处
Date:日期(2017-)
Time:时间
Timestamp:日期+时间(精度很高)
都是java.util Date的子类。但就是不能用java.util的Date(日期+时间)。读取可以用,set设置不能用。
4.Coonection
代表着与数据库之间的一个连接。
1.可以用来创建声明:
conn.createStatement(sql)
conn.prepareStatement(sql)
2.可以用来控制事物:
conn.setAutoCommit(false); //先将自动提交设为false
conn.commit(); //所有语句执行完之后执行此代码提交
conn.rollback();//若有某一语句出现异常,执行此代码回滚
String url="jdbc:mysql://localhost/test";
Connection conn=getConnection(url,"root","zx199710170019");
conn.setAutoCommit(false);
java.sql.PreparedStatement sta=null;
try {
sta=conn.prepareStatement("insert into tbbook value(null,?,?,?)",Statement.RETURN_GENERATED_KEYS);
sta.setString(1,"追风筝的人");
sta.setInt(2, 99);
sta.setString(3, "阿富汗出版社");
sta.execute();
ResultSet rs=sta.getGeneratedKeys();
while(rs.next()){
System.out.println(rs.getInt(1));
}
conn.commit();
}catch(SQLException e){
System.out.println("插入失败。。。");
conn.rollback();
}finally {
sta.close();
conn.close();
}
3.可以用来处理二进制大对象(Blob)
存储:
// Blob b=conn.createBlob(); //创建blob对象
// OutputStream os=b.setBinaryStream(1); //向blob对象中存储字节
// ps.setString(1, "霍乱时期的爱情");
// ps.setInt(2, 99);
// ps.setString(3,"中国出版社");
// FileInputStream fis=new FileInputStream(url); //获取要存的图片
// byte[] bt=new byte[fis.available()];
// fis.read(bt); //从流读入字节数组中
// fis.close();
// os.write(bt); //向blob的输出流输出字节数组
// os.close();
// ps.setBlob(4, b); //存入
查询:
rs.getBlob(); //用ResultSet获取Blob对象
blob.getBinaryStream();//获取blob对象输入流
再从输入流中获取二进制字节,输出就再用输出流就行了。
5.Statement
Statement是声明,用来向数据库中发发送sql语句的。
常用方法:
execute(sql):执行语句,返回值为boolean,成功就返回true,否则返回false;
executeUpdate(sql):返回值是int,返回的是sql语句影响的记录的条数
executeQuery(sql):返回值是ResultSet,返回结果集
6.PreparedStatement
PreparedStatement是Statement的子接口,用法类似。但ps可以用来解决一系列sql语句插入数据本身的问题。
PreparedStatement是预编译的,效率 更高。
常规用法:
PreparedStatement sta=null;
try {
sta=conn.prepareStatement("insert into tbbook value(null,?,?,?)",Statement.RETURN_GENERATED_KEYS);
sta.setString(1,"追风筝的人");
sta.setInt(2, 99);
sta.setString(3, "阿富汗出版社");
sta.execute();
可见
PreparedStatement解决了插入数据多变的问题,实际上插入的数据肯定是多变的,所以更好用。
7.ResultSet
代表着sql语句执行后的结果集。
可以从ResultSet中获取执行Sql语句后获得的结果数据;
即方法rs.getXXXX();//xxxx是数据的类型,参数可以是对应的属性名
try {
ps=conn.prepareStatement("select * from t_user where userName=?");
ps.setString(1, userName);
ResultSet rs=ps.executeQuery();
while(rs.next()){
user.setUserName(rs.getString("userName"));
user.setPwd(rs.getString("pwd"));
user.setEmail(rs.getString("email"));
}
ResultSet的指针最初是指向第0个这样,所以每次rs.next()指向下一个查询的结果。
8.小总结
JDBC解决了java操作数据库的问题,在java中可以查询数据库,也可以向数据库中存东西。
先用Connection获取连接,要有数据库url,账号,密码;再利用PreparedStatement查询或存储记录(很少用Statement)
,要是查询就可以用ResultSet获取到查询的结果,然后就可以输出显示什么的了。每一步都可以封装起来,代码差不多,
很方便。