我是一枚业余编程爱好者,纯菜鸟一只。。。。 目前学到javaweb三层架构,而DAO层(数据操作层)不可避免的需要学习一些数据库操作的工具,了解到三种数据库操作的工具:jdbc,DBUtils,Mabites,后两者是对jdbc进行过一定封装的框架吧(貌似。。)。
所以,今天从基本的jdbc开始学习,一天总结如下: jdbc操作数据库需要的步骤:
0--编写配置文件(文件格式为文件名.peroperties) 代码如下:
#1--数据库驱动 mysql数据库:com.mysql.jdbc.Driver;oracle数据库:oracle.jdbc.driver.OracleDriver
driver=com.mysql.jdbc.Driver
#2--数据库的url(mysql数据库---jdbc:mysql://ip:port/数据库名?字符等设定)
#即要连接哪台机器上的哪个数据库,以及要求的字符编码格式等
url=jdbc:mysql://localhost:3306/mytables?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
#3--数据库的用户名和密码信息
user=root
password=123456
1--编写一个读取配置文件键值对数据的方法
// 编写读取配置文件jdbc.properties里配置好的信息的方法---------properties文件读取方法
public static void readProperties(String propertiesPath) throws IOException {
//(1)--创建一个空的peoperties集合对象(有key 和value构成的键值对集合)
Properties properties = new Properties();
//(2)--为之前写好的配置文件jdbc.properties创建一个字节输入流,用于读取键值对。
FileInputStream fileInputStream = new FileInputStream(new File(propertiesPath));
//(3)--调用Properties的load()方法,通过字节流读取jdbc.properties里的键值对。
properties.load(fileInputStream);
//(4)--读取键值对
databaseUsername = properties.getProperty("user");
databasePassword = properties.getProperty("password");
databaseUrl = properties.getProperty("url");
driver = properties.getProperty("driver");
}
2--注册数据库驱动(放入一个静态代码块中,当创建所在类对象时,会优先加载静态代码块进行初始化)
static {
try {
// 0---先读取配置文件jdbc.properties里配置好的信息
readProperties("D:\JAVA\java 代码笔记\myweb\web0\src\jdbc.properties");
// 1--注册驱动
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
System.out.println("数据库注册驱动异常,检查配置数据");
}
// 4--数据库连接初始化结束,
// 数据库sql语句操作对象为Steatement或 PreparedStatement(预处理对象),由连接对象获取;在具体需要的时候创建连接对象和sql操作对象即可
//使用完成后需要依次关闭:连接对象、数据库操作对象和结果集对象
}
3--编写一个方法,以方便在本次数据库操作后关闭相关资源
private void closeJdbc(Connection con, PreparedStatement pre, ResultSet res) {
try {
if (con != null) {
con.close();
}
if (pre != null) {
pre.close();
}
if (res != null) {
res.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
4--创建数据库连接,
Connection connection = DriverManager.getConnection("数据库的url", "数据库的用户名", "数据库连接密码");
5--创建数据库sql操作对象statement:只能用于不带参数的sql语句操作/preparedStatement:预处理对象,sql语句可以带参数,但执行增删改查前需要更具参数位置进行设置(sql预处理)
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, username);//设置sql语句第一个String类型的参数值为变量username的值。
preparedStatement.setString(2, password);
6--preparedStatement(或statement)调用api增删改查: 常用api:
preparedStatement.executeQuery();//执行数据查询时候使用
preparedStatement.executeUpdate();//数据库的增删改(如执行create,insert into等)
7--执行preparedStatement.executeQuery()进行数据库查询后,查询得到的结果是以类似键值对的形式数据组成的一个结果集 ResultSet
ResultSet resultSet = preparedStatement.executeQuery();
8--查询得到数据后如何读取结果集里的数据呢? 相关api:
resultSet.getString(int i);//get结果集里第i个字符串数据
resultSet.getString(String name)//get 结果集里key名为name的字符串
....
这里有一个特别注意点:get结果集数据需要与next()函数搭配使用;一开始,结果集的指针是位于第一个数据前面,未指向任何数据,此时调用get获取数据会抛异常:Before start of result set (结果集开始前);所以需要先调用一次resultSet.next(),会使得指针往后移动一个位置指向第一个数据,之后就可以进行任意数据get了。
关于.next()的特性: 1--该方法每调用一次,指针就会往后移动一个位置,直到移动到最后一个数据后面停止。 2--该方法会返回一个boolea型值,如果当前位置有数据则返回true,否则返回false; 基于以上特性可以利用该方法判断是否查询到数据:
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()==false){
System.out.println("未查到数据,结果集为空");
}
还能使用该方法遍历结果集,直到resultSet.next()返回false
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println("遍历结果集");
}
以上,还需要注意两点: (1)如果结果集为空时,指针亦未指向任何数据,不能.getString()结果集数据,否则会抛异常:【Illegal operation on empty result set.】(对空结果集非法操作) (2)如果指针已经到了结果集最后一个数据后面了,它未未指向任何数据,就不要再get结果集数据了,否则会抛异常:After end of result set (结果集结束后)
综合以上,可见jdbc有多麻烦,光是注册驱动就挺麻烦的,还要每次手动释放资源,而且需要编写很多与业务无关的代码。。。。。 后续将学习DBUtils,Mabites,应该会比jdbc简洁好用吧,而且功能应该更强大。