Java Spring Boot VS .NetCore (一)來一個簡單的 Hello Worldhtml
Java Spring Boot VS .NetCore (二)實現一個過濾器Filtermysql
Java Spring Boot VS .NetCore (三)Ioc容器處理sql
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 Attributeurl
Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Securityspa
Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptorhibernate
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代碼
下面說下步驟
首先 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 其實有殊途同歸之妙
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 框架