JDBC_2

JDBC


JavaWeb 三层架构(经典三层) 降低耦合/ 提高复用性

1.表示层
	 由与用户交互组件构成(请求/响应)
2.业务逻辑层
	 处理业务逻辑(登录,注册)
3.数据持久层 
	 直接与数据库交互(insert/update/delete/select )

dao 主要负责 数据持久层 (接口+实现类)
框架

接口类:StudentDao.java

package dao;

import java.util.List;
import entity.Student;

public interface StudentDao {
	
	List<Student> queryAll();
	
	int insert(Student stu);
	
	int delete(int sid);	
		
}

实现类: studentDaoImpl3.java

package dao.impl;

import java.util.List;
import dao.BaseDao;
import dao.StudentDao;
import entity.Student;

/**
 * 
 * 将增删改提炼成一个通用方法。(BaseDao.java)
 * @author LXR
 */

public class studentDaoImpl3 extends BaseDao implements StudentDao {	
	// 查询
	@Override
	public List<Student> queryAll() {
		
		String sql = "select * from student";
		Object[] params = {};
		return executeQuery(sql,params,Student.class);
	}

	//插入(增)
	@Override
	public int insert(Student stu) {
		
		// sql语句
		String sql = "insert into student values(?,?)";
		// 获取到 sid 和 sname
		Object[] params = {stu.getsid(),stu.getSname()};
		// 调用通用模板 第3步:发送数据(里面包含着注册管理和获取连接)
		// 得到返回值输出 或者后续 操作
		return executeUpdate(sql,params);		
	}

	// 删除
	@Override
	public int delete(int sid) {
		
		String sql = "delete from student where sid = ?";
		
		Object[] params = {sid};
		// 调用通用模板 第3步:发送数据(里面包含着注册管理和获取连接)
		// 得到返回值输出 或者后续 操作
		return executeUpdate(sql,params);
	}

	public static void main(String[] args){
		StudentDao dao = new studentDaoImpl3();
		System.out.print(dao.queryAll());
	}
}

公共模块:BaseDao.java

package dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.JdbcUtils;

/**
 * 通用方法 
 * 3.发送数据
 * @author LXR
 *
 */

public class BaseDao {

	private Connection conn = null;
	private PreparedStatement ps = null;
	private ResultSet rs = null;
	
	// 通用增删改,不同表 insert/update/delete(sql)  参数类型和参数个数
	public int executeUpdate(String sql,Object[] params){
		int rows = 0;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(sql);
			//赋值 (参数可能有好多个)
			for(int i=0;i<=params.length;i++){
				ps.setObject(i+1, params[i]);
			}
			rows = ps.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			JdbcUtils.closeRes(rs, ps, conn);
		}
		return rows;
	}
	
	
	// 通用 查
	public<T> List<T> executeQuery(String sql,Object[] params,Class<T> clz){
		
		List<T> lists = new ArrayList<>();
		
		try {
			//调用工具类,注册管理 、 建立连接
			conn = JdbcUtils.getConnection();
			//调用prepareStatement是为了防止SQL注入
			ps = conn.prepareStatement(sql);
			//赋值
			for(int i=0;i<params.length;i++){
				ps.setObject(i+1, params[i]);
			}
			// 发送sql语句
			// rs 游标 其携带了表的所有元数据信息(能知道表有多少列)
			rs = ps.executeQuery();
			// 获取rs结果集(元数据)
			ResultSetMetaData md = rs.getMetaData();
			//获取字段个数
			int count = md.getColumnCount();
			while(rs.next()){
				//调用实体类的无参构造 
				try {
					T t = clz.newInstance();     //反射
					// 将每个字段值一次赋值到对应的属性中 (数据库字段中 与  程序中参数 相对应)
					for(int i=0;i<count;i++){ // 获取每列数据
						//字段名称
						String name = md.getCatalogName(i+1);
						//获取每个字段的值
						Object value = rs.getObject(name);
						// 获取对应属性
						Field field= clz.getDeclaredField(name);
						field.setAccessible(true);
						//赋值
						field.set(t, value);			
					}
					lists.add(t);
					
				} catch (NoSuchFieldException | SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();	
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}   			
			}		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return null;
	}	
}

实体类:Student.java Userinfo.java

package entity;

// student实体类

/**
 * student 表对应的类
 */
public class Student {

    private int sid;
    private String sname;
    
    public Student(){

    }

    public Student(int sid,String sname){
        super();
        this.sid = sid;
        this.sname = sname;
    }

    // get 、set
    public int getsid(){
        return sid;
    }
    public void setSid(int sid){
        this.sid = sid;
    }

    public String getSname(){
        return sname;
    }

    public void setSname(String sname){
        this.sname = sname;
    }

    @Override
    public String toString(){
        return "Student [sid="+ sid +",sname="+ sname +"]";
    }
}
package entity;

/**
 * userinfo 实体类
 *
 */
public class Userinfo {

    private int sid;
    private String username;
    private  String password;

    public Userinfo(){

    }

    public Userinfo(int sid,String username,String password){
        super();
        this.sid = sid;
        this.username = username;
        this.password = password;
    }

    public int getSid(){
        return  sid;
    }

    public String getsname(){
        return  username;
    }

    public  String getPassword(String password){
        return this.password;
    }

    public void setSid(int sid){
        this.sid = sid;
    }

    public  void setSname(String username){
        this.username = username;
    }

    public void setPassword(String password){
        this.password = password;
    }
}

工具类:jdbc.properties 配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///bd2021?useSSL=true
user=root
password=root
注意:用 配置文件 来解决 硬编码问题。
	java属性文件:properties(key/value)
	xml文件: 通过标签(ssm)
	<book>
		<title>内容</title>
   </book>

> 能不生气就不要生气,能不骂人就不要骂人,能动手就直接动手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值