java开发常用数据库:mysql、oracle;安卓开发常用:sqlite。JDBC大部分时候会屏蔽数据库差异。
Mysql特点:
1、开放源码 2、高效(阿里、京东等很多大公司用) 3、适用于所有平台
4、支持多线程,充分利用CPU资源,性能出色 5、价格便宜 6、大数据处理,可处理5千万条数据
如果不用MySQL,可以在下图所示的地方停止MySQL服务
一、JDBC是一套面向对象的应用程序接口(API),制定了访问各种关系数据库的统一接口。
二、JDBC不能直接访问数据库,必须依赖数据库厂商提供的JDBC驱动程序完成以下三步工作 a 同数据库建立连接 b 向数据库发送SQL语句 c 处理从数据库返回的结果
三、JDBC的四种驱动类型器:JDBC-ODBC桥连、JDBC-Native桥连、JDBC网络驱动、本地协议驱动(最常用)。
四、JDBC中常用的接口和类:
1、Drive接口,每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的额类。
2、DriverManager类,java.sql.DriverManager类是JDBC的管理层,作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。
3、Connection接口,java.sql.Connection接口代表与特定数据库的链接,在链接中可执行SQL语句并返回结果,还可以通过GetMetaData()方法获得由数据库提供的相关信息,如数据表、存储过程、链接功能等相关信息。
4、Statement接口,java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。
5、PreparedStatement接口,继承并扩展了Statement接口,用来执行动态的SQL语句。通过PreparedStatement实例执行的动态SQL语句将被预编译保存到PreparedStatement实例中,从而可以反复并高效的执行该SQL语句。
6、CallableStatement接口,java.sql.CallableStatement继承并扩展了PreparedStatement接口,用来执行SQL的存储过程。
7、ResultSet接口,java.sql.ResultSet接口类似于一个数据表,通过该接口实例可获得检索结果集。
package com.testjdbc;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.spi.DirStateFactory.Result;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
/**
* 测试PreparedStatment的基本用法
*
* @author Administrator
*
*/
public class demo3 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
PreparedStatement ps = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接(建立连接其实包含了Socket对象,是一个远程连接,比较耗时!这是connection对象管理的一个要点。)
//开发中,为了调高效率,都会使用连接池来管理连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
//Statement实际工作中使用较少,传参麻烦,容易sql注入
stmt = conn.createStatement();
//sql操作语句可以从Navicat的“查询”中粘贴复制
String sql = "INSERT INTO t_user (username,pwd,regtime) VALUES ('王五',555,NOW());"
stmt.execute(sql);
//测试sql注入
String id = "5 or 1=1"; //这种恶意写法会让语句永远为真,从而删除整个数据库。
String sql = "delete from u_user where id" + id;
stmt.execute(sql);
//通过传参数时候的预处理,可以有效的防止sql注入
String sql = "INSERT INTO t_user (username,pwd,regtime) VALUES (?, ?);" //?是占位符
ps = conn.prepareStatement(sql);
//传参,直接使用Object可以不用判断参数类型,直接使用。
ps.setObject(1, "张琪"); //这里的索引从0开始计算,而不是1
ps.setObject(1, "haj");
ps.setObject(3, new java.sql.Data(System.currentTimeMillis()));
//stmt.execute(sql);
//stmt.execute(sql)用的比较少,应为不返回参数;stmt.executeQuery(sql)用来查询;stmt.executeUpdate(sql)用来增删改
//ResultSet的用法
ResultSet rs = st.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1)+"----"+rs.getString(2)+"----"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally { //后开的先关
//正确的关闭顺序ResultSet ----> Statement ----> Connection,要将try-catch块分开写。
try {
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
五、事务:
1、概念:一组要么同时执行成功、要么执行失败的SQL语句。是数据库操作的一个执行单元。
2、事务开始于DML语句(INSERT/UPDATE/DELETE);结束于COMMIT(执行成功提交表格)、ROLLBACK(执行失败回滚到初始状态)、CREAT TABLE(创建新表格)、DCL语句(如GRANT,修改权限)、断开和数据库的链接。
3、事务的四大特点:
原子性:要么同时成功,要么同时失败。
一致性:一旦执行过程中有一条语句执行失败,数据要回滚到所有数据执行之前的状态。
隔离性:A事务在操作数据库的时候可以对其他事务设置相应的隔离级别(读取未提交、读取已提交(常用默认)、可重复读、序列化(效率最低,锁表禁止访问))
持久性:一旦事务完成,硬盘上的数据状态会被持久的改变。