成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

談?wù)凷pring-Data的那些事兒

charles_paul / 1425人閱讀

摘要:什么是呢全稱,是提出的一個(gè)對(duì)象持久化規(guī)范,各應(yīng)用服務(wù)器自主選擇具體實(shí)現(xiàn)。僅僅只是一個(gè)規(guī)范,而不是產(chǎn)品使用本身是不能做到持久化的。只要提供了持久化類與表的映射關(guān)系,框架在運(yùn)行時(shí)就能參照映射文件的信息,把對(duì)象持久化到數(shù)據(jù)庫(kù)中。

我們?cè)谶M(jìn)行事務(wù)處理往往需要和數(shù)據(jù)庫(kù)進(jìn)行交互,這其中有關(guān)系型數(shù)據(jù)庫(kù)(MySql,Sql Server,Oracle)或者是非關(guān)系型數(shù)據(jù)庫(kù)(Redis,Hadhoop),常見(jiàn)的操縱數(shù)據(jù)庫(kù)的方式就有JDBC和Spring JdbcTemplate,而這兩種處理方式其實(shí)很繁瑣而且代碼復(fù)用率也比較低。另外使用這這種方式進(jìn)行實(shí)際開(kāi)發(fā)時(shí)效率也比較低,今天我們使用Spring Data進(jìn)行開(kāi)發(fā)。在進(jìn)行開(kāi)發(fā)之前我們首先介紹一下什么是Spring-Data,以及如何使用JDBC和Spring JDBCTemplate方式進(jìn)行常用的CRUD功能的開(kāi)發(fā)。

SpringData相關(guān)概念:
SpringData是Spring基于ORM框架、JPA規(guī)范封裝的一套JPA應(yīng)用框架,它提供了包括增刪改查在內(nèi)的常用功能,且易于擴(kuò)展,可使開(kāi)發(fā)者用極簡(jiǎn)的代碼實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作。
什么是JPA呢?
JPA全稱Java Persistence API,是sun提出的一個(gè)對(duì)象持久化規(guī)范,各JavaEE應(yīng)用服務(wù)器自主選擇具體實(shí)現(xiàn)。JPA僅僅只是一個(gè)規(guī)范,而不是產(chǎn)品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定義好的持久化操作的接口,在系統(tǒng)中使用時(shí),需要真正的實(shí)現(xiàn)者。

JPA的設(shè)計(jì)者是Hibernate框架的作者,因此Hibernate EntityManager作為Jboss服務(wù)器中JPA的默認(rèn)實(shí)現(xiàn);Oracle的Weblogic使用EclipseLink(以前叫TopLink)作為默認(rèn)的JPA實(shí)現(xiàn);IBM的Websphere和Sun的Glassfish默認(rèn)使用OpenJPA(Apache的一個(gè)開(kāi)源項(xiàng)目)作為其默認(rèn)的JPA實(shí)現(xiàn)。
JPA的底層實(shí)現(xiàn)是一些流行的開(kāi)源ORM(對(duì)象關(guān)系映射)框架,因此JPA其實(shí)也就是java實(shí)體對(duì)象和關(guān)系型數(shù)據(jù)庫(kù)建立起映射關(guān)系,通過(guò)面向?qū)ο缶幊痰乃枷氩僮麝P(guān)系型數(shù)據(jù)庫(kù)的規(guī)范。

什么是ORM呢?
ORM,即Object-Relational Mapping(對(duì)象關(guān)系映射),它的作用是在關(guān)系型數(shù)據(jù)庫(kù)和業(yè)務(wù)實(shí)體對(duì)象之間作一個(gè)映射,這樣,我們?cè)诰唧w的操作業(yè)務(wù)對(duì)象的時(shí)候,就不需要再去和復(fù)雜的SQL語(yǔ)句打交道,只需簡(jiǎn)單的操作對(duì)象的屬性和方法。只要提供了持久化類與表的映射關(guān)系,ORM框架在運(yùn)行時(shí)就能參照映射文件的信息,把對(duì)象持久化到數(shù)據(jù)庫(kù)中。當(dāng)前ORM框架主要有三種:Hibernate,iBATIS,EclipseLink。

SpringData提供的編程接口:

【1】Repository:最頂層接口,是一個(gè)空接口,目的是為了統(tǒng)一所有的Repository的類型,且能讓組件掃描的時(shí)候自動(dòng)識(shí)別;
【2】CrudRepository:提供基礎(chǔ)的增刪改查操作;
【3】PagingAndSortingRepository:提供分頁(yè)和排序的操作;
【4】JpaRepository:增加了批量操作的功能;
【5】JpaSpecificationExecutor :組合查詢條件,提供原生SQL查詢。

