Java第八次作业--数据库编程
(一)学习总结
1.用思维导图对本周的学习内容进行总结。
2.通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery()方法中使用动态参数时,为什么要使用PreparedStatement接口而不使用Statement,比较使用两种接口的不同之处。
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
1,executeQuery
用于产生单个结果集的语句,例如select
。
2,executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零.
mysql 中execute、executeQuery和executeUpdate之间的区别
PreparedStatement
接口和Statement
接口的区别:
3.1,PreparedStatement可以写动态参数化的查询;
PreparedStatement pstmt = null;
conn=JDBCUtils.getConnection(1);
String sql = "select 编号,种类,年龄,数量,价格 from animal where 编号= ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
animal = new AnimalItem();
animal.setId(rs.getString(1));
animal.setKind(rs.getString(2));
animal.setAge(rs.getDouble(3));
animal.setNumber(rs.getString(4));
animal.setPrice(rs.getDouble(5));
list.add(animal);
}
比如给?进行赋值的时候需要使用预处理,而Statement
接口则只能表示用于批处理。
Statement stmt = null;
conn=JDBCUtils.getConnection(1);
stmt=conn.createStatement();
String sql="select 编号,种类,年龄,数量,价格 from animal"; //找出所有的数据
rs=stmt.executeQuery(sql); //执行
while(rs.next()){ //遍历
if(AdminDao.findAnimalItem(ikind)){ //判断如果存在该种类返回true
AnimalItem animal=new AnimalItem(); //初始化
animal.setId(rs.getString("编号")); //
animal.setKind(rs.getString("种类"));
animal.setAge(rs.getDouble("年龄"));
animal.setNumber(rs.getString("数量"));
animal.setPrice(rs.getDouble("价格"));
list.add(animal);
}
}
以上程序的不同之处在于sql语句中是否存在变量值,也就是是否能进行动态查询,同时这也是PreparedStatement
接口而不使用Statement
的原因:Statement
不能进行预处理操作(sql语句中存在动态变量值),如果用到预处理,必须使用PreparedStateme
接口
3.2PreparedStatement
比 Statement
更快
使用 PreparedStatement
最重要的一点好处是它拥有更佳的性能优势,SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)。
引用:JDBC为什么要使用PreparedStatement而不是Statement
综上所述,当使用preparedStatem
的时候需要进行预处理,故需要executeQuery()放入ResultSet
中。
(二)实验总结
2.1实验
数据库和java的连接问题:
在打开后的sql server软件后新建登录名,同时点击同时使用sql server身份认证,服务器角色选上sysadmin
然后点连接。使用程序进行连接
import java.sql.*;
public class Test {
public static final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public static final String DBURL = "jdbc:sqlserver://localhost:1433;DatabaseName=movie";
public static final String DBUSER = "chen";
public static final String DBPASS = "2129641";
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName(DBDRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
System.out.println("数据库连接成功");
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
如果出现:
则表示连接成功
如果存在问题:端口问题,设置sql server中的端口:win10下的sql管理文件在C:\Window\SysWOW64
中,然后点击右上角的搜索:sql
然后点击Manager10文件后进入管理:
程序设计思路:
只需要将DataBase中的数据删除,然后新建一个dbc
的文件夹,然后写JDBCUtils类来进行连接即可。
连接成功后更改adminDao中的函数,在此文件夹下,更改的操作只是对sql语句的操作。在AdminService中的函数是增删改查的操作全部调用adminDao中的函数。
2.2实验拓展:
程序设计思路:按照功能设计程序:
2.2.1:显示所有宠物:
直接调用函数adminService.queryItem()方法,然后返回数据库中animal表中的所有数据即可。
2.2.2:按照种类查找宠物
连接数据库成功后输入sql语句进行查找,然后在声明一个AnimalItem类的一个对象,使用ResultSet集中的getString方法返回给AnimalItem对象,最后将AnimalItem类存储在List集中。最后调用即可。
public static ArrayList<AnimalItem> toChaZhao(String ikind){
PreparedStatement pstmt = null;
AnimalItem animal = null;
Connection conn=null;
ArrayList<AnimalItem> list = new ArrayList<AnimalItem>();
try {
conn=JDBCUtils.getConnection(1);
String sql = "select 编号,种类,年龄,数量,价格 from animal where 种类 = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, ikind);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
animal = new AnimalItem();
animal.setId(rs.getString(1));
animal.setKind(rs.getString(2));
animal.setAge(rs.getDouble(3));
animal.setNumber(rs.getString(4));
animal.setPrice(rs.getDouble(5));
list.add(animal);
}
rs.close();
} catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtils.close(conn);
}
return list;
}
截图:
2.2.3购买宠物&&显示购买的宠物
设计思路:选择编号,然后对编号进行查找,在sql server中新建一个buy的表,将查找的结果存到buy表中即可。在显示购买的宠物程序中直接对整个buy表进行遍历即可显示出所有的购买宠物.
具体代码如下:
public boolean toBuy(String id){
PreparedStatement pstmt = null;
AnimalItem animal = null;
Connection conn=null;
ArrayList<AnimalItem> list = new ArrayList<AnimalItem>();
try {
conn=JDBCUtils.getConnection(1);
String sql = "select 编号,种类,年龄,数量,价格 from animal where 编号= ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
animal = new AnimalItem();
animal.setId(rs.getString(1));
animal.setKind(rs.getString(2));
animal.setAge(rs.getDouble(3));
animal.setNumber(rs.getString(4));
animal.setPrice(rs.getDouble(5));
list.add(animal);
}
String sqll="insert into buy(编号,种类,年龄,数量,价格) values(?,?,?,?,?) ";
pstmt=conn.prepareStatement(sqll);
pstmt.setString(1, animal.getId());
pstmt.setString(2,animal.getKind());
pstmt.setDouble(3,animal.getAge());
pstmt.setString(4, animal.getNumber());
pstmt.setDouble(5, animal.getPrice());
int len= pstmt.executeUpdate();
if(len>0){
return true;
}
rs.close();
} catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtils.close(conn);
}
return false;
}
截图:
2.2.4用户登录与注册
注册:
设计思路:在sql server中新建Users表用于存储,使用sql语句向表内进行增加数据:
public static boolean addUser(User user){
Connection conn = null;
PreparedStatement pstmt = null;
boolean result=false;
try {
conn = JDBCUtils.getConnection(1);
String sql="insert into Users (用户名,密码) values (?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
int num = pstmt.executeUpdate();
if(num > 0){
result = true;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtils.close(conn);
}
return result;
}
登录:登录的时候需要访问Users表,将Users表通过ArrayList<User> data = queryItem();
转换为ArrayList进行遍历。
public boolean loginSuccess(String username,String password){
ArrayList<User> data = queryItem();
Iterator<User> iterator = data.iterator();
while(iterator.hasNext()){
User user = iterator.next();
//如果用户名和密码都和数据库中的相符则返回真
if(user.getUsername().equals(username)&&user.getPassword().equals(password)){
return true;
}
}
return false;
}
截图: