usertype的详细解释和使用实例

 usertype的详细解释和使用实例

java 代码
 
  1. import java.sql.PreparedStatement;  
  2. import java.sql.ResultSet;  
  3. import java.sql.SQLException;  
  4.   
  5. import net.sf.hibernate.HibernateException;  
  6.   
  7. /** 
  8.  * @author hy-he 
  9.  * 
  10.  */  
  11. public interface UserType {  
  12.   
  13.  /** 
  14.   * 返回UserType所映射字段的SQL类型(java.sql.Types) 
  15.   * 返回类型为int[],其中包含了映射个字段的SQL类型代码 
  16.   * (UserType可以映射到一个或者多个字段) 
  17.   * @return 
  18.   */  
  19.  public int[]sqlTypes();  
  20.   
  21.   
  22.  /** 
  23.   * UserType.nullSafeGet()所返回的自定义数据类型 
  24.   * @return 
  25.   */  
  26.  public Class returnedClass();  
  27.   
  28.   
  29.  /** 
  30.   * 自定义数据类型的比对方法 
  31.   * 此方法将用作脏数据检查,参数x、y分别为数据的两个副本 
  32.   * 如果equals方法返回false,则Hibernate将认为数据发生变化,并将变化更新到数据库表中 
  33.   * @param x 
  34.   * @param y 
  35.   * @return 
  36.   * @throws HibernateException 
  37.   */  
  38.  public boolean equals(Object x,Object y)throws HibernateException;  
  39.   
  40.   
  41.  /** 
  42.   * 从JDBC ResultSet读取数据,将其转换为自定义类型后返回 
  43.   * (此方法要求对克能出现null值进行处理) 
  44.   * names中包含了当前自定义类型的映射字段名称 
  45.   * @param rs 
  46.   * @param names 
  47.   * @param owner 
  48.   * @return 
  49.   * @throws HibernateException 
  50.   * @throws SQLException 
  51.   */  
  52.  public Object nullSafeGet(ResultSet rs,String[] names,Object owner)throws HibernateException,SQLException;  
  53.   
  54.   
  55.  /** 
  56.   * 本方法将在Hibernate进行数据保存时被调用 
  57.   * 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段 
  58.   * @param st 
  59.   * @param value 
  60.   * @param index 
  61.   * @throws HibernateException 
  62.   * @throws SQLException 
  63.   */  
  64.  public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException;  
  65.   
  66.   
  67.  /** 
  68.   * 提供自定义类型的完全复制方法 
  69.   * 本方法将用构造返回对象 
  70.   * 当nullSafeGet方法调用之后,我们获得了自定义数据对象,在向用户返回自定义数据之前, 
  71.   * deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户 
  72.   * 此时我们就得到了自定义数据对象的两个版本,第一个是从数据库读出的原始版本,其二是我们通过 
  73.   * deepCopy方法构造的复制版本,原始的版本将有Hibernate维护,复制版由用户使用。原始版本用作 
  74.   * 稍后的脏数据检查依据;Hibernate将在脏数据检查过程中将两个版本的数据进行对比(通过调用 
  75.   * equals方法),如果数据发生了变化(equals方法返回false),则执行对应的持久化操作 
  76.   * 
  77.   * @param value 
  78.   * @return 
  79.   * @throws HibernateException 
  80.   */  
  81.  public Object deppCopy(Object value)throws HibernateException;  
  82.   
  83.   
  84.  /** 
  85.   * 本类型实例是否可变 
  86.   * @return 
  87.   */  
  88.  public boolean isMutable();  
  89. }  




1.实现UserType接口的EMailList自定义类型

