1.理解
操作数据库的sql语句需要封装到一个对象中,由这个对象带到数据库中去实现,而java为我们提供了两个接口来实现封装sql语句;
①Statement接口,它存在问题,需要拼写sql语句,而且它存在sql注入问题(列如:用户名,密码不对也可以访问数据库)在此就不细讲;
②PrepareStateme解决sql注入问题,从而引入了它的子类来代替它封装sql语句;
流程如图所示;
2.代码实现
①数据库的添加操作
1.使用之前的创建方法四(先给出三个基本信息,再获取Driver对象,最后获取connection连接对象),获取连接对象
2.成功连接后给出需要操作的sql语句,切记这要使用占位符(解决了sql注入问题)
3.调用Connection连接对象的prepareStatement方法,返回一个可以封装sql语句的对象,把sql预编译
4.填充占位符号,第一个参数是表示第几个占位符,第二个参数是具体要填充的值
5.执行操作excute
6.资源关闭;
注意:在插入操作中如果客户端和数据库的编码集不一样的话,插入数据库的文字会成问号;
解决办法:?characterEncoding=utf8 在连接的数据库后加入这个语句设置编码集为utf8然后建立数据库表时把它的字符集也设置为utf8
②数据库的修改操作(和上面类似所以简写)
1.获取connection对象
2.给出sql语句,切记占位符的使用
3.获取preparestatement对象,封装预编译sql语句
4.填充占位符
5.执行操作
6.资源关闭
从上述的插入和修改不难看出,有几个步奏是重复的且一样的,就是.获取connection对象,就是重复且一样的我们可以把它放在一个工具类的静态方法中,以供调用
方法一方法二都是获取一个connection对象,在这没区别;(ClassLoader.getSystemClassLoader().getResourceASStream("文件名"),在这和之前讲的第五种方法中的获取流的方式是一样的;
③数据库的删除
和上面两个操作一样,只是换了sql语句;
④为了方便我们可以设置一个方法,只给这个方法要具体操作的sql语句,和数据,就可以对数据库进行增删改通用操作;
方法参数1设置为String类型,是放sql语句的,方法的参数二是用来放具体需要填写的占位符号,因为占位符不同sql语句个数不同,所以在这的参数二的写法就理解为一个未知长度的object类型的数组;
1.先是获取connection对象连接数据库;
2.获取prepared statement对象用来预编译传入的sql语句;
3.利用一个循环,循环条件就是这个数组的长度,因为占位符号从1开使,所以setobject第一个参数要加1,数组从0开始,后面那个就没必要了
4.执行操作,关闭资源;
⑤数据库的查找
数据库的查询操作相交于增删改有区别,因为查找需要返回一个查找结果,而增删改不用,所以也更复杂一些;
1.还是一样的获取connectiong连接对象
2.预编译sql语句,将其封装在preparedstatement对象中;
3.(区别开始)这不再是简单的运行,而是调用executeQuery,运行后返回一个查找结果对象,用resultset来接受;
4.调用返回结果的next方法,此方法表示如果有查询结果就返回true并指向下一条,如果下一条没有结果就返回false;
5.调用get+类型名 方法返回结果,下图是对应结果图;
6.一般把返回结果封装在对象中,我们返回一个对象,这样的方法更好;
就像图所示一样,把表的列作为java类,表的列作为类的属性,而一条查询结果就作为一个实例对象,到时候直接返回对象就好;
这是对应studnet的对象类
这是输出结果(记得重写tostring方法;)