介绍
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
使用
以MySQL为例
添加jar包:mysql-connector-java-x.x.xx-bin.jar
原生JDBC
public static void main(String[] args) throws SQLException {
//得到mysql的驱动的Class对象
//1.加载驱动
//Class.forName("com.mysql.jdbc.Driver");
//各个数据库都不同
//jdbc:mysql://[IP][:port]/[database]
//String url="jdbc:mysql://localhost:3306/teach";
//2.获取连接
//Connection con = DriverManager.getConnection(url,"root" ,"123456" );
Connection con = ConnectionUtil.getConn();
//3.获取查询管理器对象
//a.普通查询管理器 b.防注入式查询管理器
Statement st = con.createStatement();
//4.编写sql语句 最后不允许加;
String sql = "SELECT * FROM student";
String sql1 = "insert into student (no,name,sex)VALUES(110,'黄蓉','女')";
//5.执行sql语句
// a.执行DML语句executeUpdate(sql)
ResultSet set = st.executeQuery(sql);
//6.解析结果集
while (set.next()){
//a.封装对象 尽量不要使用map
//b.读取列信息
//通过类型调用不同的get方法 getString(下标,从1开始), getObject()需要强转
//getString(列名);
int no = set.getInt(1);
String name = set.getString(2);
String sex = set.getString("sex");
String birthday = set.getString("birthday");
String sClass = set.getString(5);
Student student =new Student(no,name,sex,birthday,sClass,null);
System.out.println(student);
}
set.close();
// b.执行DQL语句,得到结果集executeQuery(sql)
int c = st.executeUpdate(sql1);
System.out.println(c);
//c.execute() DML,DQL
//如果你确定了SQL语句的类型 不要使用execute
boolean l = st.execute(sql);//DML 返回false DQL返回true
//预处理防注入
//(1).使用防注入的SQL语句不允许连接变量,在有变量的位置使用占位符?替代
String sql = "SELECT * FROM student WHERE name=? AND password=? ";
//(2).使用防SQL注入的查询管理器对象PreparedStatement
PreparedStatement pre =conn.prepareStatement(sql);
//(3).替换占位符参数,下标从1开始
pre.setString(1,user);
pre.setString(2,password);
//(4).使用防注入之后查询的时候不需要再次带入sql语句
ResultSet set = pre.executeQuery();
Student student = null;
while (set.next()){
int no = set.getInt(1);
String sex = set.getString("sex");
String birthday = set.getString("birthday");
String sClass = set.getString(5);
student =new Student(no,user,sex,birthday,sClass,password);
System.out.println(student);
}
//6[7].关闭资源
con.close();
st.close();
}
利用配置文件并封装成工具类
db.properties
jdbcDriver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/test
jdbcUser=root
jdbcPassword=123456
public class PropertiesUtil {
private static Properties pro = new Properties();
static {
try {
pro.load(new FileReader("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
//获取配置文件中的属性
public static String getValue(String key){
return pro.getProperty(key);
}
}
public class ConnectionUtil {
static {
try {
Class.forName(PropertiesUtil.getValue("jdbcDriver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获得连接方法
public static Connection getConn() {
Connection con = null;
try {
//各个数据库都不同
//jdbc:mysql://[IP][:port]/[database]
//2.获取连接
con= DriverManager.getConnection(PropertiesUtil.getValue("jdbcUrl")
, PropertiesUtil.getValue("jdbcUser"), PropertiesUtil.getValue("jdbcPassword"));
}catch (SQLException e){
e.printStackTrace();
}
return con;
}
//关闭资源的方法
public static void close(Connection conn, Statement st, ResultSet set){
try {
if(set!=null){
set.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}