java 代码
 
  1. import java.sql.PreparedStatement;  
  2. import java.sql.ResultSet;  
  3. import java.sql.SQLException;  
  4. import java.sql.Types;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.apache.commons.lang.StringUtils;  
  9.   
  10. import net.sf.hibernate.Hibernate;  
  11. import net.sf.hibernate.HibernateException;  
  12. import net.sf.hibernate.UserType;  
  13. import net.sf.hibernate.hql.Parser;  
  14.   
  15. /** 
  16.  * @author hy-he 
  17.  * 
  18.  */  
  19. public class EMailList implements UserType {  
  20.  private List emails;  
  21.  private static final String SPLITTER = ";";  
  22.  private static final int[] TYPES = new int[]{  
  23.   Types.VARCHAR  
  24.  };  
  25.  /* (non-Javadoc) 
  26.   * @see net.sf.hibernate.UserType#sqlTypes() 
  27.   */  
  28.  public int[] sqlTypes() {  
  29.   // TODO Auto-generated method stub  
  30.   return TYPES;  
  31.  }  
  32.   
  33.  /* (non-Javadoc) 
  34.   * @see net.sf.hibernate.UserType#returnedClass() 
  35.   */  
  36.  public Class returnedClass() {  
  37.   // TODO Auto-generated method stub  
  38.   return List.class;  
  39.  }  
  40.   
  41.  /* (non-Javadoc) 
  42.   * @see net.sf.hibernate.UserType#equals(java.lang.Object, java.lang.Object) 
  43.   */  
  44.  public boolean equals(Object x, Object y) throws HibernateException {  
  45.   if(x == y) return true;  
  46.   if(x != null && y != null){  
  47.    List xList = (List)x;  
  48.    List yList = (List)y;  
  49.    if(xList.size() != yList.size()) return false;  
  50.    for(int i = 0;i<xList.size();i++){  
  51.     String str1 = (String)xList.get(i);  
  52.     String str2 = (String)yList.get(i);  
  53.     if(!str1.equals(str2)) return false;  
  54.    }  
  55.    return true;  
  56.   }  
  57.   return false;  
  58.  }  
  59.   
  60.  /* (non-Javadoc) 
  61.   * @see net.sf.hibernate.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object) 
  62.   */  
  63.  public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {  
  64.   String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);  
  65.   if( value != null){  
  66.    return parse(value);  
  67.   }else{  
  68.    return null;  
  69.   }  
  70.  }  
  71.   
  72.  /* (non-Javadoc) 
  73.   * @see net.sf.hibernate.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int) 
  74.   */  
  75.  public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {  
  76.   System.out.println("Set method excecuted");  
  77.   if(value != null){  
  78.    String str = assemble((List)value);  
  79.    Hibernate.STRING.nullSafeSet(st,str,index);  
  80.   }else{  
  81.    Hibernate.STRING.nullSafeSet(st,value,index);  
  82.   }  
  83.   
  84.  }  
  85.   
  86.  /* (non-Javadoc) 
  87.   * @see net.sf.hibernate.UserType#deepCopy(java.lang.Object) 
  88.   */  
  89.  public Object deepCopy(Object value) throws HibernateException {  
  90.   List sourcelist = (List)value;  
  91.   List targetlist = new ArrayList();  
  92.   targetlist.addAll(sourcelist);  
  93.   return targetlist;  
  94.  }  
  95.   
  96.  /* (non-Javadoc) 
  97.   * @see net.sf.hibernate.UserType#isMutable() 
  98.   */  
  99.  public boolean isMutable() {  
  100.   // TODO Auto-generated method stub  
  101.   return false;  
  102.  }  
  103.  private String assemble(List emailList){  
  104.   StringBuffer strBuf = new StringBuffer();  
  105.   for(int i = 0;i<emailList.size()-1;i++){  
  106.    strBuf.append(emailList.get(i)).append(SPLITTER);  
  107.   }  
  108.   strBuf.append(emailList.get(emailList.size()-1));  
  109.   return strBuf.toString();  
  110.  }  
  111.  private List parse(String value){  
  112.   String[] strs = StringUtils.split(value,SPLITTER);  
  113.   List emailList = new ArrayList();  
  114.   for(int i = 0;i<strs.length;i++){  
  115.    emailList.add(strs[i]);  
  116.   }  
  117.   return emailList;  
  118.  }  
  119. }  


2.POJO:

