JDBC概念与优化

一、JDBC概念

  1. 什么是 JDBC   java  database  connectivity   java应用程序连接数据库的技术
    1. java应用程序  控制台  窗体应用程序  站点程序
    2. 数据库  mysql  db2  oracle  sqlserver…
  2. jdbc是一组接口  任意一个想要和java应用程序建立连接的数据库提供商 负责实现这些接口中的抽象方法    对应的jar包    mysql.jar
    1. 下载对应mysql server版本的 mysql.jar文件
    2. 复制粘贴到项目文件夹中
    3. 右键--> build path--> add to build path
  3. 必要的连接接口
    1. Connection   连接的计算机IP地址 端口号 具备访问权限的账号  密码
    2. Statement   //  PreparedStatement
    3. ResultSet   //rs.nexxt();rs.getInt(参数{序号从1开始或者"列名"})
  4. 一个类  DriverManager  通过反射得到驱动管理类的对象(桥梁的建筑工人)

二、jdbc搭建步骤

1、加载驱动

class.forName("com.mysql.jdbc.Driver");

2、搭建桥梁

connection conn=DriverManager.getconnection("jdbc:mysql://127.0.0.1:3306/wulindb","root","123");

3、创建指挥官

更新:Statement st=conn.createStatement();

查询:pst=super.conn.prepareStatement(sql)

pst.setInt(1,dept.getDeptId());

4、传输数据

更新:int count=st.executeUpdate(sql);

查询:ResultSet rs=st.executeQuery(sql);

 

 


三、JDBC优化

1.日期类型的处理

1)String  、 java.util.Date  、 java.sql.Date

a)用户输入字符串-->保存到对象中,需要转换为util.Date-->sql.Date 

b)sql.Date(子类) --> util.Date(父类) -->格式符合要求的字符串查询

c)第一步:将字符串转为util.Date

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//HH24小时制

Date d=sdf.parse("2019-5-28 9:30:00");

第二步:util.Date 转为 sql.Date;

java.sql.Date d2=new java.sql.Date(d.getTime());//会损失精度

java.sql.Date d2=new java.sql.TimeStamp(d.getTime());

d)直接使用util.Date 保存sql.Date

Date d3=new java.sql.Date(d.getTime());

SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//HH24小时制

String str=sdf1.format(d3)

//super.pst.setDate(5,new java.sql.Date(emp.getEmpInDate().getTime()));

String d1="2018-3-15";

//1.将字符串转为 util.Date
SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd");   
Date d=null;
try {
    d=sdf.parse(d1);
    System.out.println(d);
} catch (ParseException e) {
    e.printStackTrace();
}

//2. util.Date转为sql.Date   
//java.sql.Date d2=(java.sql.Date)d;
java.sql.Date d2=new java.sql.Date(d.getTime());
System.out.println(d2);

//3. 直接使用util.Date保存sql.Date
Date d3=new Date();
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss E");
System.out.println(sdf1.format(d3));

 

2.BaseDao的使用

public class BaseDao {
	//4 +  3  +  2  +  1
	//4 个静态常量字符串  驱动路径  连接位置  账号  密码
	public static final String DRIVER="com.mysql.jdbc.Driver";
    //URL="jdbc:mysql:///wulindb";
	public static final String URL="jdbc:mysql://localhost:3306/wulindb";
	public static final String UID="root";
	public static final String PWD="123";

	//3个核心对象
	protected Connection conn=null;
	protected PreparedStatement pst=null;
	protected ResultSet rs=null;
	
