大叶女贞种子适合什么时候播种? 当前位置:首页>大叶女贞种子适合什么时候播种?>正文

大叶女贞种子适合什么时候播种?

发布时间:2019-04-26

原标题:尝试Spring Data Jpa--告别CRUD

“除此之外——”无支祁似是有意买了个关子,问石猴道:“除此之外还有哪些物种,你可知晓?”

安徽适合种植山桃吗?

齐天岭,初时以为只是乌合之众,此番看来,倒也心齐,只是不解的是,齐天岭并无信仰教义,是什么力量能把他们聚在一处呢?
从白光出现,到蒙面人的飞剑毁去、那些刺客的兵刃断折,再到白光消失,其实都只是一瞬间的事,有些人以为是自己眼花,还有些人甚至根本就没有看到白光,只以为那些刺客的兵刃之所以突然断去,是因为上天在保佑那个将军。

在一阵璀璨夺目的光芒闪耀之后,一双堪称巨大的能量大手,便出现在空中。

  前言    

  说到我们的web开发架构分层中,持久层是相对底层也是相对稳定的一层,奠定好根基后,我们才能专注于业务逻辑和视图开发。而自从ORM思想蔓延开来后,全自动ORM的Hibernate和半自动ORM的MyBatis几乎垄断了持久层(当然还有很多公司或者大牛自己封装的框架,不过相对占小部分),是发展过程中比较主流的两款持久层框架。前段时间也关注了很多有关领域驱动设计的内容,感觉对前面的传统架构分层冲击较大,尤其是业务逻辑层、持久层、实体ORM那块,引入了许多新概练,一时间也遇到了很多困惑,网上搜索资料发现领域驱动其实由来已久,目前也应用很多,但是想要完全掌握,并不是一件容易事。当然本文跟领域驱动并无直接关联,现在的问题是在面试题“Hibernate和MyBatis的区别”背景下,我们在持久层还有第三种典型选择吗,其实是有的,那就是本文的主角,Spring Data Jpa。  

    介绍

  说起Jpa,其实它并不是一个新概念,更不是说有了Spring Data Jpa才出现,它是Java Persistence API的简称,中文名Java持久层API,它是一种规范,例如Hibernate框架即实现了这种规范,Spring Data Jpa中便集成了Hibernate的模块。Spring Data,看名字很容易知道又是Spring系列的,除了Spring MVC在web层的成功,在持久层这块Spring也想拿下,大有想一统江湖的势头。另外去深入关注Spring Data内容,还会发现,不仅仅是RDBMS,还有Spring Data Redis、Spring Data Mongodb等等...本文内容主要是针对关系型数据库,本人在使用过程中,最看好的还是其在通用持久化方面的简易封装,基于层层的泛型继承,我们可以省略大量的简单增删改查方法的编码,另外提供的通过特定格式方法命名简化方法定义过程也很特别和好用。下面就基于Spring Data编写一个单独的简单持久层实例来展现其使用过程。    

  准备环境

  Eclipse + MySql + Maven

  基于传统几大框架的开发目前已经相对成熟很多了,但是就实际工作开发环境中,笔者最强烈的感受有一点,配置!配置文件实在太多了!特别是多工程组合集成的时候,漫天飞的XML和properties真是让人头大。所以建议现在学习过程中一定要尽量搞懂配置中每段配置语句的含义,哪个参数有什么作用,这样进入实际开发中才不会一时间无章可循。本文中配置尽量给出注释来阐述含义。

  在eclipse新建一个普通maven项目,quickstart类型,项目结构大致如下

  pom.xml依赖如下

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <!-- Spring 系列 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.9.1.RELEASE</version>
    </dependency>
 
    <!-- Hibernate系列 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
 
    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.37</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
  </dependencies>

  Spring Data Jpa 告别CRUD

  第一步、配置文件(当然实际开发中,我们不会将配置这样集中在一个文件中,同时数据源配置等关键参数往往会通过properties文件去设置然后引入)

