第六周作业完成,一个半小时

Posted diao____si

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六周作业完成,一个半小时相关的知识,希望对你有一定的参考价值。

一、JDBC ORM 对象和关系数据库的映射

个人看了之后认为这个知识点可能再jdbc中是最重要的知识点之一,毕竟之前的sql语句的插入仅仅只是利用eclipse简单操作数据库,而ORM才可以真正称得上数据库和java的交互操作,可以通过java的类和方法来实现对数据库操作的函数调用。

这里我们构造方法,通过id查找每个角色的任务

 接下来我再写插入、更新以及显示当前数据表中所有数据的方法

 

 

有个代码的大坑点一定要注意,sql语句中加字符串连接一定要打单引号,我update方法中就是连接字符串时没有使用单引号导致调试了很久。

二、dao 

无非就是java类的封装,接口的使用

package jdbc;

import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import character.novel;

public class noveldao implements dao
	 public noveldao() 
	        try 
	            Class.forName("com.mysql.jdbc.Driver");
	         catch (ClassNotFoundException e) 
	            e.printStackTrace();
	        
	    
	 public Connection getConnection() throws SQLException 
	        return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root",
	                "123456");
	    
	 
	    public void see() 
	        try 
	            Class.forName("com.mysql.jdbc.Driver");
	         catch (ClassNotFoundException e) 
	            e.printStackTrace();
	        
	      
	        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "123456");
	            Statement s = c.createStatement();) 
	        	String sql = "select * from novel";
	        	ResultSet rs = s.executeQuery(sql);
	            while (rs.next())
	            
	            	String name = rs.getString(2);
	            	String area = rs.getString(3);
	            	String task = rs.getString(4);

	            	System.out.println(name + " " + area + " " + task);
	            
	         catch (SQLException e) 
	            e.printStackTrace();
	        
	    
	   
	    public void update(int i ,String t)
	    
	    	 try 
	             Class.forName("com.mysql.jdbc.Driver");
	          catch (ClassNotFoundException e) 
	             e.printStackTrace();
	          
	    	 
	    	 
	         try(Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "123456");
	                 Statement s = c.createStatement();)  
	        	 String sql = "update novel set task = '" + t + "' where id = '" + i + "'";                    
	             s.execute(sql);
	          catch (SQLException e) 
	             e.printStackTrace();
	          
	    
	    
	    public void add(novel n)
	    
	    	 try 
	             Class.forName("com.mysql.jdbc.Driver");
	          catch (ClassNotFoundException e) 
	             e.printStackTrace();
	          
	         String sql = "insert into novel values(null,?,?,?)";
	         try(Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "123456");
	                 PreparedStatement ps = c.prepareStatement(sql);)                      
	             ps.setString(1, n.name);
	             ps.setString(2, n.area);
	             ps.setString(3, n.task);
	             ps.execute();
	          catch (SQLException e) 
	             e.printStackTrace();
	          
	    

 这里与java语法的接口和抽象类有相关联,最近需要重新过一遍java基础语法:

抽象类:
抽象类:含有abstract修饰符的class。抽象类不能创建实例对象,类中的方法不必是抽象的,但是抽象类中定义的抽象方法必须在子类中实现,所以抽象类不能有抽象构造方法或抽象静态方法。
接口:
可以说成是抽象类的一种特例,接口不能创建实例对象,接口中的所有方法都必须是抽象的。接口中的方法默认为public abstract类型,接口中的成员变量类型默认为public static final。

区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量。
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
8. 如果一个类中有抽象方法,那么这个类只能是抽象类。但是抽象类中可以没有抽象方法

三、数据库连接池

1、传统连接

总结一下,就是需要就开连接,用完就关,见一个开一个

2、使用池

总结一下,就是规定了连接上限防止卡顿,连接不会关闭,排队轮流用

3、ConnectionPool构造方法和初始化

1. ConnectionPool() 构造方法约定了这个连接池一共有多少连接

2. 在init() 初始化方法中,创建了size条连接。 注意,这里不能使用try-with-resource这种自动关闭连接的方式,因为连接恰恰需要保持不关闭状态,供后续循环使用

3. getConnection, 判断是否为空,如果是空的就wait等待,否则就借用一条连接出去

4. returnConnection, 在使用完毕后,归还这个连接到连接池,并且在归还完毕后,调用notifyAll,通知那些等待的线程,有新的连接可以借用了。
 

第六周作业(1.5小时)

一、PreparedStatement

PreparedStatement也可以用来执行sql语句,但是需要注意:它需要用sql创建好PreparedStatement,而Statement不需要用sql来创建。

优点:

1、具有较好的可维护性和可读性,参数的分别插入减少了错误的发生,更加符合程序设计思维。2、预编译的机制让其性能更强。3、防止sql注入式攻击       

 

那么再次尝试一下statement的插入,对比发现同样一条语句差了差不多两百毫秒

 

二、execute与executeUpdate 

相同:都可以执行数据库的增加、删除、修改操作;

e不同:1、excute可以执行查询语句,而executeUpdate不可以。2、excuteget需要用ResultSet才能查询修改结果,executeUpdate会直接返回有多少条数据受到了影响,但不会显示细节。

三、获取id 

这个可能实际开发会用到,略微练习

 

 四、事务

事务功能可以批量处理数据库操作,我认为是比较实用的,可以很有效的避免处理大量数据时细节出错而造成大规模错误的现象。

通过 c.setAutoCommit(false);关闭自动提交
使用 c.commit();进行手动提交

我尝试进行批量处理id的修改,我想玩点花样,于是用了for循环来处理,这是修改前的数据表。 

这是删除后

 代码:

 

以上是关于第六周作业完成,一个半小时的主要内容,如果未能解决你的问题,请参考以下文章

四巨头第六周作业

第六周作业

第六周学习进度

第六周技术学习

N26-第六周作业

第六周作业