关于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实现该类。
以上只是关于插入操作的的一个实现,其它持久化操作也就类似的了。