一、JDBC概念
- 什么是 JDBC java database connectivity java应用程序连接数据库的技术
- java应用程序 控制台 窗体应用程序 站点程序
- 数据库 mysql db2 oracle sqlserver…
- jdbc是一组接口 任意一个想要和java应用程序建立连接的数据库提供商 负责实现这些接口中的抽象方法 对应的jar包 mysql.jar
- 下载对应mysql server版本的 mysql.jar文件
- 复制粘贴到项目文件夹中
- 右键--> build path--> add to build path
- 必要的连接接口
- Connection 连接的计算机IP地址 端口号 具备访问权限的账号 密码
- Statement // PreparedStatement
- ResultSet //rs.nexxt();rs.getInt(参数{序号从1开始或者"列名"})
- 一个类 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.分层架构
- 为什么做分层开发——方便团队开发
- 如何分层
- entity 实体类层 包含所有的依照数据库表 创建的数据载体类
- dao 数据访问层 用于连接数据库进行数据的增删改查操作
- biz 业务逻辑层
- 传递职能 ui--> biz --> dao dao..>biz..> ui
- 验证和转换
- 复杂业务逻辑的组合方法调用
4.ui表示层 :负责和用户进行数据交互
5.单元测试
1)新建一个包
com.wulin.test
2)新建一个Junit case 测试类,选择要测试的类 勾选测试的方法
3)鼠标移向测试的方法名,右键 run-->Junit test