zoukankan      html  css  js  c++  java
  • java EE技术体系——CLF平台API开发注意事项(1)——后端开发

    前言:这是一篇帮助小伙伴在本次项目中快速进入到java EE开发的一些说明,为了让同组小伙伴们开发的时候,有个清晰点的思路。昨天给大家演示分享了基本概况,但没有留下文字总结说明,预防后期有人再次问我,特写此篇博客!

    本篇博客的结构主要分为两个部分:第一个是关键执行点,也就是在项目中,每个人都要去做去注意的;第二个是其他注意点,这个部分是一些大家提到的问题

    一、关键执行点

    重中之重:严禁引入任何Spring体系的技术(关于昨天提到的 定时任务,消息,java EE有相应的技术体系) 

    1.1,事务

    与Spring不同,在Spring中咱们需要配置:

        <!-- 对数据源进行事务管理 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
        <aop:aspectj-autoproxy/>

    并在实现类上使用@Transactional注解(注意这里的proxy-target-class=“true”,标志使用CGlib代理)


    小伙伴们:着重关注第二点内容,涉及到咱们的具体使用!     


    在咱们的项目中,第一点:了解事务的基础内容:https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html    第二点:了解JTA(java transaction api)的基本用法:http://docs.oracle.com/javaee/7/api/javax/transaction/package-summary.html  (要求,在本项目中,准确指定Exception类型(Exception summary)及其对应的事务回滚操作(Annotation types summary))  第三点:维基百科中对于JTA的说明:https://en.wikipedia.org/wiki/Java_Transaction_API#.40Transactional_annotation


    1.2,JPQL使用

    备注:底层的实现框架,目前选择的是EclipseLink。

    在entitymanager中,提供了很多的接口,有一些是直接传入实体类型就可用。而有一些,则是提供接口进行扩展。结合到咱们的业务,我们会需要创建自己的SQL语句,去查询相关的数据,那么在此,我说明一下相关用法:

    第一,执行咱们自建的SQL有两种方法:a,使用JPQL进行查询;b,使用原生SQL

    先说简单的原生SQL:可供选择的接口有:

        public Query createNativeQuery(String sqlString);
    
        public Query createNativeQuery(String sqlString, Class resultClass);
    
        public Query createNativeQuery(String sqlString, String resultSetMapping);
    
        public StoredProcedureQuery createNamedStoredProcedureQuery(String name);
    
        public StoredProcedureQuery createStoredProcedureQuery(String procedureName);
    
        public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class[] resultClasses);
    
        public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String[] resultSetMappings);

    而使用JPQ语句,可供选择的接口有:

        public Query createQuery(String qlString);
    
        public <T extends Object> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);
    
        public Query createQuery(CriteriaUpdate updateQuery);
    
        public Query createQuery(CriteriaDelete deleteQuery);
    
        public <T extends Object> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);
    
        public Query createNamedQuery(String name);
    
        public <T extends Object> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass);

    当咱们的业务需要执行自定义SQL查询到 时候,这两种方式,在项目的Repository层,自行选择一种进行实现。


    接下来,介绍一下相对不熟悉的JPQ,着重说明一下NameQuery。备注:为了便于管理统计,只自己使用的接口,一律写在Repository层,而被多次(自己及他人)使用的,一律写在Entity层,并加注所属实体,例如:TOpinion.findByStatus

    第一点:NameQuery的所在地方,有两个,第一种用法:

        /**
         * JPA第一种NameQuery语句写法
         */
        public void exampleForNameQuery() {
            Query query = this.em.createNamedQuery("select * from TOpinion o where o.id=?");
            List<TOpinion> opinion = query.getResultList();
            System.out.println(opinion.get(0).getContent());
        }
    也就是说,直接在Repository层编辑,第二种,在实体上统一编辑,然后调用,这一点类似于Mybatis的调用层次:

    @Entity
    @Table(name = "t_opinion")
    @NamedQueries({
        @NamedQuery(name = "TOpinion.findById", query = "SELECT o FROM TOpinion o WHERE o.id=?1")
        ,
        @NamedQuery(name = "TOpinion.findByStatus", query = "SELECT o FROM TOpinion o WHERE o.status=:status")
    })
    public class TOpinion implements Serializable {
    
        @Column(name = "id", table = "t_opinion", nullable = false, length = 22)
        @Id
        private String id;
    调用:

        /**
         * JPA第二种NameQuery语句写法,赋值方式参考Hibernate,调用结构参考Mybatis
         */
        public void exampleForNameQuery1() {
            Query query = em.createNamedQuery("TOpinion.findById");
            query.setParameter(1, "2");
            List<TOpinion> opinion = query.getResultList();
        }


    两种赋值方式:query.setParameter(1, "2"); 和 query.setParameter("status", status.get(0));


    扩展学习链接:http://www.objectdb.com/java/jpa/query/named

    1.3,关于注入

    在Spring中,咱们使用@Autowired进行bean注入,在此项目中,咱们使用的是Jboss实现的CDI规范,应该使用@Inject注入!


    二、其他注意点

    1,数据库连接池

    在项目中,没有明确配置数据库连接池,但是,这不代表,我们没有连接池,只不过,我们的数据库连接池,配置在Jboss里面。有兴趣的可以看看配置文件中对于数据库的配置信息

    2,事务的执行策略和传播行为

    这一点,也在Jboss里面呢,项目中并没有配置

    3,怎样快速构建的后端工程

    这一点我专门写篇博客或者文档,说明一下操作过程,以及前后两种开发模式的效率对比说明

    4,swagger在这之中所做的工作

    同第三点,我会再写篇博客,关于swagger编辑器,swagger API发布,swagger API代码生成,借助swagger构建可访问的mock service,API集成其他工具快速构建开发框架


    三、总结

    平台的开发模式,开发技术,都跟之前的Spring有所微小差异,但对于大家来说,一切都不是问题,从目前的现况来看,接收速度和效率都很不错。很开心啊

    后续关于安全控制,测试框架Arquillian的使用,再出文档!



  • 相关阅读:
    OSCP Learning Notes Exploit(7)
    正则表达式中?=和?:和?!的理解
    提取日志中的ip
    ip地址的正则表达式
    linux内核tmpfs/shmem浅析
    记一个linux内核内存提权问题
    linux内存屏障浅析
    linux IPv4报文处理浅析
    linux会话浅析
    linux memory lock浅析
  • 原文地址:https://www.cnblogs.com/hhx626/p/7534567.html
Copyright © 2011-2022 走看看