zoukankan      html  css  js  c++  java
  • jpa实例

    ORM框架
    新的JPA ORM规范:
    1)JPA为POJO提供持久化标准规范。
    2)JPA的使用:Hibernate与TopLink以及OpenJpa都提供了JPA的实现。
    3)JPA主要技术:
      A.ORM映射元数据:JPA通过注解或XML描述映射关系,并将运行中的实体对象持久化到数据库中。
      B.JPA持久化API:使用面向对象的思想,操作实体对象,进行增删改查的操作。至于怎么操作,由框架思考这件事。
      C.查询语言:使用面向对象的思想避免了同程序的SQL语句产生交集。
    LocalContainerEntityManagerFactoryBean 提供了对JPA EntityManagerFactory 的全面控制,
    非常适合那种需要细粒度定制的环境。
    LocalContainerEntityManagerFactoryBean将基于persistence.xml文件创建PersistenceUnitInfo类,
    并提供dataSourceLookup策略和loadTimeWeaver。因此它可以在JNDI之外的用户定义的数据源之上工作,并控制织入流程。

    public static void main(String[] args) throws Exception {    
            @SuppressWarnings("resource")
            ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
            Apply apply = (Apply) context.getBean("apply");
            System.out.println("---------------");
            List<String> list = apply.loadKeys();
    }
    package com.batman.hzdx.shard.model;
    
    import java.io.Serializable;
    import java.util.HashMap;
    import java.util.Map;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Inheritance;
    import javax.persistence.InheritanceType;
    import javax.persistence.Table;
    
    import com.batman.hzdx.def.DataTypeUtils;
    import com.batman.hzdx.def.HasMapping;
    import com.batman.hzdx.def.PrimaryKey;
    
    @Entity(name="user")
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    public class User implements HasMapping, PrimaryKey<String>, Serializable{
        private static final long serialVersionUID = 1L;
        
        @Id
        @Column(name="username", nullable=false, length=20)
        private String username;
    
        @Column(name="password", nullable=true, length=20)
        private String password;
        
        
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public static final String P_Username = "username";
    
        public static final String P_Password = "password";
    
        public String pk() {
            return username;
        }
    
        public Map<String, Serializable> convertToMap() {
            HashMap<String, Serializable> map = new HashMap<String, Serializable>();
            map.put("username", username);
            map.put("password", password);
            return map;
        }
    
        public void updateFromMap(Map<String, Serializable> map) {
            if (map.containsKey("username")) this.setUsername(DataTypeUtils.getStringValue(map.get("username")));
            if (map.containsKey("password")) this.setPassword(DataTypeUtils.getStringValue(map.get("password")));
            
        }
        
        public void fillDefaultValues() {
            if (username == null) username = "";
            if (password == null) password = "";
        }
    }
    package com.batman.hzdx.shard.model;
    
    import static com.mysema.query.types.PathMetadataFactory.*;
    
    import com.mysema.query.types.path.*;
    
    import com.mysema.query.types.PathMetadata;
    import javax.annotation.Generated;
    import com.mysema.query.types.Path;
    
    
    /**
     * QUser is a Querydsl query type for User
     */
    @Generated("com.mysema.query.codegen.EntitySerializer")
    public class QUser extends EntityPathBase<User> {
    
        private static final long serialVersionUID = -620768573;
    
        public static final QUser user = new QUser("user");
    
        public final StringPath password = createString("password");
    
        public final StringPath username = createString("username");
    
        public QUser(String variable) {
            super(User.class, forVariable(variable));
        }
    
        @SuppressWarnings("all")
        public QUser(Path<? extends User> path) {
            super((Class)path.getType(), path.getMetadata());
        }
    
        public QUser(PathMetadata<?> metadata) {
            super(User.class, metadata);
        }
    }
    package com.batman.hzdx.batch;
    
    import java.util.Date;
    import java.util.List;
    
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    
    import com.batman.hzdx.shard.model.QPersion;
    import com.batman.hzdx.shard.model.QTmAppMain;
    import com.batman.hzdx.shard.model.QUser;
    import com.mysema.query.Tuple;
    import com.mysema.query.jpa.impl.JPAQuery;
    
    public class Apply {
        @PersistenceContext
        private EntityManager em;
        
        public List loadKeys() {
            String name = "xiaosi";        
            Query qu2 = em.createNativeQuery("select password from user where username='111'");
            List list3 = qu2.getResultList();
            System.out.println(list3.toString());
            
            
          /*  QUser qp = new QUser("user");
            JPAQuery query = new JPAQuery(em);
            List<String> list2 = query.from(qp).where(qp.username.eq(name)).list(qp.password);
            System.out.println(list2.toString());*/
            
            QPersion qp5 = new QPersion("persion");
            JPAQuery query = new JPAQuery(em);
            List<String> list5 = query.from(qp5).where(qp5.name.eq(name)).list(qp5.age);
            System.out.println(list5.toString());
            
            return list5;        
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
    
        <!-- 这里定义JPA相关配置。总体上来说,这里使用以Hibernate为Provider的JPA2.0方案,使用Spring来进行集成,不依赖于容器的JPA实现。 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="#{env['jdbcDriver']}" />
            <property name="url" value="#{env['jdbcUrl']}" />
            <property name="username" value="#{env['jdbcUsername']}" />
            <property name="password" value="#{env['jdbcPassword']}" />
            <!-- 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制 -->
            <property name="maxActive" value="#{env['jdbcMaxActive'] ?: 20}" />
            <!-- 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制 -->
            <property name="maxIdle" value="#{env['jdbcMaxIdle'] ?: 10 }" />
            <!-- 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建 -->
            <property name="minIdle" value="#{env['jdbcMinIdle'] ?: 2 }" />
            <!-- 初始化连接:连接池启动时创建的初始化连接数量 -->
            <property name="initialSize" value="#{env['jdbcInitialSize'] ?: 20}" />    
            <!-- 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待 -->    
            <property name="maxWait" value="#{env['jdbcMaxWait'] ?: 10000 }" />
            <!-- 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 -->
            <property name="testOnBorrow" value="#{env['jdbcTestOnBorrow']?: true}" />
            <!-- 进行returnObject对返回的connection进行validateObject校验 -->
            <property name="testOnReturn" value="#{env['jdbcTestOnReturn']?: false}" />
            <property name="validationQuery" value="#{env['jdbcTestSql']}" />
            <property name="validationQueryTimeout" value="#{env['jdbcValidationQueryTimeout'] ?: 1}" />
            <!-- 空闲时是否进行验证,检查对象是否有效,默认为false -->
            <property name="testWhileIdle" value="#{env['jdbcTestWhileIdle']?: false}" />
            <!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.如果设置为非正数,则不运行空闲连接回收器线程 -->
            <property name="timeBetweenEvictionRunsMillis" value="#{env['jdbcTimeBetweenEvictionRunsMillis']?: 600000}" />
            <!-- 连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="#{env['jdbcMinEvictableIdleTimeMillis'] ?: 1800000}" />
            <!-- 代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接 -->
            <property name="numTestsPerEvictionRun" value="#{env['jdbcMaxActive'] ?: 20}" />
            <property name="removeAbandoned" value="#{env['jdbcRemoveAbandoned']?: true}" />
            <property name="removeAbandonedTimeout" value="#{env['jdbcRemoveAbandonedTimeout']?: 300}" />
            <property name="logAbandoned" value="#{env['jbdcLogAbandoned']?: true}" />
        </bean>
        <!-- 实体管理类 -->
        <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <description>
                定义EntityManagerFactory,用于Spring控制事务。
                具体的Hibernate配置在persistence.xml中控制,包括JPA Provider和Hibernate的各种参数(不含组件扫描)。
            </description>
            <property name="dataSource" ref="dataSource" />
             <property name="persistenceUnitName" value="default" />
            <property name="packagesToScan">
               <list>
                  <value>com.batman.hzdx.shard.model</value>
               </list>
            </property>
            <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
            <property name="jpaDialect">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
            </property>
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="#{env['jpaDatabaseType']?:'DEFAULT'}" />
                    <property name="showSql" value="#{env['jpaShowSql']?:false}" />
                </bean>
            </property>
         <!--    <property name="jpaProperties">
              <props>
                <prop key="hibernate.jdbc.batch_size">1</prop>
              </props>
             </property>  -->
        </bean>    
        <!-- 事务设置 -->
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="emf"/>
        </bean> 
    
        <!-- 事务使用AspectJ进行编译时Weave -->
          <tx:annotation-driven mode="aspectj"/>
    
        <!-- Spring Data -->
        <jpa:repositories base-package="com.batman.hzdx.shared.model"/>
    </beans>
  • 相关阅读:
    【转】centos7升级git版本
    小程序购物车抛物线动画(通用)
    IDEA高级操作
    JAVA获取各种路径
    这些SpringBoot天生自带Buff工具类你都用过哪些?
    搜狗输入法简繁问题
    Java8 Stream流递归,几行代码搞定遍历树形结构
    SpringBoot 启动时实现自动执行代码的几种方式讲解
    公司用的 MySQL 团队开发规范,非常详细,建议收藏!
    Springboot整合websocket全面解析
  • 原文地址:https://www.cnblogs.com/mutong1228/p/9078771.html
Copyright © 2011-2022 走看看