JDBC :java database connection java数据连接
* JDBC是java连接数据库的一个标准,该标准提供了大量接口,这些接口有厂商根据自身数据库的特点做实现,由用户进行接口方法的调用。用户根据接口调方法,可以屏蔽不同数据库的差异,无论连接什么数据库都是一套API
* 每一个实体Bean都具有属性,每一行数据都是一个对象,jdbc就是完成数据库数据和数据对象的转换,磁盘数据和内存数据的转换
* 数据库相关包存放在java.sql包中
Statement和PreparedStatement的区别
* Statement 是PreparedStatement的父接口。采用Statement执行SQL语句时,由于SQL语句的值一般由用户提供,所以只能采用拼接字符串的方式设置。这种随着值的不同,系统会做多次SQL语句的编译操作,所以效率低,而且容易引起SQL注入
* PerparedStatement提供了占位符机制,将需要设置的地方都用占位符表示,这样无论说什么值都是一个SQL语句,不会进行多次编译操作,效率高。而且无论值是什么,都会做字符串处理,不会引起SQL注入
什么是SQL注入
采用拼接字符串方式,拼接SQL语句时,如果值中有SQL语句的关键字或者特殊字符,可能导致预习了结果不正确,或者SQL语句语法错误,这就叫做SQL注入。解决SQL注入的方式就是采用,PreparedStatement 代替Statement
命名规范
dao: data access Object 数据对象通道。是一种架构模式,建立实体类和数据库表做映射。也就是哪个类对应哪个表,哪个属性对应哪个列。所以完成数据库操作的本质就是完成对象数据和关系数据的转换
代码演示
创建Bean类
package com.lovo.bean;
import java.sql.Date;
public class EmployeeBean {
private int id;
private String name;
// 数据库操作,日期到sql包
private Date birthday;
private int money;
private String dept;
// id 为数据库自行配置数据,可以不做初始化
public EmployeeBean(String name, Date birthday, int money, String dept) {
super();
this.name = name;
this.birthday = birthday;
this.money = money;
this.dept = dept;
}
public EmployeeBean() {
super();
// TODO Auto-generated constructor stub
}
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
@Override
public String toString() {
return "EmployeeBean [id=" + id + ", name=" + name + ", birthday=" + birthday + ", money=" + money + ", dept="
+ dept + "]";
}
}
创建持久化接口
package com.lovo.dao;
import java.util.List;
import com.lovo.bean.EmployeeBean;
/**
* 员工的持久化接口
* @author zhihe
*
*/
public interface IEmployeeDao {
/**
* 添加员工
* @param emBean
*/
public void add(EmployeeBean emBean);
/**
* 按指定的标号删除员工
* @param id 员工id
*/
public void del(int id);
/**
* 修改ID指定员工的工资
*
* @param id 员工ID
* @param money 新工资
*/
public void update(int money,int id);
/**
* 查询所有员工
* @return 返回一个员工集合
*/
public List findAll();
/**
* 按姓名模糊查询员工
* @param name 员工姓名
* @return 员工集合
*/
public List findByName(String name);
/**
* 按员工id查询
* @param id 员工id
* @return 员工对象
*/
public EmployeeBean findByID(int id);
}
创建接口实现类
package com.lovo.impl;
import java.sql.Connection;
import java.sql.Date;
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.lovo.bean.EmployeeBean;
import com.lovo.dao.IEmployeeDao;
/**
* 员工的持久化接口实现类
*
* @author zhihe
*
*/
public class EmployeeDaoImpl implements IEmployeeDao {
@Override
public void add(EmployeeBean emBean) {
// 连接对象
Connection con = null;
// 预编译SQL语句的执行对象
PreparedStatement ps = null;
try {
// 加载驱动
Class.forName("org.gjt.mm.mysql.Driver");
// 建立连接,第一个参数为URL,其中localhost表示连接主机的ip,3306表示连接数据库的端口
// mydb为连接数据库的库名,root为mysql登录用户名,password为masql的登录密码
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root",
"password");
// 执行SQL语句 问号为占位符,有四个值需要插入,
ps = con.prepareStatement("insert into t_employee(employeeName,birthday,money,depName) values(?,?,?,?)");
// 设置占位符,指明哪个占位符需要填充
// 取出对象的属性,设置占位符,属性是什么需要用什么格式
ps.setString(1, emBean.getName());
ps.setDate(2, emBean.getBirthday());
ps.setInt(3, emBean.getMoney());
ps.setString(4, emBean.getDept());
// 更新数据库,将数据真正写入数据库
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 关闭连接,后建立,先关闭
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void del(int id) {
//连接对象
Connection con=null;
//SQL语句预操作对象
PreparedStatement ps=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
//建立连接
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
ps=con.prepareStatement("delete from t_employee where id=?");
ps.setInt(1, id);
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void update(int money, int id) {
Connection con=null;
PreparedStatement ps=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
ps=con.prepareStatement("update t_employee set money=? where id=?");
ps.setInt(2, id);
ps.setInt(1, money);
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public List findAll() {
// 查询操作,需读取数据库记录
List list=new ArrayList();
Connection con=null;
PreparedStatement ps=null;
//结果集对象
ResultSet rs=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
ps=con.prepareStatement("select*from t_employee");
//得到结果对象
rs=ps.executeQuery();
//遍历结果集,将结果集指针不断指向下一条记录,如果没有记录rs.next()返回false ,从而退出循环
while(rs.next()){
//每次循环,产生一个新对象,用于封装当前结果集指针指向的记录的数据
EmployeeBean emBean=new EmployeeBean();
//从结果集中取出指定列的值,封装对象的属性值
emBean.setId(rs.getInt("id"));
emBean.setName(rs.getString("employeeName"));
emBean.setBirthday(rs.getDate("birthday"));
emBean.setMoney(rs.getInt("money"));
emBean.setDept(rs.getString("depName"));
//将封装了数据的实体对象加入集合
list.add(emBean);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//最先关闭结果集
rs.close();
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
@Override
public List findByName(String name) {
Listlist=new ArrayList();
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
ps=con.prepareStatement("select*from t_employee where employeeName like ?");
ps.setString(1, "%"+name+"%");
rs=ps.executeQuery();
while(rs.next()){
EmployeeBean emBean=new EmployeeBean();
emBean.setId(rs.getInt("id"));
emBean.setName(rs.getString("employeeName"));
emBean.setBirthday(rs.getDate("birthday"));
emBean.setMoney(rs.getInt("money"));
emBean.setDept(rs.getString("depname"));
list.add(emBean);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
rs.close();
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
@Override
public EmployeeBean findByID(int id) {
// 返回集合建集合,返回对象建对象
EmployeeBean emBean=new EmployeeBean();
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
ps=con.prepareStatement("select*from t_employee where id=?");
ps.setInt(1, id);
rs=ps.executeQuery();
if(rs.next()){
emBean.setId(rs.getInt("id"));
emBean.setBirthday(rs.getDate("birthday"));
emBean.setName(rs.getString("employeeName"));
emBean.setMoney(rs.getInt("money"));
emBean.setDept(rs.getString("depName"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
rs.close();
ps.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return emBean;
}
//测试添加是否成功
public static void main(String[] args) {
IEmployeeDao dao = new EmployeeDaoImpl();
// dao.add(new EmployeeBean("aaa", Date.valueOf("1988-02-02"), 2000, "市场部"));
// dao.del(10);
// dao.update(4000, 2);
// Listlist=dao.findAll();
//系统有重写List集合的toString 方法,所以可以直接打印
// Listlist=dao.findByName("张");
// System.out.println(list);
EmployeeBean emBean=dao.findByID(3);
System.out.println(emBean);
}
}