- 使用properties配置文件
开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
通常情况下,我们习惯使用properties文件。
(1)文件位置:任意,建议src下
(2)文件名称:任意,扩展名为properties
(3)文件内容:一行一组数据,格式是“key=value”
a) key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
b) value值不支持中文,如果需要使用非英文字符,将进行unicode转换。
2.在项目跟目录下,创建文件,输入“db.properties”文件名。
文件中的内容
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=root
编写JDBC的工具类,获取数据库的连接
采用配置文件的方式
public class JDBCUtilsConfig {
private static Connection con;
private static String driverClass;
private static String url;
private static String username;
private static String password;
static {
try {
readConfig();
Class.forName(driverClass);
con =DriverManager.getConnection(url,username,password);
} catch (Exception e) {
throw new RuntimeException(e + "数据库连接失败");
}
}
private static void readConfig() throws IOException {
InputStream resourceAsStream = JDBCUtilsConfig.class.getClassLoader()
.getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(resourceAsStream);
driverClass = pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
}
public static Connection getConnection() {
return con;
}
}
加载properties配置文件
Io读取文件,键值队存储到集合
从集合中以键值队方式获取数据库的连接信息,完成数据库的连接
public class PropertiesDemo {
public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
InputStream resourceAsStream = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro=new Properties();
pro.load(resourceAsStream);
String property = pro.getProperty("driverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(property);
Connection connection = DriverManager.getConnection(url,username,password);
System.out.println(connection);
}
}
DBUtils
如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
使用QueryRunnery类,实现对数据库表的 insert delete update
调用QueryRunnery类的方法update (Connection con,String sql,Oject…para)
Oject…para 可变参数,Object类型,SQL语句会出现?占位符
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍:
QueryRunner中提供对sql语句操作的API.
ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
public class QueryRunnerDemo {
private static Connection con=JDBCUtilsConfig.getConnection();
public static void main(String[] args) throws SQLException {
//insert();
// update();
delete();
}
/*
* 定义方法,使用QueryRunnery类的方法delete将数据表中的数据删除
*/
public static void delete() throws SQLException{
//创建一个QueryRunner类对象
QueryRunner qr=new QueryRunner();
String sql="DELETE FROM sort WHERE sid=?";
int update = qr.update(con,sql,6);
System.out.println(update);
DbUtils.closeQuietly(con);
}
/*
* 定义方法,使用QueryRunnery类的方法update将数据表中的数据修改
*/
public static void update() throws SQLException{
//创建一个QueryRunner类对象
QueryRunner qr=new QueryRunner();
String sql="UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
//将三个占位符的实际参数,写在数组中
Object[] obj={"化妆品",280,"美白保湿",2};
//调用QueryRunner方法update
int update = qr.update(con,sql,obj);
System.out.println(update);
DbUtils.closeQuietly(con);
}
/*
* 定义方法,使用QueryRunner类的方法update向数据表中,添加数据
*/
public static void insert() throws SQLException{
//创建QueryRunner类对象
QueryRunner qr=new QueryRunner();
String sql="INSERT INTO sort (sname,sprice,sdesc)VALUES (?,?,?)";
//将三个占位符的实际参数,写在数组中
Object[] obj={"衣袜",136.9,"促销"};
//调用QueryRunner类的方法update执行SQL语句
int update = qr.update(con,sql,obj);
System.out.println(update);
DbUtils.closeQuietly(con);
}
}
ArrayHandler与ArrayListHandler查询
QueryRunner数据查询操作
调用QueryRunner类方法query(Connection con,Strinng sql,ResultSetHandler r,Object…params)
ResultSetHandler r 结果集的处理方式,传递ResultHandler接口实现类
Object…params SQL语句中的?占位符
注意:query方法返回值,返回的是T 泛型,具体返回值类型,跟随结果集处理方式变化
public class QueryRunnerDemo2 {
private static Connection con = JDBCUtilsConfig.getConnection();
public static void main(String[] args) throws SQLException {
//arrayHandler();
arrayListHandler();
}
/*
* 结果集第二种处理方法,ArrayListHandler
* 将结果集的每一行,封装到对象数组中,出现很多对象数组
* 对象数组存储到List集合
*/
public static void arrayListHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * from sort";
//调用query方法,结果集处理的参数,传递实现类ArrayListHandel
//方法返回值,每一行是第一行对象数组,存储到List
List<Object[]> result= qr.query(con, sql, new ArrayListHandler());
//System.out.println(result);
//集合遍历
for (Object[] objects : result) {
//遍历对象数组
for (Object object : objects) {
System.out.print(object+" ");
}
System.out.println();
}
}
/*
* 结果集第一种处理方式,ArrayHandler 将结果集的第一行存储到对象数组中 Object[]
*/
public static void arrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "select * from sort";
// 调用方法query执行查询,传递连接对象,SQL语句,结果集处理方式实现类
// 返回结果集
ArrayHandler arrayHandler = new ArrayHandler();
Object[] query = qr.query(con, sql, arrayHandler);
for (Object object : query) {
System.out.print(object);
}
}
}
BeanHandler与BeanListHandler查询
public class QueryRunnerDemo2 {
private static Connection con = JDBCUtilsConfig.getConnection();
public static void main(String[] args) throws SQLException {
//beanHandler();
beanListHandel();
}
/*
* 结果集第四种处理方法,BeanListHandle
* 将数据结果集的每一行数据,封装成javaBean对象
* 多个javaBean对象封装到List集合中
*/
public static void beanListHandel() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * FROM sort";
//调用方法传递结果集的实现类BeanListHandler
//BeanListHandler(Class<T>type)
List<Sort> query = qr.query(con, sql,new BeanListHandler<Sort>(Sort.class));
for (Sort sort : query) {
System.out.println(sort);
}
}
/*
* 结果集的三种处理方法,BeanHandle
* 将结果集的第一行数据,封装成JavaBean对象
*
* 注意:被封装成数据到javaBean对象,Sort类必须有空参数构造
*/
public static void beanHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * FROM sort";
//调用方法,传递结果集实现类BeanHandler
//BeanHandler(Class<T>type)
Sort query = qr.query(con, sql,new BeanHandler<Sort>(Sort.class));
System.out.println(query);
}
}
ColumnListHandler与ScalarHandler查询
public class QueryRunnerDemo2 {
private static Connection con = JDBCUtilsConfig.getConnection();
public static void main(String[] args) throws SQLException {
//arrayHandler();
//arrayListHandler();
//beanHandler();
//beanListHandel();
//columListHandler();
scalarHandler();
}
/*
* 结果集第六种处理方式,ScalarHandler
* 对于查询后,只有1个结果
*/
public static void scalarHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT COUNT(*) FROM sort";
Long count = qr.query(con,sql, new ScalarHandler<Long>());
System.out.println(count);
}
/*
* 结果集第五种处理方法,ColumuListHandler
* 结果集,指定列的数据,存储到List集合
* List<Object>每行列数据类型不同
*/
public static void columListHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * from sort";
//调用方法query,传递结果集实现类ColumListHandler
//实现类构造方法中,使用字符串的列名
List<Object> query = qr.query(con,sql, new ColumnListHandler<Object>("sname"));
for (Object object : query) {
System.out.println(object);
}
}
}
MapHandler与MapListHandler查询
public class QueryRunnerDemo2 {
private static Connection con = JDBCUtilsConfig.getConnection();
public static void main(String[] args) throws SQLException {
mapListHandler();
}
/*
* 结果集第八种处理方式,MapListHandler
* 将结果集每一行存储到Map集合,键:列名,值:数据
* Map集合过多,存储到List集合
*/
public static void mapListHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * FROM sort";
//调用方法query,传递结果集实现类MapListHandler
//返回List集合,存储的是Map集合
List<Map<String,Object>> query = qr.query(con,sql, new MapListHandler());
for (Map<String, Object> map : query) {
for(String key:map.keySet()){
System.out.print(key+"..."+map.get(key));
}
System.out.println();
}
}
/*
* 结果集第七种处理方法,MapHandler
* 将结果集第一行数据,封装到Map集合中
* Map<键,值>键:列名 值:这列的数据
*/
public static void mapHandler() throws SQLException{
QueryRunner qr=new QueryRunner();
String sql="SELECT * FROM sort";
//调用方法query,传递结果集实现类MapHandler
//返回值:Map集合,Map接口实现类,泛型
Map<String, Object> query = qr.query(con ,sql, new MapHandler());
for (String key:query.keySet()) {
System.out.println(key+"..."+query.get(key));
}
}
}