一、理解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();
}

}