码迷,mamicode.com
首页 > 数据库 > 详细

jdbc学习over

时间:2019-10-06 11:48:56      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:mon   开启   程序   inf   sts   用户   mysqld   boolean   clist   

这次的代码和之前学习到一般的代码主要就是将一些很常见的操作(建立连接、清除连接)不管做什么操作都需要用到它们,所以将它们单独放到另一个工具类里面去。

用到的术语:

1.事务:https://www.cnblogs.com/cstdio1/p/11626657.html

2.缓冲池(数据源):https://www.cnblogs.com/chy18883701161/p/11374731.html

 

主逻辑代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import JDBCUtils.JDBCUtils;
import JDBCUtils.JDCPDataSource;

public class MysqlDemo1 {

	public static void main(String[] args) {
		selectAll();
		//System.out.println(selectByUsernamePassword2("zs","123"));
		//sql注入
		//System.out.println(selectByUsernamePassword("zs","12347‘or‘1‘=‘1"));
		//PageSearch(1,2);
		//insert("sdf","249.1");
		//delete("sdf");
		//update("zs","123","000");
		transAccount("zs","ls",1000);
	}
	public static void selectAll(){
	// TODO Auto-generated method stub
	Connection con=null;
	Statement stmt=null;
	ResultSet rs=null;
	try {
		con = JDCPDataSource.getConnection();
		stmt = con.createStatement();
		String SqlRequest = "select * from student";
		rs= stmt.executeQuery(SqlRequest);
		while(rs.next()){
		System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4));	
		//System.out.println(rs.getString("id")+" "+rs.getString("stu_name")+" "+rs.getString("stu_sex")+" "+rs.getString("stu_score"));
		}
		
		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		JDCPDataSource.closeResource(rs, stmt, con);
		//JDBCUtils.closeResource(rs, stmt, con);
	}		
		
		
		
		
}
	
	public static boolean selectByUsernamePassword(String username,String password){//验证用户名和密码(字符串拼接的方式存在sql注入的问题)

		Connection con=null;
		Statement stmt=null;
		ResultSet rs=null;
		
		try {
			con = JDBCUtils.getConnection();
			stmt = con.createStatement();
			String requestSql="select * from user where u_name=‘"+username+"‘and u_password=‘"+password+"‘";
		   System.out.print(requestSql);
			rs = stmt.executeQuery(requestSql);
		     if(rs.next()){
		    	 return true;
		     }else{
		    	 return false;
		     }
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			JDBCUtils.closeResource(rs, stmt, con);
		}
		
		return false;
		
	}

	public static boolean selectByUsernamePassword2(String username,String password){//验证用户名和密码(版本2可以防止sql注入)

		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			con = JDBCUtils.getConnection();
		    String RequestSql="select *from user where u_name=? and u_password=? ";
			 pstmt = con.prepareStatement(RequestSql);
			
			pstmt.setString(1, username);
			pstmt.setString(2,password);
			rs = pstmt.executeQuery();
		     if(rs.next()){
		    	 return true;
		     }else{
		    	 return false;
		     }
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{

			JDBCUtils.closeResource(rs, pstmt, con);
		}
		
		return false;
		
		
		
	}
	/*
	 *PageNum:查询第几页
	 *LineNum:总共显示多少行 
	 */
	public static void PageSearch(int PageNum,int LineNum){
               //分页查询
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			
			con = JDBCUtils.getConnection();
		       String RequestSql="select *from user limit ?,?";
			pstmt = con.prepareStatement(RequestSql);
			
			pstmt.setInt(1,(PageNum-1)*LineNum);
			pstmt.setInt(2,LineNum);
			rs = pstmt.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString(1)+" "+rs.getString(2));
			}
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCUtils.closeResource(rs, pstmt, con);
			
		}
			
			
	}

	public static void insert(String UserName,String Password){
               //新注册的信息进行插入操作
		
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		int mark=0;
		try {
			con = JDBCUtils.getConnection();
		    String RequestSql="insert into user(u_name,u_password) values(?,?)";
			pstmt = con.prepareStatement(RequestSql);
			
			pstmt.setString(1, UserName);
			pstmt.setString(2,Password);
			mark = pstmt.executeUpdate();
			if(mark>0){
				System.out.println("插入成功");
			}else{
				System.out.println("插入失败");
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{

			JDBCUtils.closeResource(rs, pstmt, con);
		}
		
		
		
		
	}

	public static void delete(String UserName){

		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		int mark=0;
		try {
			con = JDBCUtils.getConnection();
		    String RequestSql="delete from user where u_name = ?";
			pstmt = con.prepareStatement(RequestSql);
			
			pstmt.setString(1, UserName);
			mark = pstmt.executeUpdate();
			if(mark>0){
				System.out.println("删除成功");
			}else{
				System.out.println("删除失败");
			}

			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{

			JDBCUtils.closeResource(rs, pstmt, con);
		}
	}

	public static void update(String UserName,String OldPassword,String NewPassword){
		//修改用户密码

		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		int mark=0;
		try {
			con = JDBCUtils.getConnection();
		    String RequestSql="update user set u_password = ? where u_name = ? and u_password = ? ";
			pstmt = con.prepareStatement(RequestSql);
			
			pstmt.setString(1, NewPassword);
			pstmt.setString(2, UserName);
			pstmt.setString(3, OldPassword);
			mark = pstmt.executeUpdate();
			if(mark>0){
				System.out.println("修改成功");
			}else{
				System.out.println("修改失败");
			}

			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{

			JDBCUtils.closeResource(rs, pstmt, con);
		}
	}

	public static void transAccount(String UserName1,String UserName2,int money){
	//转账操作(利用事务)
		Connection con=null;
		PreparedStatement pstmt1=null;
		PreparedStatement pstmt2=null;
		ResultSet rs=null;
		try {
			con = JDBCUtils.getConnection();
			con.setAutoCommit(false);//开启事务
		        String sql="update user set u_balance = u_balance - ? where u_name = ? ";
			pstmt1 = con.prepareStatement(sql);
			
			pstmt1.setInt(1, money);
			pstmt1.setString(2, UserName1);
			pstmt1.executeUpdate();
		
//			String s=null;模拟异常情况(断电、数据库崩溃)
//			s.charAt(2);

			sql = "update user set u_balance = u_balance + ? where u_name = ? ";
			pstmt2 = con.prepareStatement(sql);
			pstmt2.setInt(1, money);
			pstmt2.setString(2, UserName2);
			pstmt2.executeUpdate();			
			
			con.commit();//事务完成
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{

			JDBCUtils.closeResource(rs, pstmt1, con);
			JDBCUtils.closeResource(null, pstmt2, null);
		}
		
	}
}

分页查询的公式:

技术图片

 

 

JDBC工具类:

package JDBCUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class JDBCUtils {
	private static final String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false"; 
	private static final String user="root";
	private static final String password="root";
	private static ArrayList <Connection> Clist = new ArrayList<Connection>();//保存连接
	
	static{
		for(int i=0;i<10;i++){
		Connection con = createConnection();//创建连接
		Clist.add(con);//添加到容器中
		}
	}
	
	public static Connection getConnection(){
		if(Clist.isEmpty()==false){
			Connection con = Clist.get(0);//得到容器中的连接
			Clist.remove(con);
			return con;
		}else{
			return createConnection();//创建连接
		}
	}
	public static Connection createConnection(){
		try {
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection(url,user,password);//建立和mysql数据库的连接
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//选择注册驱动
		
		return null;
	}
	
	public static void closeResource(ResultSet rs,Statement stmt,Connection con){
		try {
			if(rs!=null)
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		try {
			if(stmt!=null)
			stmt.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

//		try {
//			if(con!=null)
//			con.close();
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		Clist.add(con);
	}
	
	public static void closeResource(ResultSet rs,PreparedStatement pstmt,Connection con){
		try {
			if(rs!=null)
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		try {
			if(pstmt!=null)
			pstmt.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

//		try {
//			if(con!=null)
//			con.close();
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		Clist.add(con);//这里的连接不需要关闭,因为在不断建立连接和取消连接的过程会消耗很多时间,所以引入了缓冲池(数据源)的概念
	}
}

 

我们上面的工具类的数据源是我们自己利用容器去模拟它去实现的,实际上已经有一些现成的我们可以直接使用的,例如:dbcp、c3p0。

 

DBCP数据源(工具类版本2):

package JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.dbcp2.BasicDataSource;

public class JDCPDataSource {
	private static final String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false"; 
	private static final String user="root";
	private static final String password="root";
	private static BasicDataSource ds;
	
	static{
		ds = new BasicDataSource();
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl(url);
		ds.setUsername(user);
		ds.setPassword(password);
		
		ds.setInitialSize(5);//设置初始连接
		ds.setMaxTotal(20);//设置最大连接数
		ds.setMinIdle(3);//设置最小空闲连接(一旦小于最小空闲连接它会自动创建连接以达到最小空闲连接)
	}
	public static Connection getConnection(){
		
		try {
			return ds.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	public static void closeResource(ResultSet rs,Statement stmt,Connection con){
		try {
			if(rs!=null)
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		try {
			if(stmt!=null)
			stmt.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		try {
			if(con!=null)
			con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static void closeResource(ResultSet rs,PreparedStatement pstmt,Connection con){
		try {
			if(rs!=null)
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		try {
			if(pstmt!=null)
			pstmt.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		try {
			if(con!=null)
			con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
}  

 

注意:使用dbcp时需要下载:第一个是核心包、后面两个都是核心包所依赖的东西,不下程序会显示找不到Class

技术图片

 

 

c3p0使用方法类似,不做过多演示 

  

jdbc学习over

标签:mon   开启   程序   inf   sts   用户   mysqld   boolean   clist   

原文地址:https://www.cnblogs.com/cstdio1/p/11626623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!