<?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:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
       xsi:schemaLocation="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.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     
     <!-- Spring的bean扫描机制,会根据bean注解例如@Service等去实例化相应bean -->
     <context:component-scan base-package="com.sdj"></context:component-scan>
     
     <!-- 这句代码是告诉jpa我们的持久层接口都在哪些包下面 -->
    <jpa:repositories base-package="com.sdj.repository"/>
     
     <!-- 这里使用dbcp配置数据源,能实现连接池功能 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.0.100:3306/sdj"/>
        <property name="username" value="root"/>
        <property name="password" value="abc123"/>
    </bean>
     
     <!-- 实体管理器工厂配置,关联数据源,指定实体类所在包等等 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.sdj.domain"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="MYSQL"/>
                <property name="generateDdl" value="false"/>
                <property name="showSql" value="true"/>
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
            <prop key="hibernate.hbm2ddl.auto">none</prop> <!-- 如果想要自动生成数据表,这里的配置是关键 -->
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
            <!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
    </bean>
 
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    
    <!--启用事务注解来管理事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

  上面Spring配置文件中,实体管理器工厂配置是比较复杂的部分,下面具体到参数逐个介绍

  dataSource指定数据源

  packagesToScan,与前面的component-scan类似,这里也是一种扫描机制,不过前面是扫描bean,这里既然是实体管理器,不难理解是扫描实体类,即指定实体类所在的包,这里为com.sdj.domain

  jpaVendorAdapter,这里对应Jpa持久化实现厂商Hibernate,同时指定其专用特性,包括如下

    database,指定数据库,这里为MYSQL

    generateDdl,是否自动生成DDL,这里为false

    showSql,是否在控制台打印SQL语句,这点在调试时比较有用,能看到具体发送了哪些SQL

  jpaProperties,jpa属性设置,有如下

    hibernate.hbm2ddl.auto,根据需要可以设置为validate | update | create | create-drop,当然也可以设置为none,设置的时候要小心,使用不到会有丢失数据的危险,例如这里如果我们想要根据实体类自动生成数据表,可以设置为update,不用的话这里设置为none

    hibernate.dialect,指定数据库方言,这里为MySql数据库类型的

    hibernate.connection.charSet,指定链接字符编码,解决乱码问题

    hibernate.format_sql,前面指定控制台会打印SQL,这里是指定将其格式化打印,更加清晰美观一点

  第二步、实体类Person

package com.sdj.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="TB_PERSON")
public class Person {
    private Integer id;        //主键
    private String name;    //姓名
    private String gender;    //性别
    private String addr;    //地址
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getId() {
        return id;
    }
    @Column(name="NAME")
    public String getName() {
        return name;
    }
    public String getGender() {
        return gender;
    }
    public String getAddr() {
        return addr;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }

}

  如果仔细观察实体中系列注解,会发现其来源是hibernate-jpa,这也是前面提到的hibernate实现jpa规范内容。常用注解解释如下

  @Entity,指定该类为一个数据库映射实体类、

  @Table,指定与该实体类对应的数据表

  @Id和@Column,都是为实体类属性关联数据表字段,区别是Id是对应主键字段,另外还可以指定其对应字段名(不指定默认与属性名一致)、长度等等...如果不加这两个注解也是会以属性名默认关联到数据库,如果不想关联可以加上下面的@Transient

  @GeneratedValue,指定主键生成策略

  @Transient,表名该属性并非数据库表的字段映射

  @OneToMany、@ManyToOne、@ManyToMany等,均为关联映射注解系列,用于指定关联关系,一对多、多对一等等

  另外,@Id、@Column、@Transient等注解往往是加在属性的get方法上。

  第三步、持久层接口PersonRepository

package com.sdj.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import com.sdj.domain.Person;

public interface PersonRepository extends JpaRepository<Person, Integer> {
    List<Person> findByName(String name);
}

  我们发现这里持久层代码反而是最简洁的,我们的注意点如下:

  1.在这个针对Person实体的dao接口中我们并未定义常规通用的那些增删改查等方法,只定义了一个特定的根据姓名查找人的方法,同时继承了一个JpaRepository接口。

  2.不管继承接口也好,自定义方法也好,终究是接口,但是这里我们连实现类也没有。

  暂时先不走到业务逻辑Service层,一二三步走完,我们这个持久层程序已经可以运行了,下面我们编写测试方法来看看。

package com.test;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sdj.domain.Person;
import com.sdj.repository.PersonRepository;

public class TestSDJ {
    
    @Test
    public void testDB() {
        @SuppressWarnings("resource")
        ApplicationContext context = new ClassPathXmlApplicationContext("application-root.xml");
        PersonRepository bean = (PersonRepo

编辑:董华戏

发布:2019-04-26 05:39:04

当前文章:http://dehangcd.com/pm4bj.html

红叶石楠种子批发去哪里? 大叶女贞种子哪里多? 夏天可以种植大叶女贞吗? 法国冬青种子种后要浇水吗? 雪松育苗每亩播种量多少斤? 种植青枫苗一亩地用多少斤种子? 甘肃哪里有卖元宝枫种子的? 六米高的桧柏价格是多少?

56850 50410 34983 48003 24101 12814 35999 93122 69596 20872 96003 67450 12121 43786 26028 30863 30534 80902 96432 20724

责任编辑:卓杜安

随机推荐