jdbc使用分为五个步骤
一:注册驱动
二:建立与数据库的连接,获得连接对象
三:根据连接对象,获得一个对象
四:根据获得的对象执行SQL语句
五:释放资源(关流)
一:注册驱动
DriverManager.registerDriver(new Driver());
//因为驱动是分厂家的
//使用上述方法会有重复性的操作
//所以推荐使用以下方法
Class.forName("com.mysql.jdbc.Driver");
//上述方法会得到com.mysql.jdbc.Driver类的一个类的对象
//首先它会将这个类加载到内存中
//当这个类加载进内存后
//这个类的静态代码块就会跟着执行
//所以在静态代码块中,就已经成功注册了驱动的代码
二:建立与数据库的连接,获得连接对象
//方法一:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jdbc",
"root",
"111111"
);
//方法二:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jdbc? user=root&password=111111");
//? 起到的作用是连接参数
//user是参数名,root是参数值(数据库用户名)
//&是与,在参数与参数之间起到连接作用
//方法三:
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbc",properties
);
//创建一个properties对象
//用来存储参数,用户名密码
Properties properties = new Properties();
//以key-value的方式存储
properties.setProperty("user","root");
properties.setProperty("password","111111");
三:根据连接对象,获得一个对象
//方法一:
根据连接对象,获得statement对象
Statement statement = conn.createStatement();
//上述方法存在SQL注入漏洞所以并不推荐使用
//推荐方法如下
//方法二:
//查询表stu中张益达的所有信息
//获得预处理对象
PreparedStatement pstmt = conn.prepareStatement
//?只为一个占位符
("select * from stu where name = ?;");
// 1 为第一个?号的位置
//假如想往第二个问号里添加参数那么就写2
//假如要使用增删改功能,那么在values后面括号中
//是否有null或是否有具体的值无关
//在sql语句中有几个问号,那么就需要传递多少个参数
pstmt.setString(1,"张益达");
//执行语句并把它传入rs中
//查询使用executeQuery
//增删改使用executeUpdate
ResultSet rs = pstmt.executeQuery();
//遍历循环输出rs中的内容
while (rs.next()){
System.out.println(
"id:"+rs.getObject(1)+"\n"+
"名字:"+rs.getObject(2)+"\n"+
"年龄:"+rs.getObject(3)
);
}
## 四:根据获得的对象执行SQL语句 ##
//由获取到statement对象,执行sql语句
statement.execute(“你需要执行的sql语句”)
//同理
//查询使用executeQuery
//增删改使用executeUpdate
//在使用executeQuery与executeUpdate他们的返回值为受影响 的行数即为int类型
int a = statement.executeQuery(“你需要执行的sql语句”);
//如果使用execute则是布尔类型
//即执行sql语句后,得到了一个ResultSet对象就会返回true
//如果得到的是受影响的行数,或者没有得到什么结果,那么返回 false;
//得出的结果一般使用xx.next进行while循环遍历输出
## 五:释放资源(关流) ##
释放资源即流即使用try catch finally进行关流
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//建立集合接收结果并遍历输出
List stus = new ArrayList<>();
try {
Class.forName(“com.mysql.jdbc.Driver”);
conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/jdbc?user=root&password=111111");
// jdbc: mysql://localhost: 3306 /jdbc ? 参数
// 协议 子协议 本机地址 端口号 数据库名字
stmt = conn.createStatement();
//执行查询语句
rs = stmt.executeQuery
("SELECT * FROM stu;");
//判断下一行有没有数据
//如果有数据,会返回true,没有数据的话就返回false
//true就循环,false就停止
while (rs.next()){
//创建stu对象,并将数据set进stu对象中
Stu stu = new Stu();
stu.setId(rs.getInt(1));
stu.setName(rs.getString(2));
stu.setAge(rs.getInt(3));
//添加到集合里
stus.add(stu);
}
for (Stu stu:stus){
//输出一下
System.out.println(stu.toString());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
在上述代码中使用了javaBean即建一个类封装一个方法进去
使用javaBean有两个注意事项
1:javaBean中,一定要有一个空参数的构造方法
2:javaBean中的属性,可以不是成员变量,但是属性名一定要与表中的字段名一致
## JdbcUtil ##
使用JdbcUtil会帮助我们更便捷的注册使用Jdbc
先建立一个配置文件Jdbcfg.properties来存储我们的驱动,地址与用户密码,更改只需在配置文件更改即可
//驱动类的路径
private static String driverClass=null;
//连接数据库使用的url
private static String url = null;
//用户名和密码
private static String user = null;
private static String password = null;
private static Connection conn =null;
static {
try {
ClassLoader cl = JdbcUtil.class.getClassLoader();
InputStream stream = cl.getResourceAsStream(“jdbcfg.properties”);
//得到流中的数据
//创建一个Properties对象
Properties prop = new Properties();
//通过Properties对象的load方法,加载流中的数据
prop.load(stream);
//根据key,获得value
driverClass = prop.getProperty(“driverClass”);
url = prop.getProperty(“url”);
user = prop.getProperty(“user”);
password = prop.getProperty(“password”);
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//写一个静态方法,获取连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//写一个静态方法,获得stmt对象
public static Statement getStatement() throws SQLException {
conn = getConnection();
return conn.createStatement();
}
public static void release(){
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void release( Statement stmt){
release(stmt,null);
}
//写一个静态方法,来释放资源
//如果想要释放Connection对象,需要调用Connection对象的close方法
//所以需要将Connection对象传入到release方法中
//然后再release方法中调用该对象的close方法
//释放资源
//statement对象与ResultSet对象同理
public static void release( Statement stmt, ResultSet rs){
release();
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
配置文件为:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/c
user=root
password=111111
使用时只需 Connection conn = JdbcUtil.getConnection();即可
## 批处理 ##
需要向数据库发送多条sql语句时, 为了提升执行效率, 可以考虑采用JDBC的批处理机制.
Connection conn = JdbcUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement
(“INSERT INTO stu VALUES (?,?,?);”);
pstmt.setInt(1,8);
pstmt.setString(2,”僚机”);
pstmt.setInt(3,20);
//通过这个方法可以实现批处理操作
//调用这个方法后,会将这个sql先存起来,等待执行
pstmt.addBatch();
pstmt.setInt(1,9);
pstmt.setString(2,"机长");
pstmt.setInt(3,25);
//又存了一条等待执行
pstmt.addBatch();
//执行批处理中存着的sql语句
//批处理中各个sql语句之间执行成功或失败是无联系的
//即使第一条语句会出现主键重复的错误
//也不会影响第二条语句将数据插入到数据库中
//因此推荐使用事物操作
pstmt.executeBatch();
## 事物 ##
对数据的修改要么全部执行 要么全部不执行
事物的编写需要在try catch 中进行
Connection conn =null;
try {
conn = JdbcUtil.getConnection();
//设置提交方式为手动提交
//开启事物
conn.setAutoCommit(false);
//创建一个预处理对象
PreparedStatement pstmt = conn.prepareStatement
(“UPDATE 表名 SET m=? WHERE name=?;”);
pstmt.setInt(1,700);
pstmt.setString(2,"张大炮");
pstmt.executeUpdate();
pstmt.setInt(1,1300);
pstmt.setString(2,"张益达");
pstmt.executeUpdate();
//操作无异常,提交事务
conn.commit();
} catch (Exception e) {
//回滚到事物开始之前状态
try {
//操作出现异常,撤销事务:
conn.rollback();
System.out.println("回滚了");
} catch (SQLException e1) {
e1.printStackTrace();
}
}
“`
DbUtils
DbUtils是Apache提供的一个开源的
方便我们操作的jdbc的jar包
QuerRunner类,是该jar包的核心类
所有的操作数据库的方法都被封装在这个类中更新,
查询都是使用QueryRunner类