java 代码
 
  1. import java.io.Serializable;  
  2. import java.util.List;  
  3.   
  4. /** 
  5.  * @author hy-he 
  6.  * @hibernate.class 
  7.  * table = "USER_TYPE_USER" 
  8.  */  
  9. public class UserTypeUser implements Serializable {  
  10.  private Long id;  
  11.  private String name;  
  12.  private Integer age;  
  13.  private List email = new ArrayList();  
  14.  /** 
  15.   * @hibernate.id 
  16.   * column = "USER_ID" 
  17.   * generator-class = "increment" 
  18.   * @return 
  19.   */  
  20.  public Long getId() {  
  21.   return id;  
  22.  }  
  23.  /** 
  24.   * @hibernate.property 
  25.   * column = "AGE" 
  26.   * @return 
  27.   */  
  28.  public Integer getAge() {  
  29.   return age;  
  30.  }  
  31.  /** 
  32.   * @hibernate.property 
  33.   * column = "EMAIL" 
  34.   * type = "hibernate.usertype.EMailList" 
  35.   * @return 
  36.   */  
  37.  public List getEmail() {  
  38.   return email;  
  39.  }  
  40.  /** 
  41.   * @hibernate.property 
  42.   * column = "NAME" 
  43.   * @return 
  44.   */  
  45.  public String getName() {  
  46.   return name;  
  47.  }  
  48.  public void setAge(Integer age) {  
  49.   this.age = age;  
  50.  }  
  51.  public void setEmail(List email) {  
  52.   this.email = email;  
  53.  }  
  54.  public void setId(Long id) {  
  55.   this.id = id;  
  56.  }  
  57.  public void setName(String name) {  
  58.   this.name = name;  
  59.  }  
  60.    
  61. }  

3.xml:

xml 代码
 
  1. <?xml version="1.0"?>  
  2.   
  3. <!DOCTYPE hibernate-mapping PUBLIC  
  4.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"  
  5.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  
  6.   
  7. <hibernate-mapping>  
  8.     <class  
  9.         name="hibernate.usertype.UserTypeUser"  
  10.         table="USER_TYPE_USER"  
  11.         dynamic-update="false"  
  12.         dynamic-insert="false"  
  13.     >  
  14.   
  15.         <id  
  16.             name="id"  
  17.             column="USER_ID"  
  18.             type="java.lang.Long"  
  19.         >  
  20.             <generator class="increment">  
  21.             </generator>  
  22.         </id>  
  23.   
  24.         <property  
  25.             name="age"  
  26.             type="java.lang.Integer"  
  27.             update="true"  
  28.             insert="true"  
  29.             access="property"  
  30.             column="AGE"  
  31.         />  
  32.   
  33.         <property  
  34.             name="email"  
  35.             type="hibernate.usertype.EMailList"  
  36.             update="true"  
  37.             insert="true"  
  38.             access="property"  
  39.             column="EMAIL"  
  40.         />  
  41.   
  42.         <property  
  43.             name="name"  
  44.             type="java.lang.String"  
  45.             update="true"  
  46.             insert="true"  
  47.             access="property"  
  48.             column="NAME"  
  49.         />  
  50.   
  51.         <!--  
  52.             To add non XDoclet property mappings, create a file named  
  53.                 hibernate-properties-UserTypeUser.xml  
  54.             containing the additional properties and place it in your merge dir.  
  55.         -->  
  56.   
  57.     </class>  
  58.   
  59. </hibernate-mapping>  

4.运用:

java 代码
 
  1. insert方法:  
  2.   
  3. public static void insertUser() throws HibernateException {  
  4.   UserTypeUser user = new UserTypeUser();  
  5.   user.setAge(new Integer(23));  
  6.   user.setName("Test UserType");  
  7.   user.getEmail().add("rever@hotmail.com");  
  8.   user.getEmail().add("rever1@hotmail.com");  
  9.   user.getEmail().add("rever2@hotmail.com");  
  10.   user.getEmail().add("rever3@hotmail.com");  
  11.   Session session = HibernateUtil.currentSession();  
  12.   Transaction tx = session.beginTransaction();  
  13.   session.save(user);  
  14.   
  15.   tx.commit();  
  16.   HibernateUtil.closeSession();  
  17.  }  
  18.   
  19. display方法:  
  20.   
  21.  public static void display() throws HibernateException {  
  22.   Session session = HibernateUtil.currentSession();  
  23.   List users = session.find("from UserTypeUser");  
  24.   HibernateUtil.closeSession();  
  25.   
  26.   for (ListIterator iterator = users.listIterator(); iterator.hasNext();) {  
  27.    UserTypeUser pu = (UserTypeUser) iterator.next();  
  28.    System.out.println(pu.getName());  
  29.    List emails = pu.getEmail();  
  30.    for(int i = 0;i<emails.size();i++){  
  31.     System.out.println(emails.get(i));  
  32.    }  
  33.   }  
  34.  }  

 
