使用Java来操作数据库

使用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();
	}
}
  1. 注册/加载驱动 通过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!");
            }
        }
     }
    
  1. 获取连接 通过DriverManager建立连接
// url:   
// 		jdbc(固定前缀):mysql(oracle...)://数据库服务器主机:端口/数据库名?额外连接参数
// 如果数据库在本机,可以不写数据库地址 jdbc:mysql:///数据名
// jdbc:mysql://192.168.12.138/数据库名
// username和password:数据库用户名和密码
Connection conn = DriverManger.getConnection(url,username,password);
  1. 创建语句执行者

  2. 语句执行者执行SQL语句,并返回结果集

    Statement state = conn.createStatement(); 
    // ResultSet  executeQuery(String sql);  适用于查询 ResultSet封装了查询结果
    // int executeUpdate(String sql); 适用于执行增删改操作  返回影响行数
    
  3. 对结果集进行处理

  4. 释放资源 必须保证先开的后关 而且必须在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();
		}
	}

猜你喜欢

转载自blog.csdn.net/weixin_44637905/article/details/89883947