需求,根据商品名字到数据库中查找是否存在此名字的商品,如果存在则查询到该商品的所有信息,将信息赋值给注解的值.
根据注解的值,创建实例对象,最终打印对象的信息.
自定义注解:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)//注解的生存周期为运行时 @Target(ElementType.FIELD)//注解的作用位置为字段上 public @interface MyAnno { //定义注解的属性 int id(); String pname(); double price(); }
定义要创建实例对象的类:
public class Product { private Integer id; private String pname; private Double price; @Override public String toString() { return "Product{" + "id=" + id + ", pname='" + pname + '\'' + ", price=" + price + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } }
表现层的类:
public class Test2 { @MyAnno(id =0,pname = "",price = 0.0) private String product;//商品带注解,初始值为空, public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String pname = "书";//给定要查询并创建对象的商品名 ServiceDemo serviceDemo = new ServiceDemo();//创建业务层对象 Product product = serviceDemo.getCase(pname);//调用方法获取实例对象 System.out.println(product);//打印对象内容 } }
业务逻辑层:
import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Map; import java.util.Set; /* service层 */ public class ServiceDemo { //给表现层返回创建的实例对象 public Product getCase(String pname) throws NoSuchFieldException, IllegalAccessException { DaoDemo daoDemo = new DaoDemo();//创建持久层对象 int i = daoDemo.nameCheced(pname);//调用方法查询数据库中是否有表现层传来的商品名的数据存在 if (i == 0) { System.out.println("该商品不存在"); return null; } else { Map values = daoDemo.getValues(pname);//调用方法获取该商品名的所有数据 Product product = getProduct(pname, values);//调用本类的方法获取实例对象 return product; } } //将数据库的数据赋值给注解的属性值,再根据注解的属性值创建对象.参数为表现层传来的商品名,持久层查询到的商品数据的集合, //返回值为创建的实例对象 public Product getProduct(String pname, Map<String,Object> map) throws NoSuchFieldException, IllegalAccessException { //获取持久层返回的对象的属性值的集合 Map values = new DaoDemo().getValues(pname); //根据属性值给表现层的字段注解的属性赋值,并根据注解的值创建对象,将对象返回 Test2 t = new Test2();//获取表现层实例 Field product = Test2.class.getDeclaredField("product");//获取字段 MyAnno anno = product.getAnnotation(MyAnno.class);//获取注解的对象 InvocationHandler h = Proxy.getInvocationHandler(anno);//获取代理实例所持有的调用处理程序的实例对象 Field memberValues = h.getClass().getDeclaredField("memberValues");//获取保存注解值的字段 memberValues.setAccessible(true);//设置此字段为可使用的 Map valueMap =(Map) memberValues.get(h);//获取保存注解属性值的集合 //给注解的属性赋值 Set<String> keys = map.keySet(); for (String key : keys) { valueMap.put(key, map.get(key)); } //根据属性的值给创建的对象赋值 Product p1 = new Product(); p1.setId(anno.id()); p1.setPname(anno.pname()); p1.setPrice(anno.price()); return p1; } }
持久层:
import cn.itcast.utils.JdbcUtil; import org.springframework.jdbc.core.JdbcTemplate; import java.util.Map; /* dao层 */ public class DaoDemo { //到数据库中查询,商品名字,并将查询的结果返回 public int nameCheced(String pname) { int i =0; try { JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtil.getDataSource()); String sql = "select count(pname) from product where pname =?"; i = jdbcTemplate.queryForObject(sql, int.class, pname); return i; } catch (Exception e) { e.printStackTrace(); return 0; } } //根据商品名字查询到该商品的所有数据并封装到Map集合中,返回该集合 public Map getValues(String pname) { try { JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtil.getDataSource()); String sql = "select * from product where pname =?"; Map<String, Object> valueMap = jdbcTemplate.queryForMap(sql, pname); return valueMap; } catch (Exception e) { e.printStackTrace(); return null; } } }
控制台打印效果:
数据库图片:
扫描二维码关注公众号,回复:
5945009 查看本文章