JDBC编程-----数据库的链接
本文转自:http://blog.csdn.net/hanxiaoshuang123/article/details/6776539
1、创建一个以JDBC连接数据库的程序,包括如下7个步骤。
(1)加载JDBC驱动程序
Class.forName(“com.mysql.jdbc.Driver”);
或者:Driver driv=new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driv);
(2)提供JDBC连接的URL
String url="jdbc:mysql://localhost:3306/test";
String username="root";
String password="1234";
或urll ="jdbc:mysql://localhost:3306/test?user=root&password=1234”
(3)创建数据库的连接
Connection con;
con=DriverManager.getConnection(url,username,password);
或con=DriverManager.getConnection(urll);
(4)创建一个Statement
Statement stat=con.createStatement();
(5)执行SQL语句
stat.executeUpdate(sql);//sql是insert、update和delete语句
stat.executeQuery(sql);//sql是select语句
stat.execute(sql); //多个结果集、多个更新计数或组合语句
(6)处理结果---执行结果可能会出现两种情况
执行更新返回的是本次操作影响到的记录数
执行查询返回的结果是一个ResultSet对象,该对象以0或多条记录的形式包含了查询结果,可以通过隐含的游标(指针)来定位数据,初始化时,游标位于第一条记录前,可以通过next()方法移动到下一条记录。
ResultSet rs=stat.executeQuery(“select …”);
rs.next();//移动游标到第一条记录,如果没有到最后一条记录的后面,方法返回true,否则返回false。
例子:
while(rs.next()){
//读取游标所指的记录行数据
System.out.println(“学号:”+rs.getInt(1));
System.out.println(“学号:”+rs.getInt(“id”));
}
ResultSet对象rs中有getXXX()方法,可从当前记录行中获取指定列的信息,可通过指定列索引号或列明两种方式指定要读取的列。
(7)关闭JDBC对象
在操作完成以后要把所使用的JDBC对象全部关闭,以释放JDBC资源,关闭的顺序和声明顺序相反。
…
finally{
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}…
}
2.JDBC的链接,完成对数据库的访问,对数据的增、删、改、查
注:用面向对象的方法
第一步:建立表结构
第二步:创建一个包为 cn.hbsi.bean 的包,然后在此包下创建类,类中定义的是在数据库中建立的列,在此类中把这些列定义为私有的属性,并用getter setter 方法来初始化,以便于在访问数据库时可以使用私有的属性。
第三步:建立一个工具类,用来封装数据库中必备的连接,其中包括用户名、密码、连接的路径,而且用户名、密码、连接的路径都放在一个配置文件中。(配置文件就是存放键值对的,所以存放的数据是一一对应的)
注:重要的是在第二步,它所包含的是所有要对数据库操作的方法,操作方法一般情况下为boolean类型的,所以要注意及时修改boolean类型的值
重点说一下在连接数据库的时候注意的事项--------查询数据库:
第一步:因为要执行和数据库的操作会很多,所以可以把Connection preparedStatement ResultSet 这三个类提取出来用私有变量去定义,使用时可以直接调用类的对象,例如:
private Connection conn;
private PreparedStatement pstmt;//预处理类
private ResultSet rs;
第二步:获取连接对象
conn = JdbcUtil.getConnection();
第三步: 定义SQL语句---------查询的语句
String sql = “insert into studInfo(name,sex,remune,image) values(?,?,?,?)”;
第四步:创建预处理对象
pstmt = conn.prepareStatement(sql);
第五步:为占位符赋值
int index = 1;//定义index,是在显示的是?的赋值
pstmt.setString(index++, entity.getName());//用到的index++可以避免定义固定的,可以自增
pstmt.setString(index++, entity.getSex());
pstmt.setString(index++, entity.getResume());
pstmt.setObject(index++, entity.getImage());
第六步:执行更新
int i = pstmt.executeUpdate();
第七步:判断
if(i > 0){
flag = true;
}
第八步:释放资源
JdbcUtil.release(rs, pstmt, conn);
实例:
public boolean insert(StudentInfo entity){
boolean flag = false;
try {
//第二步:获取连接对象
conn = JdbcUtil.getConnection();
//第三步:定义SQL语句
String sql = "insert into studInfo(name,sex,resume,image) values(?,?,?,?)";
//第四步:创建预处理对象
pstmt = conn.prepareStatement(sql);
//第五步:为占位符赋值
int index = 1;
pstmt.setString(index++, entity.getName());
pstmt.setString(index++, entity.getSex());
pstmt.setString(index++, entity.getResume());
pstmt.setObject(index++, entity.getImage());
//第六步:执行更新
int i = pstmt.executeUpdate();
//第七步:判断
if(i > 0){
flag = true;
}
//第八步:
JdbcUtil.release(rs, pstmt, conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//必须注意修改返回值
return flag;
}
//主方法测试
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
StudentHandle sh = new StudentHandle();
StudentInfo entity = new StudentInfo();
//准配实体bean对象,即是向列表中插入数据,通过面向对象的思想去调用私有成员的getter setter方法
entity.setName("gehref");
entity.setSex("女");
entity.setResume("高级工程师");
//向数据库中添加图片
entity.setImage(StudentInfo.class.getClassLoader().getResourceAsStream("./image/ai.jpg"));
sh.insert(entity);
}
注意:在写的时候可能会出现很多问题,比如在复制时么有该数据库名,么有导入数据库,配置文件的位置不对,或是配置文件中的数据不对都很有可能出现
在实现其他的操作的时候,和查询的操作大同小异
删除的操作:
public boolean delete(Student entity) {
第一步:声明返回结果变量
boolean flag = false;
try {
第二步:获取连接对象
conn = JdbcUtil.getConnection();
第三步:定义sql语句
String sql = "delete from student where id=?";
第四步:根据sql语句创建预处理对象
pstmt = conn.prepareStatement(sql);
第五步:为站位符赋值
int index = 1;
pstmt.setObject(index++, entity.getId());
第六步:执行更新
int i = pstmt.executeUpdate();
第七步:判断
if (i > 0) {
flag = true;
}
第八步:释放资源
JdbcUtil.release(rs, pstmt, conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* *****修改返回变量值 */
return flag;
}
更新的操作,和插入一样
public boolean update(Student entity) {
/* 第一步:声明返回结果变量 */
boolean flag = false;
try {
/* 第二步:获取连接对象 */
conn = JdbcUtil.getConnection();
/* 第三步:定义sql语句 */
String sql = "update student set name=?,sex=?,resume=?,image=? where id=?";
/* 第四步:根据sql语句创建预处理对象 */
pstmt = conn.prepareStatement(sql);
/* 第五步:为站位符赋值 */
int index = 1;
pstmt.setObject(index++, entity.getName());
pstmt.setObject(index++, entity.getSex());
pstmt.setObject(index++, entity.getResume());
// pstmt.setBinaryStream(parameterIndex, x)
pstmt.setObject(index++, entity.getImage());
pstmt.setObject(index++, entity.getId());
/* 第六步:执行更新 */
int i = pstmt.executeUpdate();
/* 第七步:判断 */
if (i > 0) {
flag = true;
}
/* 第八步:释放资源 */
JdbcUtil.release(rs, pstmt, conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* *****修改返回变量值 */
return flag;
}
显示所有的信息
public List<Student> findAll() {
/* 第一步:声明返回结果变量 */
用到泛型
List<Student> entities = new ArrayList<Student>();
try {
/* 第二步:获取连接对象 */
conn = JdbcUtil.getConnection();
/* 第三步:定义sql语句 */
String sql = "select id,name,sex,resume,image from student";
/* 第四步:根据sql语句创建预处理对象 */
pstmt = conn.prepareStatement(sql);
/* 第五步:为站位符赋值 */
/* 第六步:执行查询 */
rs = pstmt.executeQuery();
/* 第七步:判断 */
while (rs.next()) {
// 每指向一条记录就对应一个崭新的对象 在循环中声明实体bean对象
数据多,把数据放到一个类里封装
Student entity = new Student();
// 为每条记录对应的对象赋值
entity.setId(rs.getInt("id"));
entity.setName(rs.getString("name"));
entity.setSex(rs.getString("sex"));
entity.setResume(rs.getString("resume"));
entity.setImage(rs.getBinaryStream("image"));
// 把每条记录对应的对象添加到集合中进行保存
entities.add(entity);
}
/* 第八步:释放资源 */
JdbcUtil.release(rs, pstmt, conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* *****修改返回变量值 */
return entities;
}