jdbc: java database connection,也就是java的数据库连接。
作用: 完成数据库数据和内存数据的交互。
为了屏蔽不同数据库的差异,在内存和各种数据库之间建立了一个接口标准。每个厂商按照接口的标准来实现接口类。
jdbc 是java连接数据库的一套标准。该标准中定义了一系列的接口,由数据库厂商根据自身数据库的特点提供实现类,由开发者调用。开发者根据接口调用方法,可以屏蔽不同数据库厂商的差异。这样,无论连接什么数据库都是一套API。
jdbc 操作步骤: 流操作步骤:
① 加载驱动,建立连接 1、建立流
② 执行SQL语句 2、操作流
③ 关闭连接 3、关闭
SQL注入: 在执行sql语句时,由于sql语句的值是由用户输入的,所以是以变量接收的,如果以拼接字符串方式来执行SQL语句,一旦数据中有非法字符或者有关键字时,会导致语法错误,或者执行结果不正确的情况,这称为SQL注入。
Statement和PreparedStatement的区别:
Statement是PreparedStatement 的父接口。在执行SQL语句时,只能以拼接字符串方式,拼接值。会引起SQL注入。而且效率低。
PreparedStatement,是预编译SQL语句执行对象,支持占位符方式,无论数据是什么值,都当字符串处理,不会引起SQL注入。而且效率高。
举例说明:
package数据库连接;importjava.sql.Date;/*** 公民实体类
*@authorC
**/
public classManBean {/**公民编号*/
private intid;/**姓名*/
privateString name;/**性别*/
privateString sex;/**生日*/
privateDate briyhday;public intgetId() {returnid;
}public void setId(intid) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getSex() {returnsex;
}public voidsetSex(String sex) {this.sex =sex;
}publicDate getBriyhday() {returnbriyhday;
}public voidsetBriyhday(Date briyhday) {this.briyhday =briyhday;
}publicManBean(String name, String sex, Date briyhday) {super();this.name =name;this.sex =sex;this.briyhday =briyhday;
}publicManBean() {super();//TODO Auto-generated constructor stub
}
@OverridepublicString toString() {return "ManBean [id=" + id + ", name=" + name + ", sex=" + sex + ", briyhday=" + briyhday + "]\n";
}
}
强调:如果在一个类中定义了代参构造那么没有默认的无惨构造,所以必须要加上无惨构造。
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/*** 所有Dao父类
*
*@authorC
**/
public classManDao {/**连接对象*/
protected Connection con = null;/**Sql语句执行对象*/
protected PreparedStatement pr = null;/**结果集对象*/
protected ResultSet rs = null;/*** 建立链接*/
public voidsetCnnonection() {//加载驱动
try{
Class.forName("com.mysql.jdbc.Driver");//建立连接//jdbc表示需要使用jdbc建立连接。mysql 表示连接数据库类型,localhost表示连接服务器的IP地址//其中localhost为本机的ip//3306表示mysql的端口号,mytest1为sql中的数据库名称,表示需要使用该类中的数据库表//characterEncoding=utf-8表示设置连接数据库的编码集
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytext1?characterEncoding=utf-8", "root","123456");
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/*** 关闭流*/
public voidcloseConnecting() {try{if (rs != null) {this.rs.close();
}this.pr.close();this.con.close();
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}public static voidmain(String[] args) {
ManDao m= newManDao();
m.setCnnonection();
}
}
强调:把建立连接和关闭流放在一个类中分别定义二个方法是一种抽象的行为,方便需要用的时候直接调用其方法,而不写重复的代码。
package数据库连接;importjava.sql.Connection;importjava.sql.Date;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;/*** 公民持久话实现接口
*@authorC
**/
public class ManDaoImpl extends ManDao implementsIManDao {public voidadd(ManBean man) {//加载驱动
try{this.setCnnonection();//执行sql语句,?表示占位符,需要向占位符填充数据
pr=con.prepareStatement("insert into t_man (manName,sex,brithday) values(?,?,?)");//将man对象中的name属性取出,填充第一个占位符
pr.setString(1,man.getName());
pr.setString(2, man.getSex());
pr.setDate(3, man.getBriyhday());//更新数据库 必须要写
pr.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally{this.closeConnecting();
}
}/*** 查找所有公民对象集合*/
public Listfindall() {
List list = new ArrayList();try{this.setCnnonection();
pr= con.prepareStatement("select *from t_man");//执行查询操作,将sql语句查询的数据,封装在结果集对象中
rs =pr.executeQuery();//将结果集的指针,不段指向下一条记录,如果该方法返回false ,表示指针到底结果集末尾。
while(rs.next()) {
ManBean man= newManBean();//将数据库中id列的值取出,填充实体对象的id属性。""是列名名称
man.setId(rs.getInt("id"));
man.setName(rs.getString("manName"));
man.setSex(rs.getString("sex"));
man.setBriyhday(rs.getDate("brithday"));//将封装好的记录实体对象加入集合
list.add(man);
}
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}finally{this.closeConnecting();
}returnlist;
}
强调:1,添加、删除、修改完后必须要用executeUpdate()方法更新数据库。2,查询都要用结果集来传递数据库的数据。3,最后必须关闭连接,否则会导致数据的丢失。