Java利用数据库,反射,注解,三层架构练习.

需求,根据商品名字到数据库中查找是否存在此名字的商品,如果存在则查询到该商品的所有信息,将信息赋值给注解的值.

根据注解的值,创建实例对象,最终打印对象的信息.

自定义注解:

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;
        }

    }
}

控制台打印效果:

数据库图片:

猜你喜欢

转载自blog.csdn.net/xilin6664/article/details/89395715
今日推荐