一、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,通知那些等待的线程,有新的连接可以借用了。