Java Spring Boot VS .NetCore (四)數據庫操作 Spring Data JPA vs EFCore


 

Java Spring Boot VS .NetCore (一)來一個簡單的 Hello World

Java Spring Boot VS .NetCore (二)實現一個過濾器Filter

Java Spring Boot VS .NetCore (三)Ioc容器處理

Java Spring Boot VS .NetCore (四)數據庫操作 Spring Data JPA vs EFCore

Java Spring Boot VS .NetCore (五)MyBatis vs EFCore

Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml

Java Spring Boot VS .NetCore (七) 配置文件

Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute

Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor

Java Spring Boot VS .NetCore (十一)自定義標簽 Java Tag Freemarker VS .NetCore Tag TagHelper

Java操作數據庫的方式用很多可以用JDBC自己去處理 也可以用通過Spring Data JPA 中封裝的Hibernate來完成

添加相關的配置

Spring.datasource.url=jdbc:mysql://192.168.0.233:3306/test1?useSSL=false
Spring.datasource.username=uoso
Spring.datasource.password=uosotech_123
Spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Spring.jpa.properties.hibernate.hbm2ddl.auto=update
Spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
Spring.jpa.show-sql= true

接下來通過.NetCore 中的EFCore 來對比下 兩種語言操作數據庫的方式

Java JDBC vs .NetCore ADO.NET

這些都是操作數據庫底層的東西下面我們來看下有什么區別

先看下Java JDBC代碼  

下面說下步驟

首先   DriverManager.getConnection 來創建連接,然后通過 連接創建語句Statement, 最后執行 語句塊中的sql 代碼  

主要方法大概就是 executeQuery 、executeUpdate 

public class JDBCHelper  {
    public static Connection getConnection() throws  Exception
    {
      return   DriverManager.getConnection("jdbc:mysql://192.168.0.233:3306/test1?useSSL=false","uoso",
              "uosotech_123");

    }
    public static void ExcuteQuery(String sql) throws  Exception
    {
        Connection connection=getConnection();
        try {
            Statement statement = connection.createStatement();
            ResultSet data = statement.executeQuery(sql);
          int count=   data.getMetaData().getColumnCount();
            System.out.println("============================");
            while (data.next()) {
                for (int i = 1; i <= count; i++) {
                    System.out.print(data.getString(i) + "\t");
                    if ((i == 2) && (data.getString(i).length() < 8)) {
                        System.out.print("\t");
                    }
                }
                System.out.println("");
            }
            System.out.println("============================");
            statement.close();
            connection.close();
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();

        }

    }
    public  static int ExcuteUpdate(String sql) throws  Exception{
        Connection connection=getConnection();
        Statement statement= connection.createStatement();
        int result= statement.executeUpdate(sql);
        statement.close();
        connection.close();
        return  result;
    }

}

ADO.NET 中怎么實現 下面以Sqlserver為例子,不同的數據庫 操作類不同而已 簡要的介紹下:

首先 創建  SqlConnection 對象 構造連接字符串

其次 創建 SqlCommond對象 執行相關SQL語句

最后通過 ExecuteNonQuery 、ExecuteScaler 執行相關操作

對於數據集上的問題 Java通過 ResultSet 而 .NetCore 中則是通過 SqlDataReader 讀取 填充 DataSet  , ResultSet 與 DataSet 其實有異曲同工之妙

Spring Boot JPA Hibernate vs .NetCore  EFCore

EFCore中有CodeFirst方式  而 DataBase First  ,這里就以 CodeFirst來對比,其實這兩個也是非常類是的

Hibernate代碼

@Entity(name = "user_model")
public class UserModel implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false,unique = true)
    private String username;
    @Column(nullable = true)
    private String passWord;
    @Column(nullable = true)
    private String email;
    @Column(nullable = true)
    private String nickName;
    @Column(nullable = true)
    private String regTime;
    @Column(nullable = true)
    private  String newname;
   // 略 geter seter

EFCore 代碼 ,原則上是可以不寫標簽的,這里就特殊自定義設置來說明

[Table("Tb_Room")]
    public class RoomModel : EntityBase
    {
        /// <summary>
        /// 教室名稱
        /// </summary>
        [Column("Room_Name", Order = 1, TypeName = "varchar")]
        public string RoomName { get; set; }
        /// <summary>
        /// 教室描述
        /// </summary>
        public string RoomDecription { get; set; }
        /// <summary>
        /// 排序
        /// </summary>
        public int Order { get; set; }
    }

 

通過上面的代碼可以看到 Hibernate中的 @Entity 注解 其實 很 EFCore中的 Table屬性標簽 是一個原理 包括用法其實都一樣 列(Column)也是一樣的用法,通過這些對比可以了解到Spring Data JPA 與 EFCore使用上的不同

 

在使用上 JPA 提供了相關的 倉儲代碼 JpaRepository 里面提供了很多操作方法 寫法上有一些講究(這里就略掉了.....)

同樣 在 EFCore中 分裝的DbSet<TEntity> 、IQueryable<TEntity> 也能提供相關操作

下面看下Java代碼

public interface UserRepository extends JpaRepository<UserModel, Long> {
    @Query("select u from user_model u")
    Page<UserModel> findLYM(Pageable pageable);


   @Transactional(timeout = 10)
   @Modifying
   @Query("update user_model set username = ?1 where id = ?2")
    int modifyById(String  username, Long id);
}

這是自定義的方法,通過相關注解完成操作

 

下面來測試下 JDBC的代碼以及 Spring Data JPA (Hibernate)的單元測試效果

@Test
    public  void testJDBCSql() throws  Exception
    {
        int result=  JDBCHelper.ExcuteUpdate("update user_model set username='123123123123' where id=4");
        System.out.print(result);
    }

    @Test
    public  void testJDBCQuery() throws  Exception
    {
        JDBCHelper.ExcuteQuery("select * from user_model where id=1");
    }

通過以上單元測試可以得到想要的效果

測試下 Hibernate 也能得到相關的效果,同時Hibernate還自動根據Enitty為我們創建好了相關的表結構 也是非常方便的 ,Hibernate中還分裝了 分頁 等各種操作

   @Test
    public  void addUser()
    {
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
        String formattedDate = dateFormat.format(date);
        userRepository.save(new UserModel("zhangsan","zhangsan",
                "805717775@qq.com","zhangsan",formattedDate,"ABC"));

    }
 @Test
    public  void getPager()
    {
        int page=1,size=10;
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        Pageable  pageable=new PageRequest(page,size,sort);
       Page<UserModel> userModels= userRepository.findLYM(pageable);
        for(UserModel item : userModels){
            System.out.println(item.getNickName());
        }
    }

關於數據庫操作這一塊還可以用MyBatis ,下一章節繼續對比 EFCore vs MyBatis  ORM 框架

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM