zoukankan      html  css  js  c++  java
  • JDBC优化之路-1

    1.原始JDBC使用

    数据表:

    项目目录:


    dao层:IUserDao.java

    package com.hpe.dao;
    
    import java.util.List;
    
    import com.hpe.pojo.User;
    
    public interface IUserDao {
    	User login(User user);
    	List<User> selectAll();
    }
    

    dao实现层:UserDaoImpl.java

    package com.hpe.dao.impl;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.hpe.dao.IUserDao;
    import com.hpe.pojo.User;
    
    public class UserDaoImpl implements IUserDao {
    	
    	@Override
    	public User login(User user) {
    		// 使用原生JDBC
    		/*
    		 * 1.加载驱动
    		 * 2.创建连接对象
    		 * 3.创建执行对象
    		 * 4.操作数据库
    		 * 5.关闭资源
    		 */
    		Connection conn=null;
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		User resUser=null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			
    			String url = "jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8";
    			String username="root";
    			String password="root";
    		        conn=DriverManager.getConnection(url, username, password);
    			
    			String sql = "select * from users where name=? and pwd=?";
    			ps=conn.prepareStatement(sql);
    			
    			ps.setString(1, user.getName());//下标从1开始
    			ps.setString(2, user.getPwd());
    			
    			rs  = ps.executeQuery();
    			
    			if(rs.next()){
    				int id = rs.getInt("id");//也可以使用1(下标从1开始),习惯用表的列名
    				String name = rs.getString("name");
    				String pwd = rs.getString("pwd");
    				
    				resUser = new User();
    				resUser.setId(id);
    				resUser.setName(name);
    				resUser.setPwd(pwd);
    			}		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("请正确配置驱动程序");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			try {
    				if(rs!=null){
    					rs.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				if(ps!=null){
    					ps.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				if(conn!=null){
    					conn.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		return resUser;
    	}
    	@Override
    	public List<User> selectAll() {
    		Connection conn=null;
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		List<User>list=new ArrayList<>();
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			
    			String url = "jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8";
    			String username="root";
    			String password="root";
    		        conn=DriverManager.getConnection(url, username, password);
    			
    			String sql = "select * from users ";
    			ps=conn.prepareStatement(sql);
    			
    			rs  = ps.executeQuery();
    			
    			while(rs.next()){
    				int id = rs.getInt("id");//也可以使用1(下标从1开始),习惯用表的列名
    				String name = rs.getString("name");
    				String pwd = rs.getString("pwd");
    				
    				User resUser = new User();
    				resUser.setId(id);
    				resUser.setName(name);
    				resUser.setPwd(pwd);
    				
    				list.add(resUser);
    			}		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("请正确配置驱动程序");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			try {
    				if(rs!=null){
    					rs.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				if(ps!=null){
    					ps.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				if(conn!=null){
    					conn.close();
    				}		
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		return list;
    	}	
    }
    

    实体类:User.java

    package com.hpe.pojo;
    
    public class User {
    	private int id;
    	private String name;
    	private String pwd;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
    	}
    	
    }
    

    测试类:MainTest.java

    package com.hpe.test;
    
    import java.util.List;
    
    import org.junit.Test;
    
    import com.hpe.dao.IUserDao;
    import com.hpe.dao.impl.UserDaoImpl;
    import com.hpe.pojo.User;
    
    public class MainTest {
    	@Test
    	public void user_login(){
    		IUserDao iUserDao = new UserDaoImpl();
    		
    		User user = new User();
    		user.setName("admin");
    		user.setPwd("123");
    		User resUser = iUserDao.login(user);
    		
    		if (resUser != null){
    			System.out.println("登录成功");
    			System.out.println(resUser);
    		}
    		else{
    			System.out.println("登录失败");
    		}
    	}
    	
    	@Test
    	public void selectAll(){
    		IUserDao iUserDao = new UserDaoImpl();
    		List<User> list = iUserDao.selectAll();
    		
    		for (User user : list) {
    		System.out.println(user);	
    		}
    	}
    }
    

    大量重复代码使程序很繁琐,接下来进行优化。

    第一步优化:

    dao实现层:UserDaoImpl.java:

    package com.hpe.dao.impl;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.hpe.dao.IUserDao;
    import com.hpe.pojo.User;
    
    public class UserDaoImpl implements IUserDao {
    	private Connection getConn() throws ClassNotFoundException, SQLException{
    		Class.forName("com.mysql.jdbc.Driver");
    		
    		String url = "jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8";
    		String username="root";
    		String password="root";
    	        Connection conn=DriverManager.getConnection(url, username, password);
    	        return conn;
    	}
    	private void close(ResultSet rs,PreparedStatement ps,Connection conn){
    		try {
    			if(rs!=null){
    				rs.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			if(ps!=null){
    				ps.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			if(conn!=null){
    				conn.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	@Override
    	public User login(User user) {
    		// 使用原生JDBC
    		/*
    		 * 1.加载驱动
    		 * 2.创建连接对象
    		 * 3.创建执行对象
    		 * 4.操作数据库
    		 * 5.关闭资源
    		 */
    		Connection conn=null;
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		User resUser=null;
    		try {
    			
    			conn=getConn();
    			String sql = "select * from users where name=? and pwd=?";
    			ps=conn.prepareStatement(sql);
    			
    			ps.setString(1, user.getName());//下标从1开始
    			ps.setString(2, user.getPwd());
    			
    			rs  = ps.executeQuery();
    			
    			if(rs.next()){
    				int id = rs.getInt("id");//也可以使用1(下标从1开始),习惯用表的列名
    				String name = rs.getString("name");
    				String pwd = rs.getString("pwd");
    				
    				resUser = new User();
    				resUser.setId(id);
    				resUser.setName(name);
    				resUser.setPwd(pwd);
    			}		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("请正确配置驱动程序");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			close(rs, ps, conn);
    		}
    		return resUser;
    	}
    	@Override
    	public List<User> selectAll() {
    		Connection conn=null;
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		List<User>list=new ArrayList<>();
    		try {
    			
    		    conn=getConn();
    			
    			String sql = "select * from users ";
    			ps=conn.prepareStatement(sql);
    			
    			rs  = ps.executeQuery();
    			
    			while(rs.next()){
    				int id = rs.getInt("id");//也可以使用1(下标从1开始),习惯用表的列名
    				String name = rs.getString("name");
    				String pwd = rs.getString("pwd");
    				
    				User resUser = new User();
    				resUser.setId(id);
    				resUser.setName(name);
    				resUser.setPwd(pwd);
    				
    				list.add(resUser);
    			}		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("请正确配置驱动程序");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    		close(rs, ps, conn);
    		}
    		return list;
    	}	
    }
    

    第二步优化:

    dao实现层:UserDaoImpl.java:

    package com.hpe.dao.impl;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.hpe.dao.IUserDao;
    import com.hpe.pojo.User;
    
    public class UserDaoImpl implements IUserDao {
    	private Connection getConn() throws ClassNotFoundException, SQLException{
    		Class.forName("com.mysql.jdbc.Driver");
    		
    		String url = "jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8";
    		String username="root";
    		String password="root";
    	        Connection conn=DriverManager.getConnection(url, username, password);
    	        return conn;
    	}
    	private void close(ResultSet rs,PreparedStatement ps,Connection conn){
    		try {
    			if(rs!=null){
    				rs.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			if(ps!=null){
    				ps.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			if(conn!=null){
    				conn.close();
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	private List<User> select(String sql,Object[] params){
    		Connection conn=null;
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		List<User>list =new ArrayList<>();
    		try {
    			conn=getConn();		
    			ps=conn.prepareStatement(sql);
    			if(params != null){
    				for(int i=0;i<params.length;i++){
    				   ps.setObject(i+1, params[i]);
    				}
    			}	
    			rs  = ps.executeQuery();			
    			while(rs.next()){
    				int id = rs.getInt("id");//也可以使用1(下标从1开始),习惯用表的列名
    				String name = rs.getString("name");
    				String pwd = rs.getString("pwd");
    				
    				User resUser = new User();
    				resUser.setId(id);
    				resUser.setName(name);
    				resUser.setPwd(pwd);
    				
    				list.add(resUser);
    			}		
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("请正确配置驱动程序");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			close(rs, ps, conn);
    		}
    		return list;
    	}
    	private User selectObject(String sql,Object[] params){
    		List<User> list = select(sql, params);
    		User resUser = null;
    		if(list.size()>0){
    		    resUser=list.get(0);
    		} 
    		return resUser;
    	}
    	@Override
    	public User login(User user) {	
    		String sql = "select * from users where name=? and pwd=?";
    		Object[] params = {user.getName(),user.getPwd()};		
    		User resUser = selectObject(sql, params);
    		return resUser;
    	}
    	@Override
    	public List<User> selectAll() {		
    		String sql = "select * from users ";
    		List<User>list=select(sql, null);
    		return list;
    	}	
    }




  • 相关阅读:
    python第22天作业
    python之常见模块(一)
    python之包和文件目录规范
    python第20天作业
    python之模块
    python之匿名函数
    Python算法之二分法
    间间间间简陋版书城系统
    python第十九天作业
    4-1作业
  • 原文地址:https://www.cnblogs.com/mlan/p/11060387.html
Copyright © 2011-2022 走看看