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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2