### 结合 Zod Immer 进行 Vue 的状态管理与数据验证 在现代前端开发中,Vue 是一种流行的框架,而结合第三方库如 **Zod** **Immer** 可以为应用提供更强大的功能支持。以下是关于如何集成这些工具来实现状态管理数据验证的具体方法。 #### 使用 Immer 简化状态变更操作 Immer 提供了一种简单的方式来处理不可变的状态更新逻辑。通过 `produce` 函数,开发者可以像修改可变对象一样编写代码,但实际上它会返回一个新的副本[^4]。 下面是一个简单的例子展示如何在 Vue 中使用 Immer: ```javascript import produce from 'immer'; export default { data() { return { state: { users: [{ id: 1, name: "Alice", age: 25 }], }, }; }, methods: { addUser() { this.state = produce(this.state, draft => { draft.users.push({ id: 2, name: "Bob", age: 30 }); }); } } }; ``` 此代码片段展示了如何利用 Immer 来安全地更改嵌套结构中的数组或对象属性[^4]。 #### 集成 Zod 实现数据验证 Zod 是一个 TypeScript-first 的模式定义验证库,能够帮助我们快速构建复杂的输入校验规则并自动生成类型声明文件[^5]。为了将其融入到 Vue 应用程序当中,可以通过以下方式完成配置: 1. 定义 Schema:首先需要基于业务需求设计对应的 schema; 2. 数据解析:当接收到外部传入的数据时,调用 `.parse()` 方法对其进行检验;如果不符合预期则抛出错误。 示例代码如下所示: ```typescript // schemas.ts import { z } from "zod"; const UserSchema = z.object({ id: z.number(), name: z.string().min(2), age: z.coerce.number().int().positive() }); type UserType = z.infer<typeof UserSchema>; export { UserSchema, UserType }; ``` 接着,在组件内部引入上述定义好的 Schema 并执行相应的检查流程: ```javascript <script setup lang="ts"> import { ref } from 'vue'; import { UserSchema } from './schemas'; const formData = ref<{id?: number|string|null;name:string|undefined|null;age:number|undefined|null}>({}); function handleSubmit(event:Event){ event.preventDefault(); try{ const validatedData = UserSchema.parse(formData.value); console.log('Valid Data:',validatedData); // Proceed further after successful validation. }catch(error){ alert((error as Error).message); } } </script> <template> <form @submit="handleSubmit"> <!-- Form fields here --> <button type="submit">Submit</button> </form> </template> ``` 以上就是将 Zod 融入 Vue 开发环境下的基本思路[^5]。 #### 组合运用两者提升整体体验 最后一步则是把前面提到的技术结合起来形成完整的解决方案——即每当触发某些特定事件(比如提交表单或者异步请求成功回调)之后立即同步更新本地存储的同时也重新评估当前显示的内容是否仍然满足既定条件限制。这样不仅可以保障最终呈现给用户的界面始终处于合法范围内而且还能有效减少不必要的渲染次数从而提高性能表现[^6]。 ```javascript methods:{ async fetchData(){ let rawResponse=await fetch('/api/users'); let jsonResponse= await rawResponse.json(); try{ const parsedUsers=UserArraySchema.parse(jsonResponse); this.setState(parsedUsers); } catch(err){ console.error("Invalid API response:",err.message); } }, setState(newState){ this.state=produce(this.state,(draft)=>{ draft.list=newState; }) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值