Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore

荒凉一梦 提交于 2020-07-27 22:01:26

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 框架

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!