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;	
	}

截图:


(三)代码托管


 posted on 2017-05-16 13:48  ben跑的换行符  阅读(330)  评论(0编辑  收藏  举报