001.JDBC
1.JDBC:java database connectivity ; java连接数据库
简单来说,jdbc就是一组规范;将对所有关系型数据库的操作都抽象出来的规范;
作用:采用统一的方式来操作各种数据库;
2.如何通过jdbc来访问数据库;
JDBC中常用的接口和实现类;
DriverManager:驱动程序管理器,用来管理驱动,并获得连接;
Connection:连接;代表java与数据库的一个连接;
Statement :声明;用来向数据库发送sql;
3.使用jdbc访问数据的步骤
加载驱动 ;
Class.forName("com.mysql.jdbc.Driver");
获得连接;
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/books","root","tiger");
创建声明
Statement st=conn.createStatement();
执行sql
st.execute(sql);
st.executeUpdate();
关闭资源
st.close();
conn.close();
代码如下:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得连接
//String url:jdbc:子协议:子名称
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "tiger");
//3.创建声明
Statement st=conn.createStatement();
//4.执行sql
String sql="insert into tb_book values(null,'1984',32,'乔治·奥威尔')";
st.execute(sql);
//5.关闭资源
st.close();
conn.close();
}
}
002.Statement方法
1.DriverManager类
作用:管理驱动,并且可以获得数据库连接;
方法:
public static Connection getConnection(url,userName,password);
创建一个类,将加载驱动放在静态块里,获得连接定义为静态方法,代码如下:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil {
static String url="jdbc:mysql://localhost:3306/test";
static String userName="root";
static String password="tiger";
//加载驱动
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获得连接
public static Connection getConnection() {
try {
return DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
关于关闭资源:java1.7之后的try可以:
String sql="";
try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
st.execute(sql);
}
无论是否产生异常,在try执行后会自动关闭资源(包括网络、流等可关闭的资源)
最终代码如下:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String sql="select * from tb_book";
try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
st.execute(sql);
}
}
}
2.Connection
代表与数据库的连接;连接用完一定要立即关闭;
方法:
createStatement():创建声明;
preparedStatement(); 创建预编译的声明;
setAutoCommit():事务是否为自动提交;
commit;
rollback:控制事务;
3.Statement (声明)
作用:用来执行各种sql
方法:
boolean execute(sql);
所有语句都可执行;执行语句后是否存在结果集;
int executeUpdate(sql);
受影响的记录数量;
ResultSet executeQuery();
003.ResultSet
ResultSet
Result代表结果集
.next():移动光标,如果有下一条记录则返回true,否则返回false;
.get<Type>(int): 根据列号获得当前记录的一个字段的值,并将值转换成<Type>类型,
.get<Type>(String):根据列名查询出当前记录的字段值,并转换成<Type>类型
.close():关闭资源;
004.PreparedStatement
1.什么是sql注入;
通过传递一个sql 片段来破坏原有的sql语名,及达到sql攻击的目的;
2.PreparedStatment 接口;
它是Statment的子接口,是预编译的Statment ;此接口的特点;
①解决sql注入的问题;
②为不同的数据类型赋值更加方便;
③同一个sql执行多次时,性能更好;
建议:如果sql中带参数,则建议使用preparedSstatement;
3.使用ps的步骤;
String sql="select * from miaosha_user where userid=? and password=?";
//定义预编译的ps; 用?代表可变的参数;
PreparedStatement ps=conn.prepareStatement(sql);
//给通配符赋值;
ps.setString(1, name);
ps.setString(2, passwd);
//执行sql;
ResultSet rs=ps.executeQuery();
4.ps的方法;
set<Type>(int,Object):给指定位置的通配符赋值;
executeQuery();
executeUpdate();
execute();
以上三个方法,都没有参数;
005.日期类型
关于日期类型的映射;
java.util.Date;
在jdbc中,表示java中时间可以使用以下三个类型,这三个类型都是java.util.Date 的子类;并且都在java.sql包中;
Date:只表示日期;
Time:只表示时间
Timestamp:表示一个精确的时间(日期+时间)
006.事务控制
1.关于事务的处理;
登录;
表:用户信息表;
uid,nickname,password.login_time,login_count,amount;
登录日志;
logid,uid,login_time,score;
2.在jdbc中如何控制事务?
在jdbc中通过Connection来控制事务;
三个方法;
setAutoCommit(false);
commit():提交
rollback():回退;
示例;
Connection conn=JdbcUtil.getConnection();
conn.setAutoCmmit(false);
try{
ps.execute();...
.....();
conn.commit();
}catch(Exception e){
conn.rollback();
}finally{
conn.close();
}
007.元数据
元数据(MetaData)
用来描述数据的数据;
用来描述数据的含义的一些信息;
jdbc为我们提供了多种元数据;主要有;
表示数据库连接的元数据;
DatabaseMetaData ; conn.getMetaData();
表示结果集的元数据;
ResultSetMetaData result.getMetaData();
方法有;
getColumnCount():获得结果集的列数;
getColumnLabel():获得列名
getColumnType():获得列的数据类型;
008.大对象的处理
jdbc对大数据的处理;
思路;
1、使用Connection.createBlob()创建一个blob对象;
2、获得这个blob 对象的输出流;setBinaryStream(1);
3、向流中写入字节;
4、通过ps.setBlob()将二进制存在数据库中;
//创建一个Blob类型;
Blob blob=conn.createBlob();
//获得blob的输出流;
OutputStream os=blob.setBinaryStream(1);
//此处省略向os中写入字节的代码
ps.setBlob(3, blob);
009.大对象的读取 010.返回生成的主键
如何获得数据库生成的主键
通过一个重载的prepareStatement(sql,int);来设置是否返回由数据库生成的主键 ;然后再使用ps.getGenereatedKeys()来获得包含主键的结果集;
PreparedStatement ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
ps.execute();
//获得生成的主键;
ResultSet keys=ps.getGeneratedKeys();
keys.next();
System.out.println("生成的主键是:"+keys.getInt(1));
总结
元数据 ;MetaData;
大对象;
BLOB:binary Large Object;
返回生成的主键 ;
事务:
作业;注册功能;
受教育经历;