Properties类给你带来一点小帮助

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。



以下是比较常用的方法:

String getProperty(String key) //用指定的键在此属性列表中搜索属性。

String getProperty(String key,String defaultValue)//用指定的键在属性列表中搜索属性。

Object setProperty(String key, String value)//调用 Hashtable 的方法 put。

void load(InputStream inStream)//从输入流中读取属性列表(键和元素对)。

void loadFromXML(InputStreamin)//将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。

void store(OutputStream out,String comments)

//以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表

(键和元素对)写入输出流。

void storeToXML(OutputStream os,String comment,String encoding)

//使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。


下面我们通过案例来使用其中一些方法

案例1:创建一个properties文件

/**
	 * 把一些属性内容保存到properties文件中
	 */
	public static void test1(){
		Properties p=new Properties();
		p.setProperty("name", "ricky");
		p.setProperty("sex", "man");
		p.setProperty("age","18");
		try {
			p.store(new FileOutputStream("msg.properties"), "this is my first properties!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}



案例2:读取一个properties文件

/**
	 * 读取properties文件,并把文件中的键值输出来
	 */
	public static void test2() {
		Properties p=new Properties();
		try {
			p.load(new FileInputStream("msg.properties"));
			Set<Entry<Object, Object>> set=p.entrySet();
			for (Iterator iterator = set.iterator(); iterator.hasNext();) {
				Entry<Object, Object> entry = (Entry<Object, Object>) iterator.next();
				System.out.println(entry.getKey()+"="+entry.getValue());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}





案例3:创建一个XML文件

/**
	 * 把一些属性保存到XML文件中
	 */
	public static void test3() {
		Properties p=new Properties();
		p.setProperty("name", "kanman");
		p.setProperty("sex", "woman");
		p.setProperty("age","20");
		try {
			p.storeToXML(new FileOutputStream("msg.xml"), "this is my first XML!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}




案例4:读取一个XML文件

/**
	 * 读取xml文件中的键值对
	 */
	public static void test4() {
		Properties p=new Properties();
		try {
			p.loadFromXML(new FileInputStream("msg.xml"));
			Set<Entry<Object, Object>> set=p.entrySet();
			for (Iterator iterator = set.iterator(); iterator.hasNext();) {
				Entry<Object, Object> entry = (Entry<Object, Object>) iterator.next();
				System.out.println(entry.getKey()+"="+entry.getValue());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}





案例5:综合利用案例(通过数据库查找内容)

我们连接数据库时,需要记住ip地址,用户名,密码,还有一个驱动名称。这些都是我们连接数据库必备的数,但

是往往我们很难记住它们,而今天我们刚好学习到properties类,我们就利用它来创建一个properties文件,后把

连接数据库必备的数据写入这个文件中,我们再次连接时,就可以通过读取文件使用里面的数据进行连接,大减少

我们的工作量。

jdbc.properties文件:



同样,在java中编辑SQL语句时会很麻烦,而为了今天的内容,这次我们创建个XML文件来存放要执行的SQL语句。

sql.xml文件:



这里我使用了3种执行的语句:

第一种是不带参数的语句查询

第二种是带一个参数的语句查询

第三种是带2个(多个)参数的语句查询

代码示例:(部分代码有注释)

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

public class jdbcDemo {
	/**
	 * 通过读取jdbc.properties来连接数据库
	 * @return 返回一个数据库连接
	 */
	public static Connection getConnection() {
		Connection conn=null;
		Properties p=new Properties();
		try {
			p.load(new FileInputStream("jdbc.properties"));
			Class.forName(p.getProperty("driverName",""));
			conn=DriverManager.getConnection(p.getProperty("ip"), p.getProperty("username"), p.getProperty("password"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	/**
	 * 从XML文件中获取SQL语句
	 * @param key:根据key键来获取对应的值
	 * @return 返回对应的语句
	 */
	public static String getMsgFromXML(String key) {
		Properties p=new Properties();
		String msg="";
		try {
			p.loadFromXML(new FileInputStream("sql.xml"));
			msg=p.getProperty(key);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return msg;
	}
	/**
	 * 获取一个表中的所有信息
	 */
	public static void getMsgFromSql() {
		Connection conn=getConnection();
			System.out.println("sql语句:");
			System.out.println(getMsgFromXML("user.list"));
			System.out.println(getMsgFromXML("user.list.byName"));
			System.out.println(getMsgFromXML("user.list.byId.byName"));
			System.out.println("-----------------------");
			System.out.println("查询user表的所有信息");
			//SQL语言是:select * from user
		try {
			Statement stat=conn.createStatement();
			ResultSet rs=stat.executeQuery(getMsgFromXML("user.list")) ;
			while(rs.next()){
				String id=rs.getString("id");
				String name=rs.getString("username");
				String password=rs.getString("password");
				System.out.println(id+" "+name+" "+password);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 带条件的SQL查询
	 * 根据username=?在数据库查找信息
	 */
	public static void getMsgByName(String username) {
		Connection conn=getConnection();
		System.out.println("带条件查询SQL语句,条件是username="+username);
		String sql=getMsgFromXML("user.list.byName");
		PreparedStatement ps=null;
		//创建一个preparedStatement对象,这个对象是可以传入参数进去的,可以执行带参数的SQL查询
		ResultSet rs=null;
		try {
			ps=conn.prepareStatement(sql);
			//获取连接后的prepareStatement对象,并向这个对象传入要执行的SQL语句
			ps.setString(1, username);
			//设置第一个参数为username,可以设置多个参数
			rs=ps.executeQuery();
			while(rs.next()){
				String id=rs.getString("id");
				String name=rs.getString("username");
				String password=rs.getString("password");
				System.out.println(id+" "+name+" "+password);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 带多个条件的SQL语句查询
	 * 在user_msg表通过username=?和id=?来查询
	 * 并用ResultSetMetaData对象,在不知道行的列数时,把所有信息输出
	 * userName:人名  		id:id
	 */
	public static void getMsgByTableByName(String userName,String id) {
		Connection conn=getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		ResultSetMetaData rsmd=null;
		try {
			ps=conn.prepareStatement(getMsgFromXML("user.list.byId.byName"));
			ps.setString(1, userName);
			ps.setString(2, id);
			rs=ps.executeQuery();
			rsmd=rs.getMetaData();
			int length=rsmd.getColumnCount();
			//在不知道表的列数时,可以通过以上两行代码获取
			while(rs.next()){
				//如此输出,就可以不考虑列数来输出一行的所有信息
				for(int i=1;i<=length;i++){
					System.out.print(rs.getString(i)+" ");
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		getMsgFromSql();
		System.out.println("-----------------------");
		getMsgByName("candy");
		System.out.println("-----------------------");
		getMsgByTableByName("ricky", "1");
	}

}
user表:


user_msg表:

查询结果:




注意:

也许有些人会跟我有相同的想法,能否设置表名为参数,然后就可以在不同的表上查询信息了。

但是博主亲生经历过后并不可以实现,然后我去百度查询后知道了原因:

在SQL语句中,表名不是参数,只有表中的元素才能成为变量,才可以设置参数。而如果在SQL语句在表名出设置?,

则编译时只会按?来执行SQL语句,然后JAVA就会抛出一个sql语句编写错误的异常。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值