目前最好的关系型数据库。
基本的CRUD命令
SQL语句。select(R),update(U),delete(D),insert(C)
中小型项目非常好用的关系型数据库。
灵活,小巧。
ER图---》根据需求分析数据库结构。
三范式---》学会使用范式来规范表结构
在Java中连接数据库技术。
在Java代码中想操作数据库中的数据,就必须使用到JDBC技术。
提供JDBC从Java代码中想数据库发送执行的SQL语句。
工具类的封装。DAO-Service 的分层。
一定要遵守编码规范。
就是一套使用的规范。大家按规范编写就没有什么特别难理解的部分。
难点:
a 要使用连接池技术
b ThreadLocal类。理解上需要大家想。
a 按规范比那些代码。
b 练习
JDBC : Java DataBase Connector 中文:Java数据库连接技术
JDBC 是一种结束。一种在Java程序中连接数据库的技术。
使用JDBC可以实现在Java代码中去操作数据库表中的记录。
JDBC是一个持久化技术
化:过程。
数据是分为零食状态和持久状态。
临时状态:数据保存在内存中。代码在运行时的数据。
持久状态:数据保存在硬盘中,以文件的方式长期保存的数据。
持久化:数据在临时状态 与 持久状态 之间进行切换的过程。
1 将Java程序中的数据保存到数据库中。
2 将数据库职工的数据读取到Java程序中
JDBC是只一套规范,约定了Java语言连接到不同数据库产品时的标准。
例如:USB接口。
任何数据库产品,想让自己的产品,可以使用JDBC连接到Java程序,就要按JDBC的标准编写数据库的驱动。
数据库的驱动是数据库厂商按JDBC标准,由各数据库厂商自己编写的。
在Java程序中接口表示了一种能力,一种规范,一个标准,一种约定。
JDBC本身就是一组接口。各大数据库厂商需要根据自己的数据库去实现这一组接口。
Connection是连接对象,负责创建Java程序与数据库之间的连接。
Connection接口的实现类由各数据库厂商提供。称为驱动类。操作数据库之前必先获得驱动类。
常用的子接口PreparedStatement接口。
PreparedStatement是操作对象。负责通过Connection的连接,向数据库执行SQL语句。
ResultSet是结果集接口,当我们使用PreparedStatement向数据库执行Select命令时,Java程序需要能接收查询结果。
在Java程序端就是使用ResultSet对象来接收查询结果的。
数据库的查询结果就是一个二维表格。
ResultSet也是一个表格的处理方式。
使用JDBC操作数据库的步骤就三步:
1 打开连接
将Java程序与数据库创建连接。
2 操作数据库
通过Java程序向数据库发送SQL语句执行。
分增删改,和 查询。
查询有返回值,返回值叫结果集。
3 关闭连接
释放资源,一定要执行的部分。finally块。
打开连接,先获取连接数据库的驱动类。
驱动类是数据库厂商提供,是个Jar包。
还要再确定四个参数:
1 驱动类的名称
2 连接数据库的字符串
3 数据库账号
4 密码
//四大参数
String driverClassName="oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "no5";
String userPass = "123456";
//获得连接对象
Connection conn = DriverManager.getConnection(url,userName,userPass);
//通过PreparedStatement对象来操作数据库
String sql = "insert into users_no5(user_id,user_name) values( SEQ01.nextval , '都醒着')";
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.executeUpdate();//执行增删改语句的方法
rs对象就是一个指向二维表格的引用。rs对象每次只能指向一行。通过next()向下移动一行。
通过getXXX()方法获取指定列的值。
//通过PreparedStatement对象来操作数据库
String sql = "select * from users_no5";
PreparedStatement pstat = conn.prepareStatement(sql);
ResultSet rs = pstat.executeQuery();//rs就是一个二维表格。
while(rs.next()){//向下移一行。
System.out.println(rs.getInt("user_id"));
System.out.println(rs.getString("user_name"));
System.out.println("----------");
}
//关闭连接
conn.close();
使用PreparedStatement可以提前将要执行的SQL语句进行数据库端的预编译。
使用PreparedStatement可以提高执行效率。并安全。
在创建pstat对象时,就以及提前将SQL写好了。
String sql = "insert into users_no5(user_id,user_name) values(seq01.nextval,'XXX')" ;
PreparedStatement pstat = conn.prepareStatement(sql);
String sql = "insert into users_no5(user_id,user_name) values(seq01.nextval,?)" ;
PreparedStatement pstat = conn.prepareStatement(sql);
一定是在SQL语句执行之前,先为所有的?号进行赋值。
public abstract void setString(int parameterIndex,String x)
参数:parameterIndex 表示?的索引。从1开始。
x 表示值。
String sql = "insert into users_no5(user_id,user_name) values(seq01.nextval,?)" ;
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setString(1,"???");
int i = pstat.executeUpdate();
1 PreparedStatement因为是预编译的原因,可以使用占位符?,这样在之后可以调用set方法来灵活改变SQL语句的内容。
2 PreparedStatement的在执行一次是的开销要大于Statement,但是面对一次性操作也不会带来更多的好处。
3 在大量对象的情况下,由于PreparedStatement是预编译,所以在执行时效率更高。
ResultSet对象是用来接收查询结果的对象。
数据库的查询结果就是一个二维表格。
rs对象就是一个指向查询结果每一行的一个指针。
通过pstat对象执行 executeQuery()方法获得一个RS对象。
String sql = "select * from users_no5 order by user_id ";
PreparedStatement pstat = conn.prepareStatement(sql);
ResultSet rs = pstat.executeQuery();
BOF表示第一行的上面。
EOF表示最后一行的下面。
rs对象就是一个指向查询结果每一行的一个指针。
查询结果能不能没有记录?可以。
所以rs对象默认指向BOF。只有调用一次next()方法才能指向第一行。
如果rs对象调用next()方法,指向了EOF,就表示当前查询结果已经没有了。next()方法返回false;
boolean next() throws SQLException;
向一移动一行。当指向EOF时返回false。
ResultSet rs = pstat.executeQuery();
while(rs.next()){int userId = rs.getInt("user_id");String name = rs.getString("user_name");System.out.println(userId+":"+name);System.out.println("----------");
}
String getString(String columnLabel) throws SQLException;
int getInt(String columnLabel) throws SQLException;
封装原则:将变化的 和 不变化的 分开进行封装。
以实现,在需求改时,对变化的部分进行修改时,不会影响到不变化 的部分。
数据库的操作步骤:3步。
1 打开连接
2 操作数据库
3 关闭连接
变化 :2 操作数据库 (DAO 数据访问对象)
这部分内容是根据操作的不同,代码不一致。
针对不同的表。针对同一张表的不同的CRUD。
不变化 :1 打开连接 和 3 关闭连接 (工具类)
不管对数据库进行什么操作, 都必须先打开连接,最后关闭连接。
在这个工具类中,要封装二个行为。
1 打开连接
3 关闭连接
/*** 在这个工具类中,要封装二个行为。* 1 打开连接 getConn()* 3 关闭连接 closeConn()*/
public class ConnUtils {private static Connection conn;private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";//SID数据库实例名private static final String USER_NAME = "no5";private static final String USER_PASS = "123456";private static final String CLASS_NAME = "oracle.jdbc.driver.OracleDriver";/*** 打开连接** @return 连接对象*/public static Connection getConn() throws SQLException {if (conn == null || conn.isClosed()) {conn = DriverManager.getConnection(URL, USER_NAME, USER_PASS);}return conn;}/*** 关闭连接*/public static void closeConn() throws SQLException {try {if (conn != null && !conn.isClosed()) {conn.close();}} finally {conn = null;}}
}
数据库表:users_no5
表示的是用户信息。
表中的每一第记录就是一个用户实体。
表结构: