• Java第八次作业--数据库编程


    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:WindowSysWOW64中,然后点击右上角的搜索: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;	
    	}
    

    截图:


    (三)代码托管


    博客网站 https://yamon.top 个人网站 https://yamon.top/resume GitHub网站 https://github.com/yamonc 欢迎前来访问
  • 相关阅读:
    在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?
    接收Firfox RESTClient #Post请求
    c# 单例模式[Singleton]之深夜闲聊
    JQuery 之 Ajax 异步和同步浅谈
    [模板]数学整合
    Yandex插件使用说明——Slager_Z
    模板练习(LUOGU)
    数学整合 新(LUOGU)
    [NOI.AC]DELETE(LIS)
    [NOI.AC]COUNT(数学)
  • 原文地址:https://www.cnblogs.com/chenyameng/p/6860990.html
Copyright © 2020-2023  润新知