一、理解JDBC查询数据库的原理
jdbc java 数据库的原理
1、它是java给我们提供的用于连接多种关系习性数据库的一套API(接口类);
2.jdbc是java访问数据库的标准规范,JDBC是提供了一种基准,据此可以构建更高级的工具和接口,是数据库开发人员能够编写数据库的应用的程序
3.他们都是接口,如果运行使用,必须寻找对应的实现类
4.java作为平台(类似于你的笔记本电脑)它只是负责接口的提供,不负责具体的实现,(笔记本将接口规范好,如果有想能够在此笔记本电脑上使用相应的电源,鼠标,都需要根据这个接口进行适配)
二、掌握JDBC操作数据库的使用
JDBC操作数据库步骤简介
1.数据库操作编程模板
``java
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','tonglei@',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();
}
}2.具体的实现了一个完整的jdbc操作的流程
①注册/加载驱动 通过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”)
①注册/加载驱动 通过DriverManager(驱动管理类)
```java
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://192.168.12.136/数据库名
username和password:数据库用户名和密码
Connection conn = DriverManager.getConnection(url,username,password);
③创建语句执行者
④语句执行者执行sql语句,并且返回结果集
Statement state = conn.createStatement();
ResultSet execteQuery(String sql);适用于查询ResulteSet封装了查询结果
int execcteUpdate(String sql);适用于执行增加删除修改的操作⑤对结果集进行处理
⑥释放资源,必须保证是先开的后关,而且必须是在finally中进行关闭
四、数据库的删除和增加和修改的操作
1.进行查询的操作
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try{
//.1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库的连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kgcnews","root","root");
//3.创建语句执行者
state = conn.createStatement();
//4.编写sql语句并且进行执行
String sql = "select * from news_user";
rs = state.exectuteQuert(sql);
//5.处理结果集
//结果集Result它可以理解为是一张数据的二维表
//boolean next();判断是否还有下一行内容,如果有就指向了下一行
while(rs.next()){
//rs.getString(int columnIndex);获取指定索引列的数据,索引是从11开始的
//rs.getString(String columLable);获取指定列的名称
//int id = rs.getInt(1);
//String userName = rs.getString(2);
int id = rs.getString("id");
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接口的使用
1.可以解决sql注入的问题,而且可以提高查询的性能
2.它可以实现将SQL提前进行编译,然后当赋值之后就可以快速执行
3.如果编译过后的sql再次被执行的时候,那么将直接不会再及进行重新编译了
Connection conn = null;
PreparedStatement ps = null;
Result rs = null;
try{
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn = DriverManaget.getConnection("jdbc:mysql://localhost:3306/news_user","root","root");
//3。创建sql执行语句
state = conn.createStatement();
//4.使用占位符编写sql语句,未来需要给其中的占位符进行赋值
Sring sql = "select * from news_user where userName = ? and password = ?";
ps = conn.prepareStatement(sql);
//5。给占位符进行赋值
// ps.setInt(parameterIndex, x)
// ps.setString(parameterIndex, x)
ps.setString(1,username);
ps.setString(2,password);
//6.处理结果集
if(rs.next()){
//存储用户信息
//因为是session 的作用域大。可以保持一个会话的内容,例如从注册到注册成功页面再到登录界面可以进行连续的跳转,保留的内容,这也是session的内置对象的好处。也是session的重定向转发的体现之处。
//以键值对的形式将用户名的对象和值存在session对象中
session.setAttribute("loginUser",username);
//响应给登录成功的界面
response.sendRedirect("success.jsp");
}else{
//请求转发就是在一次请求中有效,再一次请求就会失效
//设置请求属性
request.setAttribute("error","用户名或者是密码错误");
//请求转发的地址
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}catch(Exception e){
e.printStack();
}finally{
//释放资源
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
















