Java数据库连接代码
//其实这句话也可以不用写,会在META-INF文件夹下存在
Class.forName("com.mysql.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","123456");
//这个我们用的是preparedStatement,如过想用statement,代码如下,但是用statement会出现sql注入问题和效率问题,一般情况下都是使用,preparedStatement
PreparedStatement ps =connection.prepareStatement(sql);
//编写sql语句
String sql ="select * from student";
// 执行sql代码
ResultSet resultSet = ps.executeQuery();
//根据数据库中的字段名获取数据库中的数据,这个和集合中的迭代器对象差不多
while (resultSet.next()){
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
System.out.println(resultSet.getInt("age"));
System.out.println(resultSet.getDate("birthday"));
}
//释放资源
if(ps != null){
try{
ps.close();
}catch(Exception e){
}
ps = null; //断开栈中变量和堆中对象的引用关系,堆中对象可以被gc快速回收
}
ps.close();
这是mysql不用加载驱动的原因,在jar包中会自动执行
MySql 常见对象
DriverManager
- Connection
- Statement
- PreparedStatement
- ResultSet
1、DriverManager
功能一:注册驱动
注册驱动真实代码:
DriverManager.registerDriver(new Driver());
com.mysql.jdbc.Driver类内部代码,因为在Driver中存在静态代码块,所以直接执行 Class.forName(“com.mysql.jdbc.Driver”);就会在Driver类加载的时候执行.不需要再创建对象,执行注册驱动动作.
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
通过Driver的内部代码,我们可以知道,在new Driver()对象时,已经完成注册,所以DriverManager.registerDriver(new Driver())操作会造成
取动重复注册,但是如果new() 对象,存在问题
new Driver(); – 可以注册,但是会产生一个垃圾对象
Driver.class – 这种方式获取的类的字节码对象是一个半成品,类的初始化并没有执行(static静态代码块没有执行,仅仅只是创建了静态变量)
功能二:获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
2、Connection
功能一:获取执行sql的对象
Statement createStatement(); 这个对象存在sql注入安全问题和效s率问题
PreparedStatement prepareStatement(String sql); // sql 是一个预编译的sql语句,他的所有参数通过?占位 不会出现注入问题,而且sql是预编译,执行的速度也是比较快的.
功能二:执行事务管理
- setAutoCommit(false) ; //开启事务
commit(); // 提交事务
rollback(); // 回滚事务
try{
//开启事务
conn.setAutoCommit(false);
//执行一组关联的sql操作
dao1.xx(conn);
dao2.yy(conn);
//提交事务
conn.commit();
}catch(Exception e){
//回滚事务
conn.rollback();
}
注意:事务控制的代码应该放在Service层,因为只有在Service层获取的Connection对象,才能保证多个Dao操作使用的是同一个,这样才能保证是同一个事务
3、Statement
功能一:执行sql语句
Statement 这个对象存在sql注入安全问题和效s率问题
- int executeUpdate(String sql);
这个可以执行增删改查的操作- ResultSet executeQuery(String sql);
这个执行查询的操作
4、PreparedStatement
功能一:执行sql语句
PreparedStatement prepareStatement(String sql); // sql 是一个预编译的sql语句,他的所有参数通过?占位 不会出现注入问题,而且sql是预编译,执行的速度也是比较快的.
- int executeUpdate();
- ResultSet executeQuery();
在执行操作之前,一定要给预编译的sql中的?赋值
** 5、ResultSet**
功能一:解析结果
//根据数据库中的字段名获取数据库中的数据,这个和集合中的迭代器对象差不多
while (resultSet.next()){
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
System.out.println(resultSet.getInt("age"));
System.out.println(resultSet.getDate("birthday"));
}