使用Java来操作数据库
JDBC API
实现java程序对各种数据库的访问
一组接口和类,位于java.sql与javax.sql包
面向接口编程(interface接口 class类)
1. 理解JDBC查询数据库的原理
JDBC Java数据库连接
它是Java给我们提供的用于连接多种关系型数据库的一套API(接口和类)。
是Java 访问数据库的标准规范
。JDBC 提供了一种基准
,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
它们都是接口,如果运行使用,必须寻找对应的实现类。
那么Java作为平台(类似于你的笔记本),它只负责接口的提供,不负责具体的实现(笔记本将接口规范好,如果有想能够在此笔记本上使用的相应电源、鼠标…都需要根据这个接口进行适配)。
所以各位数据库厂商,想能够接入Java平台,那么必须提供此接口对应的实现类(驱动)。
2. 掌握JDBC操作数据库的使用
JDBC操作数据库步骤简介
数据库操作编程模板1:
Connection conn = null;
Statement state = null;
try {
// 1.加载/注册驱动 Class.forname("com.mysql.jdbc.Driver");
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
// 2.获取连接对象
// http://
String url = "jdbc:mysql://localhost:3306/kgcnews";
conn = DriverManager.getConnection(url, "root", "root");
// 3.创建语句执行者
state = conn.createStatement();
// 4.执行SQL语句
String sql = "INSERT INTO news_user(userName,`password`,email,userType)" +
"VALUES('tonglei','tonglei','[email protected]',0)";
// 查询使用此API
// ResultSet rs = state.executeQuery(sql);
// 增删改SQL使用此API 返回的是影响行数
int row = state.executeUpdate(sql);
// 5.处理结果集
if(row > 0) {
System.out.println("添加成功!");
}else {
System.out.println("添加失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源 先开的后关
if(state != null) {
state.close();
}
if(conn != null) {
conn.close();
}
}
- 注册/加载驱动 通过DriverManager(驱动管理类)
-
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a
-
driver by doing Class.forName(“foo.bah.Driver”)
public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } }
- 获取连接 通过DriverManager建立连接
// url:
// jdbc(固定前缀):mysql(oracle...)://数据库服务器主机:端口/数据库名?额外连接参数
// 如果数据库在本机,可以不写数据库地址 jdbc:mysql:///数据名
// jdbc:mysql://192.168.12.138/数据库名
// username和password:数据库用户名和密码
Connection conn = DriverManger.getConnection(url,username,password);
-
创建语句执行者
-
语句执行者执行SQL语句,并返回结果集
Statement state = conn.createStatement(); // ResultSet executeQuery(String sql); 适用于查询 ResultSet封装了查询结果 // int executeUpdate(String sql); 适用于执行增删改操作 返回影响行数
-
对结果集进行处理
-
释放资源 必须保证先开的后关 而且必须在finally中关闭
数据库的删除 修改和查询
查询:
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql:///kgcnews", "root", "root");
// 3.创建语句执行者
state = conn.createStatement();
// 4.编写SQL语句 并执行
String sql = "select * from news_user";
rs = state.executeQuery(sql);
// 5.处理结果集 结果集ResultSet 它可以理解为一张数据二维表
// boolean next() 判断是否还有下一行内容 如果有则向下移动指针
while(rs.next()) {
// rs.getString(int columnIndex) 获取指定索引列的数据 索引列从1开始
// rs.getString(String columnLabel)
int id = rs.getInt(1);
// String userName = rs.getString(2);
String userName = rs.getString("userName");
String email = rs.getString("email");
int userType = rs.getInt("userType");
System.out.println(id+" - "+userName+" - "+email+" - "+userType);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源
if(rs != null) {
rs.close();
}
if(state != null) {
state.close();
}
if(conn != null) {
conn.close();
}
}
掌握PrepareStatement接口的使用
可以解决SQL注入攻击问题 而且可以提高查询性能。
它可以实现将SQL提前进行编译,然后当赋值之后可以快速执行。
如果编译过后的SQL再次被执行,那么将直接执行不会再重新编译。
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql:///kgcnews","root","root");
// 3.编写SQL 创建语句执行者
// state = conn.createStatement();
// ? 占位符 未来需要给其进行参数传值
String sql = "select * from news_user where userName = ? and password = ?";
ps = conn.prepareStatement(sql);
// 4.给占位符赋值
// ps.setInt(parameterIndex, x)
// ps.setString(parameterIndex, x)
ps.setString(1, username);
ps.setString(2, password);
// 5.执行SQL语句
// ps.executeUpdate() 增删改
rs = ps.executeQuery();
// 6.处理结果集
if(rs.next()){
// 存储用户信息
session.setAttribute("loginUser", username);
response.sendRedirect("success.jsp");
}else{
request.setAttribute("error", "用户名或密码错误!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}catch(Exception e){
e.printStackTrace();
request.setAttribute("error", "服务器繁忙!请重试!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}finally{
// 7.释放资源
if(rs != null){
rs.close();
}
if(ps != null) {
ps.close();
}
if(conn != null) {
conn.close();
}
}