C# xaml框架以及Java的ORM介绍

2024-03-22 05:04

本文主要是介绍C# xaml框架以及Java的ORM介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c#有ASP.Net,.NET以及EF Core这几个重要的运行时和框架.分别用于web,应用以及数据库的ORM.

img

目前跨平台的有Avalonia UI,.Net MAUI以及Uno Platform,至于WPF等本身不是跨平台的,但可以依靠其他库实现跨平台.这里面Avalonia应该是认为bug比较少的.

当然目前最火的跨平台解决方案应该是Flutter,其次是React Native.

至于EF Core,看看代码就知道有多么简洁优雅了.

using var db = new BloggingContext();// Inserting data into the database
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();// Querying
var blog = db.Blogs.OrderBy(b => b.BlogId).First();// Updating
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(new Post{Title = "Hello World",Content = "I wrote an app using EF Core!"});
db.SaveChanges();// Deleting
db.Remove(blog);
db.SaveChanges();

而Java的ORM有Mybatis,Mybatis-plus,Hibernate,Spring Data JPA以及更原始的Jdbctemplate和query dsl.

具体来说,当使用Java和MyBatis编写示例代码时,需要配置MyBatis的环境和数据库连接,并编写映射器接口和SQL映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/MyMapper.xml"/></mappers>
</configuration>
package com.example;public class User {private int id;private String name;private int age;// getters and setters
}import java.util.List;public interface UserMapper {void insertUser(User user);void updateUser(User user);void deleteUser(int id);User getUserById(int id);List<User> getAllUsers();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.UserMapper"><insert id="insertUser" parameterType="com.example.User">INSERT INTO users (name, age) VALUES (#{name}, #{age})</insert><update id="updateUser" parameterType="com.example.User">UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete><select id="getUserById" parameterType="int" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}</select><select id="getAllUsers" resultType="com.example.User">SELECT * FROM users</select>
</mapper>
package com.example;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Main {public static void main(String[] args) {try {// 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 创建 SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 获取 UserMapper 接口的实例UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 插入用户User newUser = new User();newUser.setName("John");newUser.setAge(25);userMapper.insertUser(newUser);System.out.println("Inserted user: " + newUser);// 更新用户User existingUser = userMapper.getUserById(newUser.getId());existingUser.setName("John Doe");userMapper.updateUser(existingUser);System.out.println("Updated user: " + existingUser);// 获取所有用户List<User> allUsers = userMapper.getAllUsers();System.out.println("All users:");for (User user : allUsers) {System.out.println(user);}// 删除用户userMapper.deleteUser(existingUser.getId());System.out.println("Deleted user with ID: " + existingUser.getId());// 提交事务sqlSession.commit();// 关闭 SqlSessionsqlSession.close();} catch (IOException e) {e.printStackTrace();}}
}

使用MyBatis-Plus编写示例代码时,可以省去编写SQL映射文件,因为MyBatis-Plus提供了便捷的CRUD操作方法和自动生成SQL语句的功能。

package com.example;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("users")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;// getters and setters
}import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {
}
package com.example;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Main {public static void main(String[] args) {// 启动 Spring Boot 应用ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);// 获取 UserMapper BeanUserMapper userMapper = context.getBean(UserMapper.class);// 插入用户User newUser = new User();newUser.setName("John");newUser.setAge(25);userMapper.insert(newUser);System.out.println("Inserted user: " + newUser);// 更新用户User existingUser = userMapper.selectById(newUser.getId());existingUser.setName("John Doe");userMapper.updateById(existingUser);System.out.println("Updated user: " + existingUser);// 查询所有用户QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByAsc("id");IPage<User> userPage = userMapper.selectPage(new Page<>(1, 10), queryWrapper);System.out.println("All users:");for (User user : userPage.getRecords()) {System.out.println(user);}// 删除用户userMapper.deleteById(existingUser.getId());System.out.println("Deleted user with ID: " + existingUser.getId());// 关闭应用上下文context.close();}
}

使用了MyBatis-Plus的注解 @TableName 来指定实体类与数据库表的映射关系,使用了 @TableId 注解来定义主键字段。UserMapper 接口继承了 BaseMapper<User>,这样就可以直接使用MyBatis-Plus提供的CRUD操作方法。

使用Hibernate编写示例代码时,需要配置Hibernate的环境和数据库连接,并编写实体类和Hibernate映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">password</property><property name="hibernate.hbm2ddl.auto">update</property><property name="hibernate.show_sql">true</property><mapping resource="com/example/User.hbm.xml"/></session-factory>
</hibernate-configuration>
package com.example;import javax.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;// getters and setters
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.example.User" table="users"><id name="id" column="id"><generator class="identity"/></id><property name="name" column="name"/><property name="age" column="age"/></class>
</hibernate-mapping>
package com.example;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;import java.util.List;public class Main {public static void main(String[] args) {// 加载 Hibernate 配置Configuration configuration = new Configuration().configure();SessionFactory sessionFactory = configuration.buildSessionFactory();// 创建 SessionSession session = sessionFactory.openSession();// 开启事务Transaction transaction = session.beginTransaction();// 插入用户User newUser = new User();newUser.setName("John");newUser.setAge(25);session.save(newUser);System.out.println("Inserted user: " + newUser);// 更新用户User existingUser = session.get(User.class, newUser.getId());existingUser.setName("John Doe");session.update(existingUser);System.out.println("Updated user: " + existingUser);// 查询所有用户List<User> allUsers = session.createQuery("FROM User", User.class).getResultList();System.out.println("All users:");for (User user : allUsers) {System.out.println(user);}// 删除用户session.delete(existingUser);System.out.println("Deleted user with ID: " + existingUser.getId());// 提交事务transaction.commit();// 关闭 Sessionsession.close();// 关闭 SessionFactorysessionFactory.close();}
}

使用Hibernate的注解 @Entity@Table@Id@Column 来定义实体类与数据库表的映射关系和字段信息。Hibernate映射文件 User.hbm.xml 也定义了实体类与数据库表的映射关系。

当使用Spring Data JPA编写示例代码时,可以利用Spring Data JPA提供的接口和方法来进行数据库操作,而无需编写大量的重复代码。

package com.example;import javax.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;// getters and setters
}
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {
}
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;import java.util.List;@SpringBootApplication
public class Main {public static void main(String[] args) {// 启动 Spring Boot 应用ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);// 获取 UserRepository BeanUserRepository userRepository = context.getBean(UserRepository.class);// 插入用户User newUser = new User();newUser.setName("John");newUser.setAge(25);userRepository.save(newUser);System.out.println("Inserted user: " + newUser);// 更新用户User existingUser = userRepository.findById(newUser.getId()).orElse(null);existingUser.setName("John Doe");userRepository.save(existingUser);System.out.println("Updated user: " + existingUser);// 查询所有用户List<User> allUsers = userRepository.findAll();System.out.println("All users:");for (User user : allUsers) {System.out.println(user);}// 删除用户userRepository.deleteById(existingUser.getId());System.out.println("Deleted user with ID: " + existingUser.getId());// 关闭应用上下文context.close();}
}

此外使用JPA与querydsl结合的也很多.QueryDSL仅仅是一个通用的查询框架,专注于通过 JavaAPI 构建类型安全的 Sql 查询

package com.example;import javax.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;// getters and setters
}
package com.example;import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.core.types.dsl.StringPath;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {// 定义自定义查询方法default User findByName(String name) {JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());QUser user = QUser.user;return queryFactory.selectFrom(user).where(user.name.eq(name)).fetchOne();}// 使用Querydsl的字符串表达式进行模糊查询default Iterable<User> findByNameLike(String name) {JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());QUser user = QUser.user;StringExpression nameExpression = user.name;return queryFactory.selectFrom(user).where(nameExpression.likeIgnoreCase("%" + name + "%")).fetch();}
}
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;import java.util.List;@SpringBootApplication
public class Main {public static void main(String[] args) {// 启动 Spring Boot 应用ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);// 获取 UserRepository BeanUserRepository userRepository = context.getBean(UserRepository.class);// 插入用户User newUser = new User();newUser.setName("John");newUser.setAge(25);userRepository.save(newUser);System.out.println("Inserted user: " + newUser);// 更新用户User existingUser = userRepository.findByName("John");existingUser.setName("John Doe");userRepository.save(existingUser);System.out.println("Updated user: " + existingUser);// 查询所有用户List<User> allUsers = userRepository.findAll();System.out.println("All users:");for (User user : allUsers) {System.out.println(user);}// 根据名称模糊查询用户List<User> usersWithNameLike = userRepository.findByNameLike("John");System.out.println("Users with name like 'John':");for (User user : usersWithNameLike) {System.out.println(user);}// 删除用户userRepository.delete(existingUser);System.out.println("Deleted user with ID: " + existingUser.getId());// 关闭应用上下文context.close();}
}

这篇关于C# xaml框架以及Java的ORM介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834583

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows