深入了解JDBC的使用

深入了解JDBC的使用

一、JDBC描述
       JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。

二、JDBC架构分类

双层:
在这里插入图片描述
作用:此架构中,Java Applet 或应用直接访问数据源。

条件:要求 Driver 能与访问的数据库交互。

机制:用户命令传给数据库或其他数据源,随之结果被返回。

部署:数据源可以在另一台机器上,用户通过网络连接,称为 C/S配置(可以是内联网或互联网)。

三层:
在这里插入图片描述
侧架构特殊之处在于,引入中间层服务。

流程:命令和结构都会经过该层。

吸引:可以增加企业数据的访问控制,以及多种类型的更新;另外,也可简化应用的部署,并在多数情况下有性能优势。

历史趋势: 以往,因性能问题,中间层都用 C 或 C++ 编写,随着优化编译器(将 Java 字节码 转为 高效的 特定机器码)和技术的发展,如EJB,Java 开始用于中间层的开发这也让 Java 的优势突显出现出来,使用 Java 作为服务器代码语言,JDBC随之被重视。

三、JDBC编程步骤

(1)加载驱动程序

Class.forName(driverClass)
//加载MySql驱动
Class.forName("com.mysql.jdbc.Driver")
//加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver")

(2)获得数据库连接

DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc", "root", "root");

(3)创建Statement\PreparedStatement对象

conn.createStatement();
conn.prepareStatement(sql);

四、JDBC增删改查实例

JDBC连接工具类:

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

public class DbUtil {
    public static final String URL = "jdbc:mysql://localhost:3306/imooc";
    public static final String USER = "root";
    public static final String PASSWORD = "123";
    private static Connection conn = null;
    static{
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2. 获得数据库连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        return conn;
    }

	//关闭Connection
	public static void close(Connection conn){
		//避免出现空指针异常
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	}

	//关闭Statement或PreparedStatement
	public static void close(PreparedStatement pstmt){
		//避免出现空指针异常
		if(pstmt != null){						
			try{
				pstmt.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
			
		}
	}
	
	//关闭ResultSet
	public static void close(ResultSet rs){
		//避免出现空指针异常
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	}
}

Model层:

package lanshen.model;

import java.util.Date;

public class Goddess {

    private Integer id;
    private String user_name;
    private Integer sex;
    private Integer age;
    private Date birthday; //注意用的是java.util.Date
    private String email;
    private String mobile;
    private String create_user;
    private String update_user;
    private Date create_date;
    private Date update_date;
    private Integer isDel;
    //getter setter方法。。。
}

Dao层:

package lanshen.dao;

import lanshen.db.DbUtil;
import lanshen.model.Goddess;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class GoddessDao {
    //增加
    public void addGoddess(Goddess g) throws SQLException {
		//和数据库取得连接
		Connection conn = null;	
		//创建statement			
		PreparedStatement pstmt = null;		
		//sql
        String sql = "INSERT INTO imooc_goddess(user_name, sex, age, birthday, email, mobile,"+
            "create_user, create_date, update_user, update_date, isdel)"
                +"values("+"?,?,?,?,?,?,?,CURRENT_DATE(),?,CURRENT_DATE(),?)";
                
		try{
			//获取连接
			conn = DbUtil.getConnection();
			//预编译
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			//传参
	        ptmt.setString(1, g.getUser_name());
	        ptmt.setInt(2, g.getSex());
	        ptmt.setInt(3, g.getAge());
	        ptmt.setDate(4, new Date(g.getBirthday().getTime()));
	        ptmt.setString(5, g.getEmail());
	        ptmt.setString(6, g.getMobile());
	        ptmt.setString(7, g.getCreate_user());
	        ptmt.setString(8, g.getUpdate_user());
	        ptmt.setInt(9, g.getIsDel());
	        //执行
	        ptmt.execute();
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}    
    }
    

	//修改
    public void updateGoddess(){
		//和数据库取得连接
		Connection conn = null;	
		//创建statement			
		PreparedStatement pstmt = null;	
		//sql, 每行加空格
        String sql = "UPDATE imooc_goddess" +
                " set user_name=?, sex=?, age=?, birthday=?, email=?, mobile=?,"+
                " update_user=?, update_date=CURRENT_DATE(), isdel=? "+
                " where id=?";
        
		try{
			//获取连接
			conn = DbUtil.getConnection();
			//预编译
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			//传参
	        ptmt.setString(1, g.getUser_name());
	        ptmt.setInt(2, g.getSex());
	        ptmt.setInt(3, g.getAge());
	        ptmt.setDate(4, new Date(g.getBirthday().getTime()));
	        ptmt.setString(5, g.getEmail());
	        ptmt.setString(6, g.getMobile());
	        ptmt.setString(7, g.getUpdate_user());
	        ptmt.setInt(8, g.getIsDel());
	        ptmt.setInt(9, g.getId());
	        //执行
	        ptmt.execute();
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}    
    }


	//删除
    public void delGoddess(){
		//和数据库取得连接
		Connection conn = null;	
		//创建statement			
		PreparedStatement pstmt = null;	
		//sql, 每行加空格
        String sql = "delete from imooc_goddess where id=?";
		
		try{
			//获取连接
			conn = DbUtil.getConnection();
			//预编译
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			//传参
        	ptmt.setInt(1, id);
	        //执行
	        ptmt.execute();
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}    
    }


	//查询,查询指定字段
    public List<Goddess> query() throws SQLException {
		//和数据库取得连接
		Connection conn = null;	
		//创建statement			
		Statement stmt = null;	
		//创建结果集
		ResultSet rs = null;	
		//sql, 每行加空格
        String sql = "SELECT user_name, age FROM imooc_goddess";
        
		try{
			//获取连接
			conn = DbUtil.getConnection();
			//预编译
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
	        //执行
	        List<Goddess> gs = new ArrayList<Goddess>();
        	Goddess g = null;
        	while(rs.next()){
            	g = new Goddess();
            	g.setUser_name(rs.getString("user_name"));
            	g.setAge(rs.getInt("age"));
            	gs.add(g);
        	}
        	return gs;
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}    
    }


	//查询,查询所有
    public Goddess get(){
		//和数据库取得连接
		Connection conn = null;	
		//创建statement			
		Statement stmt = null;	
		//创建结果集
		ResultSet rs = null;	
		//sql, 每行加空格
        String sql = "select * from  imooc_goddess where id=?";
        Goddess g = null;

		try{
			//获取连接
			conn = DbUtil.getConnection();
			//预编译
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			//传参
        	ptmt.setInt(1, id);
	        //执行
        	ResultSet rs = ptmt.executeQuery();
        	while(rs.next()){
	            g = new Goddess();
	            g.setId(rs.getInt("id"));
	            g.setUser_name(rs.getString("user_name"));
	            g.setAge(rs.getInt("age"));
	            g.setSex(rs.getInt("sex"));
	            g.setBirthday(rs.getDate("birthday"));
	            g.setEmail(rs.getString("email"));
	            g.setMobile(rs.getString("mobile"));
	            g.setCreate_date(rs.getDate("create_date"));
	            g.setCreate_user(rs.getString("create_user"));
	            g.setUpdate_date(rs.getDate("update_date"));
	            g.setUpdate_user(rs.getString("update_user"));
	            g.setIsDel(rs.getInt("isdel"));
        	}
        	return g;
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}    
}

五、Statement和PreparedStatement的异同及优缺点:

同:两者都是用来执SQL语句的。
异:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。

PreparedStatement的优点:

(1)其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
(2)其具有预编译机制,性能比statement更快。
(3)其能够有效防止SQL注入攻击。

六、execute和executeUpdate的区别:

相同点:
       二者都能够执行增加、删除、修改等操作。

不同点:
       execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
       execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值