Java连接数据库,properties文件读取出错解决。
-
Java连接数据库的几个步骤:
- 加载数据库驱动
- 创建数据库连接
- 执行SQL语句
- 获得查询结果
- 关闭连接
下面是一个具体的例子:(数据库名:test 表名:test)
public static void main(String[] args) {
//加载数据库驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//创建数据连接
String url = "jdbc:mysql://127.0.0.1:3306/test"; //连接字符串
String username = "root"; //登录数据库的用户名
String password = "root"; //登录数据库的密码
try {
//创建数据连接
Connection connection = DriverManager.getConnection(url, username, password);
//声明sql语句
String sql_1 = "select * from test";
//创建Statement对象,利用该对象来执行SQL语句
Statement statement = connection.createStatement();
//执行SQL语句,获得结果集
ResultSet resultSet = statement.executeQuery(sql_1);
//输出结果
while (resultSet.next()) {
System.out.println(resultSet.getInt("id") + "\t" + resultSet.getString("name"));
}
/*//创建PrepareStatement对象来执行SQL语句
PreparedStatement preparedStatement = connection.prepareStatement("select * from test where id = ?");
preparedStatement.setInt(1, 1);
ResultSet resultSet1 = preparedStatement.executeQuery();*/
//关闭连接 后声明的先关闭
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
将用户名、密码和数据库名字存入配置文件是一个好的习惯看下面的例子:
mysql.properties文件的内容如下:
driverClassName=com.mysql.jdbc.Driver
user=root
password=root
database=test
host=localhost
port=3306
此时获取数据库连接的方法如下:
/**
* @return 数据库连接对象
*/
public static Connection getConnection() {
Connection conn = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立连接
// 将用户名、密码和数据库名字存入配置文件是一个好的习惯
String path = DBHelper.class.getClassLoader().getResource("mysql.properties").getPath();
Properties properties = new Properties();
FileInputStream fis;
try {
fis = new FileInputStream(path);
//eclipse下的读取方法
//fis = DBHelper.class.getClassLoader().getResourceAsStream("mysql.properties");
properties.load(fis);
String database = properties.getProperty("database");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
if (database != null && user != null && password != null) {
String url = "jdbc:mysql://localhost:3306/" + database + "?useUnicode=true&characterEncoding=utf-8";
conn = DriverManager.getConnection(url, user, password);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return conn;
}
如果在读取properties文件出错时候,可以参考下面的方法(参考了该篇博文:https://blog.csdn.net/jeryjeryjery/article/details/53257921):
首先,我们要将properties文件部署在$app/WEB-INF/classes文件夹里,比如将mysql.properties文件放在demo这个web应用下时,该文件所在的路径为$demo/WEB-INF/classes/mysql.properties。
然后读取的时候分为两种情况读取:
(一)在Servlet类中的读取
有两种读取方式:
1.直接将properties文件读入的流中:
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/mysql.properties");
Properties prop = new Properties();
prop.load(in);
prop.getProperty("username");
2.获得properties文件的路径,然后在用流读出:
String path = this.getServletContext().getRealPath("/WEB-INF/classes/mysql.properties");
FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
prop.getProperty("username");
推荐第二种方法,易于理解。
(二)在非Servlet类中(普通java类中)的读取
也有两种读取方式:
1.直接将文件装载到内存中:
InputStream in = Demo.class.getClassLoader().getResourceAsStream("mysql.properties");
Properties prop = new Properties();
prop.load(in);
prop.getProperty("username");
但存在一些缺陷:类装载器加载内容时,会先查找内存中是否已经存在相应的内容,如果有就不再加载直接使用内存中的,所以此方法,第一次加载后,如果文件内容有变动,第二次加载后还是原来的内容,无法加载修改后的内容。下边的方法取文件的绝对路径来加载不会有这种问题。
2.读取到文件的路径,然后用流读出:
String path = Demo.class.getClassLoader().getResource("mysql.properties").getPath();
FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
prop.getProperty("username");