使用JDBC進(jìn)行開(kāi)發(fā):
首先說(shuō)明例子所設(shè)計(jì)的數(shù)據(jù)庫(kù),如下圖:
![圖片描述][1]   
1.JDBC工具類
public class JDBCUtil {    
    /*
     * 獲取connection
     * @return 所獲得的JDBC的Connection
     */
    public static Connection getConnection() throws ClassNotFoundException, SQLException, IOException
    {
        /*String url = "jdbc:mysql://localhost:3306/spring_data";
        String user = "root";
        String password = "123456";
        String driverClass = "com.mysql.jdbc.Driver";*/
        
        /*
         * 通過(guò)讀取配置文件獲取數(shù)據(jù)庫(kù)連接所需參數(shù)
         */
        InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("database.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        
        String url = properties.getProperty("jdbc.url");
        String user = properties.getProperty("jdbc.user");
        String password = properties.getProperty("jdbc.password");
        String driverClass = properties.getProperty("jdbc.driverClass");
        Class.forName(driverClass);
        Connection connection =  DriverManager.getConnection(url, user, password);    
        return connection;    
    }    
    /*
     * 釋放資源
     */
    public static void release(ResultSet resultSet,Statement statement,Connection connection)
    {
        /*
         * 釋放resultset
         */
        if(resultSet!=null)
        {
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(resultSet!=null)
        {
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        /*
         * 釋放statement
         */
        if(statement!=null)
        {
            try {
                statement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        /*
         * 釋放connection
         */
        if(connection!=null)
        {
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

附: JDBC數(shù)據(jù)源配置文件:

jdbc.url = jdbc:mysql://localhost:3306/spring_data
jdbc.user = root
jdbc.password = 123456
jdbc.driverClass =com.mysql.jdbc.Driver
2.定義項(xiàng)目中設(shè)計(jì)的實(shí)體類
   /**
 * @author 熊濤
 *Student Entity Class
 */
public class Student {

    private int id;
    private String name;
    private int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
3.Dao層接口的實(shí)現(xiàn)
public interface StudentDAO {
    /*
     * 查詢所有學(xué)生
     * @return所有學(xué)生
     */
    public List query();
    
    /*
     * 添加學(xué)生接口
     */
    public void save(Student student);
}
4.Dao層接口的實(shí)現(xiàn)類
  /**
 * @author 熊濤
 *StudentDAO接口的實(shí)現(xiàn)類,通過(guò)最原始的JDBC的方式操作
 */
public class StudetnDAOImpl implements StudentDAO {    
    public List query() {
        
        List students = new ArrayList();
        
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "select id,name,age from student";
        try {
            connection = JDBCUtil.getConnection();
            preparedStatement=connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            
            Student student = null;
            while(resultSet.next()){
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                
                student = new Student();
                student.setId(id);
                student.setName(name);
                student.setAge(age);
                
                students.add(student);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JDBCUtil.release(resultSet, preparedStatement, connection);
        }
        
        return students;
    }

    public void save(Student student) {
        
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "insert into student(name,age) values(?,?)";
        try {
            connection = JDBCUtil.getConnection();
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setString(1, student.getName());
            preparedStatement.setInt(2, student.getAge());
            preparedStatement.executeUpdate();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtil.release(resultSet, preparedStatement, connection);
    }
    }
}


2.使用Spring JDBCTemplate進(jìn)行開(kāi)發(fā)

1.創(chuàng)建使用Spring-JDBCTemplate所需的配置文件beans.xml目的是將datasource和JDBCTemplate注入進(jìn)來(lái)




    
        
        
        
        
    

    
        
    
    
    
            
    

2.在Dao層實(shí)現(xiàn)類中實(shí)現(xiàn)JDBCTemplate

/**
 * @author 熊濤
 *StudentDAo接口的實(shí)現(xiàn)類,通過(guò)Spring-JDBC的方式操作
 */
public class StudentDAOSpringJdbcImpl implements StudentDAO {

    //通過(guò)set方法注入JdbcTemplate
    private JdbcTemplate jdbcTemplate;
    
    public List query() {
        
        final List students = new ArrayList();
        String sql = "select id,name,age from student";
        jdbcTemplate.query(sql,new RowCallbackHandler(){

            public void processRow(ResultSet rs) throws SQLException {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                
                Student student = new Student();
                student.setId(id);
                student.setName(name);
                student.setAge(age);                    
                students.add(student);                    
            }               
        });
        return students;
    }

    public void save(Student student) {
        String sql = "insert into student(name,age) values(?,?)";
        jdbcTemplate.update(sql,new Object[]{student.getName(),student.getAge()});
    }
    
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

}  

3.使用Spring-Data方式進(jìn)行開(kāi)發(fā)

【1】創(chuàng)建使用Spring-Data所需的Spring配置文件      
         


    
    
        
        
        
        
    

    
    
        
        
            
        
        

        
            
                org.hibernate.cfg.ImprovedNamingStrategy
                org.hibernate.dialect.MySQL5InnoDBDialect
                true
                true
                update
            
        
            
    
    
        
    
    
    
    
            
           

      

【2】創(chuàng)建項(xiàng)目中所涉及到的實(shí)體類

    /**
 * @author 熊濤
 *雇員實(shí)體類
 *先開(kāi)發(fā)實(shí)體類,然后生成對(duì)應(yīng)的數(shù)據(jù)表
 */
@Entity
@Table(name="test_employee")
public class Employee {

    private Integer id;
    private String name;
    private Integer age;
    
    @GeneratedValue
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    @Column(length=20)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
    }    
}

【3】創(chuàng)建項(xiàng)目中設(shè)計(jì)的接口類


 public interface EmployeeRepository extends Repository{

    public Employee findByName(String name);
    public List findByNameStartingWithAndAgeLessThan(String name,Integer age);
    public List findByNameEndingWithAndAgeLessThan(String name,Integer age);
    public List findByNameInOrAgeLessThan(List names,Integer age);
    public List findByNameInAndAgeLessThan(List names,Integer age);
        
    @Query("select o from Employee o where id=(select max(id) from Employee t1)")
    public Employee getEmployeeByMaxId();    
    @Query("select o from Employee o where o.name=?1 and o.age=?2")
    public List queryParams1(String name,Integer age);
    @Query("select o from Employee o where o.name=:name and o.age=:age")
    public List queryParams2(@Param("name")String name,@Param("age")Integer age);
    @Query("select o from Employee o where o.name like %?1%")
    public List queryLike1(String name);
    @Query("select o from Employee o where o.name like %:name%")
    public List queryLike2(@Param("name")String name);    
    @Query(nativeQuery = true,value = "select count(1) from employee")
    public long getCount();
    
    @Modifying
    @Query("update Employee o set o.age = :age where o.id = :id")
    public void update(@Param("id")Integer id,@Param("age")Integer age);
}

最后附上例子源碼,源碼中還有對(duì)于以上代碼功能的測(cè)試,測(cè)試代碼均位于test包下。
項(xiàng)目源碼:
鏈接:https://pan.baidu.com/s/1pLcGCUR 密碼:welh

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/61908.html

相關(guān)文章

  • 談?wù)?/em>Spring-Data那些事兒

    摘要:什么是呢全稱,是提出的一個(gè)對(duì)象持久化規(guī)范,各應(yīng)用服務(wù)器自主選擇具體實(shí)現(xiàn)。僅僅只是一個(gè)規(guī)范,而不是產(chǎn)品使用本身是不能做到持久化的。只要提供了持久化類與表的映射關(guān)系,框架在運(yùn)行時(shí)就能參照映射文件的信息,把對(duì)象持久化到數(shù)據(jù)庫(kù)中。 我們?cè)谶M(jìn)行事務(wù)處理往往需要和數(shù)據(jù)庫(kù)進(jìn)行交互,這其中有關(guān)系型數(shù)據(jù)庫(kù)(MySql,Sql Server,Oracle)或者是非關(guān)系型數(shù)據(jù)庫(kù)(Redis,Hadhoop)...

    chinafgj 評(píng)論0 收藏0
  • 你該知道ES6那些事兒

    摘要:最近重構(gòu)了一個(gè)項(xiàng)目,引入了部分用法,最大的感受是讓這門語(yǔ)言變得更加嚴(yán)謹(jǐn),更加方便。通過(guò)該方法獲得位置后還得比較一次才能判斷是否存在。再來(lái)看看的寫(xiě)法使用數(shù)組來(lái)初始化一個(gè),構(gòu)造器能確保不重復(fù)地使用這些值。下面提供鏈接,供有興趣的朋友參考。 最近重構(gòu)了一個(gè)SPA項(xiàng)目,引入了部分ES6用法,最大的感受是ES6讓javascript這門語(yǔ)言變得更加嚴(yán)謹(jǐn),更加方便。本篇將結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),對(duì)最常用的部...

    CoffeX 評(píng)論0 收藏0
  • 跨域那些事兒

    摘要:什么是跨域我們先看下以下場(chǎng)景開(kāi)啟兩個(gè)本地服務(wù)器,頁(yè)面為,其中嵌套了,頁(yè)面想使用頁(yè)面的數(shù)據(jù),例如調(diào)用它的方法,會(huì)報(bào)以下錯(cuò)誤如圖所示,,,譯為協(xié)議主機(jī)和端口號(hào)必須符合,否則,就是跨域??缬虻膸追N常見(jiàn)方案同源策略的限制范圍有以下幾種和無(wú)法讀取。 什么是跨域 我們先看下以下場(chǎng)景:開(kāi)啟兩個(gè)本地服務(wù)器,頁(yè)面A為localhost:9800,其中嵌套了iframeB localhost:9000,頁(yè)...

    nevermind 評(píng)論0 收藏0
  • spring-data jpa 查詢部分屬性

    摘要:一準(zhǔn)備有表結(jié)構(gòu)如何生成相應(yīng)的對(duì)象為省略二問(wèn)題現(xiàn)在有一查詢對(duì)象原先我是先查詢出所有的對(duì)象,然后再循環(huán)賦值。經(jīng)過(guò)一番嘗試由于對(duì)象我不想改變,只能先差對(duì)象再循環(huán)賦值了。 一 準(zhǔn)備 1.有表結(jié)構(gòu)如何 CREATE TABLE `bbs_topic` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL DE...

    whataa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<