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