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

news2024/11/15 8:49:46

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);

            // 创建 SqlSession
            SqlSession 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();

            // 关闭 SqlSession
            sqlSession.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 Bean
        UserMapper 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();

        // 创建 Session
        Session 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();

        // 关闭 Session
        session.close();

        // 关闭 SessionFactory
        sessionFactory.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 Bean
        UserRepository 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 Bean
        UserRepository 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();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python使用指定端口进行http请求的例子

使用requests库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class SourcePortAdapter(HTTPAdapter): """"Transport adapter" that allows us to set the source port.""" def __init__(self, port, *args, **kwargs): self.poolm…

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障&#xff0c;导致上层服务故障&#xff0c;并且这个故障不断放大的过程&#xff0c;成为雪崩效应。 雪崩效应&#xff0c;往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池&#xff0c;线程池满…

数据结构的概念大合集06(树和二叉树)

概念大合集06 1、树1.1 树的相关定义1.2 树的基本运算1.3 树的基本术语1.3.1 结点的度&#xff0c;树的度1.3.2 分支结点&#xff0c;叶子节点1.3.3 路径&#xff0c;路径长度1.3.4 孩子结点&#xff0c;双亲结点&#xff0c;兄弟结点1.3.5 结点层次&#xff0c;树的高度1.3.6 …

24.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

DELL交换机清空配置S4128T

备份配置 show run | no-more show inventory | no-more show environment | no-more show system brief | no-more -------------- 清除数据 delete startup-config system "sudo -i" //输入密码 rm -rf /config/etc/opt/dell/os10/db_init/startup.xml rm…

基于SpringBoot和Vue的大学生租房系统的设计与实现

今天要和大家聊的是一款今天要和大家聊的是一款基于SpringBoot和Vue的大学生租房系统的设计与实现。 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同…

【Java11下载、安装、部署指南】

oracle jdk11下载 oracle jdk所有版本归档【archive】下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/ oracle jdk11下载地址&#xff1a; https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html 配置或修改wi…

【Python + Django】启动简单的文本页面

前言&#xff1a; 为了应付&#xff08;bushi&#xff09;毕业论文&#xff0c;总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识&#xff0c;这也算是为自己的测试经历增添光彩吧&#xff01;&#xff01;&#xff01; 希望、希望大家…

MySQL 字段定义时的属性设置

开发的时候第一步就是建表&#xff0c;在创建表的时候&#xff0c;我们需要定义表的字段&#xff0c;每个字段都有一些属性&#xff0c;比如说是否为空&#xff0c;是否允许有默认值&#xff0c;是不是逐渐等。 这些约束字段的属性&#xff0c;可以让字段的值更符合我们的预期&…

③【Docker】Docker部署Nginx

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ③【Docker】Docker部署Nginx docker拉取nginx…

【计算机网络篇】物理层(3)编码与调制

文章目录 &#x1f354;编码与调试⭐基本概念 &#x1f354;基本的带通调制方法和混合调制方法⭐基本的带通调制方法⭐混合调制方法 &#x1f354;编码与调试 物理层是OSI模型中的第一层&#xff0c;它负责在物理媒体上传输原始比特流。在物理层的编码和调试中&#xff0c;我们…

基于springboot的学生心理健康评估系统

技术&#xff1a;springbootvuemysql 一、系统背景 这次开发的学生心理咨询评估系统有管理员和用户。管理员可以管理个人中心&#xff0c;用户管理&#xff0c;试题管理&#xff0c;试卷管理&#xff0c;考试管理等。用户参加考试。经过前面自己查阅的网络知识&#xff0c;加上…

数据挖掘之关联规则

“啤酒和尿布的荣誉” 概念 项 item&#xff1a;单个的事物个体 &#xff0c;I{i1,i2…im}是所有项的集合&#xff0c;|I|m是项的总数项集&#xff08;item set)/模式&#xff08;pattern)&#xff1a;项的集合&#xff0c;包含k个项的项集称为k-项集数据集(data set)/数据库…

2024年最新分享提升Macbook运行速度的十大小技巧

经常听到小伙伴在抱怨PC电脑很慢&#xff0c;但是其实Mac电脑随着用的时间增长&#xff0c;运行速度也会越来越慢&#xff0c;那么造成Mac运行慢的原因有很多&#xff0c;可能是操作系统过时未更新&#xff0c;也可能是内存&#xff08;RAM&#xff09;不足&#xff0c;以下小编…

计算机二级C语言的注意事项及相应真题-6-程序设计

目录 51.将a所指数组主对角线上的元素分别乘以2;次对角线上的元素分别乘以3&#xff0c;依次放入指针p所指的数组中。计算过程中不得修改a所指数组中的数据52.将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.23-03.29 #16场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-03-23&#xff08;周六&#xff09; #7场比赛2024-03-24…

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径&#xff0c;其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题&#xff1a;给定一个加权连通图中的特定起点&#xff0c;目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是&#xff0c;这里关心…

Python和Java哪一个更适合初学者?

Python和Java哪一个更适合初学者&#xff1f; 对于初学者来说&#xff0c;Python通常是更友好的入门选择。它的语法简洁明了&#xff0c;接近自然语言&#xff0c;易于理解&#xff0c;使得初学者能够更快地掌握编程基础和逻辑思维。Python拥有丰富的库支持&#xff0c;特别是在…

【Arxml专题】-29-使用Cantools将CAN Matrix Arxml自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 CAN Matrix Arxml自动生成C语言代码 2.1 批处理文件CAN_Matrix_Arxml_To_C.bat内容说明 2.2 CAN Matrix Arxml文件要求 2.3 如何…