	//{}代码块:优先于构造方法,1个静态代码块:优先级更高
	static{
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//2个方法 用于开启连接  关闭连接
	public Connection open_db(){
		try {
			this.conn=DriverManager.getConnection(URL, UID, PWD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return this.conn;
	}

	public void close_db(){
		try {
			if (rs!=null) {
				rs.close();
			}
			if (pst!=null) {
				pst.close();
			}
			if (conn!=null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
import com.wulin.entity.Department;

//部门表的数据访问类
public class DepartmentDao extends BaseDao {
	/**
	 * 进行部门新增的方法
	 * @param dept  要新增部门对象
	 * @return  受影响的行数
	 */
	public int add(Department dept){
		
		return 0;
	}
	/**
	 * 进行部门信息修改的方法
	 * @param dept  要更新的部门对象
	 * @return  受影响的行数
	 */
	public int modify(Department dept){
		String sql="update department set deptName=?,deptAddress=? where deptId=?;";
		int count=0;
		try{
			super.ps=super.open_db().prepareStatement(sql);
			//为sql参数供值
			super.ps.setString(1, dept.getDeptName());
			super.ps.setString(2,dept.getDeptAddress());
			super.ps.setInt(3,dept.getDeptId());
			//执行
			count=super.ps.executeUpdate();
		}catch(SQLException ex){
			//System.out.println("自己要打印的消息内容");
			System.out.println(ex.getMessage());//打印异常对象的异常文本信息
			//ex.printStackTrace();
		}finally{
			super.close_db();
		}
		return  count;
	}
	
	/**
	 * 删除部门信息的方法
	 * @param id  要删除的部门编号
	 * @return  受影响的行数
	 */
	public int remove(int id){
		return 0;
	}
	/**
	 * 查找所有部门信息的方法
	 * @return 返回所有部门对象构成的集合
	 */
	public  List<Department> findAll(){
		Map<String,  Object> pars=new HashMap<String, Object>();
		return query(pars);
	}
	/**
	 * 根据主键查询部门信息
	 * @param id 要查询的部门编号
	 * @return 找的到部门对象
	 */
	public Department findById(int id){
		Map<String,  Object> pars=new HashMap<String, Object>();
		pars.put("deptId", id);
		List<Department> li=query(pars);
		return li.size()==0?null:li.get(0);
	}
	
	
	
	public List<Department> query(Map<String, Object> pars){
		//组合sql命令
		StringBuffer sb=new StringBuffer("select * from department where 1=1 ");
		List<Object> objs=new ArrayList<Object>();//有序的集合 
		List<Department> depts=new ArrayList<Department>();
		//遍历参数集合 拼接SQL
		if (pars.containsKey("deptId")) {
			sb.append(" and  deptId = ?");
			objs.add(pars.get("deptId"));
		}
		if (pars.containsKey("deptName")) {
			sb.append(" and  deptName like ? ");  
			objs.add("%"+pars.get("deptName")+"%");
		}
		if (pars.containsKey("deptAddress")) {
			sb.append(" and  deptAddress like ? ");
			objs.add("%"+pars.get("deptAddress")+"%");
		}
//		for (String str : pars.keySet()) {
//			sb.append(" and ").append(str).append(" = ? ");
//			objs.add(pars.get(str));//将无序集合中本次追加的sql命令的键 对应的值 添加到有序集合中 保持顺序
//		}
		//System.out.println(sb.toString());
		try {
			super.ps=super.open_db().prepareStatement(sb.toString());
			for (int i = 0; i < objs.size(); i++) {
				super.ps.setObject(i+1, objs.get(i));
			}
			super.re=super.ps.executeQuery();
			Department dept=null;
			while(super.re.next()){
				dept=new Department();
				dept.setDeptId(super.re.getInt(1));
				dept.setDeptName(super.re.getString(2));
				dept.setDeptAddress(super.re.getString("deptAddress"));
				//将对象存入集合
				depts.add(dept);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			super.close_db();
		}
		return depts;
	}
}

 

 

3.sql参数化

拼接复杂

防止SQL注入

例:String str="insert into 表名 values(?,?,?);";

 

4.分层架构

  1. 为什么做分层开发——方便团队开发
  2. 如何分层
    1. entity  实体类层 包含所有的依照数据库表 创建的数据载体类
    2. dao  数据访问层 用于连接数据库进行数据的增删改查操作
    3. biz  业务逻辑层  
      1. 传递职能  ui--> biz  --> dao    dao..>biz..> ui
      2. 验证和转换
      3. 复杂业务逻辑的组合方法调用

4.ui表示层 :负责和用户进行数据交互

 

5.单元测试

1)新建一个包

com.wulin.test

2)新建一个Junit case 测试类,选择要测试的类 勾选测试的方法

3)鼠标移向测试的方法名,右键 run-->Junit test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值