Java持久化bean原理(一)

25 篇文章 0 订阅
6 篇文章 0 订阅

关于hibernate中通过配置文件得到一个Session ,通过该对象,我们可以直接调用其save()方法将一个对象持久化到数据库中,这就是ORM

1、具体实现我们可以想到,项目中的bean我们通过配置文件已经将其映射到一个表中,字段等规范也已经做好了,如下:

<hibernate-mapping>
<class name="hello.Message" table="MESSAGES">
 <id name="id" column="MESSAGE_ID">
  <generator class="increment"/>
 </id>
 <property name="text" column="MESSAGE_TEXT"/>
 <many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID"/>
</class>
</hibernate-mapping>


这样一个映射也就对应于这样的一个bean:

public class Message {
 private Long id;
 private String text;
 private Message nextMessage;
 private Message() {}
 public Message(String text) {
  this.text = text;
 }
 public Long getId() {
  return id;
 }
 private void setId(Long id) {
  this.id = id;
 }
 public String getText() {
  return text; 
 }
 public void setText(String text) {
  this.text = text;
 }
 public Message getNextMessage() {
  return nextMessage;
 }
 public void setNextMessage(Message nextMessage) {
  this.nextMessage = nextMessage;
 }
} 


我们在SessionFactory中通过配置文件得到一个Session的内部过程,便就是解析配置文件,通过多个Map或List集将映射关系保存下来了:

而后只需执行

Message message = new Message("Hello World");
session.save(message);

变持久化了,框架使用的好处便在这里,提高开发效率,减轻工作量。

 

2、没有用到相关框架时这里的一个方法也相当于持久化一个bean到数据库中,这里只是一个封装的通用解决方法:

public int insert(Class<?> type,Object bean,String table,Connection con) throws SQLException, IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		int count=0;
		PreparedStatement st=null;
		try {
			//得到该类type的java.beans.BeanInfo对象
			BeanInfo bi=Introspector.getBeanInfo(type);
			//得到类的PropertyDescriptor[] 
			PropertyDescriptor[] pds= bi.getPropertyDescriptors();
	        StringBuilder sb1 = new StringBuilder();
	        StringBuilder sb2 = new StringBuilder();
	        //pl数组存放的是根据对于的getXX()方法得到bean中的对于参数
	        List<Object> pl=new ArrayList<Object>();
			for(PropertyDescriptor pd:pds){
				if("class".equals(pd.getName()))continue;
				//Method m=pd.getReadMethod();
				//invoke对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
				Object o=pd.getReadMethod().invoke(bean);
				if(o==null)continue;
				if(sb1.toString().length()>0){
					sb1.append(",`"+pd.getName()+"`");
					sb2.append(",?");
				}else{
					sb1.append("`"+pd.getName()+"`");
					sb2.append("?");
				}
				pl.add(o);
			}
			//格式化该字符串,相当于赋值,生成插入的sql语句
			String sql=String.format("insert into %s (%s) values (%s)", table,sb1.toString(),sb2.toString());
			st=con.prepareStatement(sql);
			for(int i=0;i<pl.size();i++){
				st.setObject(i+1,pl.get(i));
			}
			//执行sql语句,相当于持久化
			count=st.executeUpdate();
		}
		finally{
			Close(st);
		}
		return count;
	}


该方法通用性也比较好,只要你将表名、连接、类对象及要持久化的bean传入即可,方法的封装性较好,可以将其放到数据访问层的顶层实现类中,然后特定的dao实现该类。

以上只是关于插入操作的的一个实现,其它持久化操作也就类似的了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值