8 个稳定版本

2.0.4 2022年9月23日
2.0.3 2022年5月20日
1.0.8 2022年5月13日

725数据库接口 中排名

每月 下载 28

Apache-2.0

135KB
3.5K SLoC

Summer MyBatis

Build Status

Summer MyBatis 是一个基于 Rust 语言和 MyBatis 框架的 ORM 框架。它用于简化开发。开发者无需关注复杂的 SQL。他们可以通过动态 SQL 语句进行业务开发。这样可以节省你的时间。此外,它的速度非常快。

功能

  • 跨平台支持(Linux、macOS、Windows)
  • 无运行时,无垃圾回收
  • 强大的灵活条件包装器。
  • 支持多种数据库驱动程序(mssql、mysql、postgres、sqlite)。
  • 支持与 tokio 的异步操作。
  • 结构自动序列化和反序列化。

入门

  • 添加 mybatis 依赖

    mybatis = { version = "2.0.3"}
    
    /// other dependencys
    serde = { version = "1", features =  ["derive"] }
    rbson = "2.0"
    tokio = { version = "1.18.2", features = ["full"] }
    
  • 示例

    使用 #[mybatis_plus] 宏进行数据表映射
    use serde::{Serialize, Deserialize};
    
    #[mybatis_plus]
    #[derive(Debug, Serialize, Deserialize)]
    pub struct Books {
        pub id: Option<String>,
        pub name: Option<String>,
        pub types: Option<String>
    }
    
    
    #[cfg(test)]
    mod tests {
        use super::*;
        use mybatis::mybatis::Mybatis;
        use mybatis::snowflake::SNOWFLAKE;
        use mybatis::plus::Mapping;
    
        #[tokio::test]
        async fn save_books() {
            let mybatis = Mybatis::new();
    
            mybatis.link("mysql://root:passw0rd@localhost:3306/test").await.unwrap();
    
            let id = SNOWFLAKE.generate();
            let cat = Books {
                id: Some(id.to_string()),
                name: Some("《Daughter of the sea》".to_string()),
                types: Some("Fairy Tales".to_string()),
            };
    
            mybatis.save(&cat,&[]).await;
        }
    }
    
    如果你不想使用宏,你可以创建一个对应数据库表的结构并映射方法
    use mybatis::mybatis_sql::string_util::to_snake_name;
    use mybatis::plus::MybatisPlus;
    use serde::{Serialize, Deserialize};
    
    #[derive(Debug, Serialize, Deserialize)]
    pub struct Pets {
      pub id: Option<String>,
      pub name: Option<String>,
      pub birthday: Option<mybatis::DateTimeNative>,
      pub delete_flag: Option<i32>,
    }
    
    impl MybatisPlus for Pets {
    
      fn table_name() -> String {
          let type_name = std::any::type_name::<Self>();
          let mut name = type_name.to_string();
          let names: Vec<&str> = name.split("::").collect();
          name = names.get(names.len() - 1).unwrap_or(&"").to_string();
    
          to_snake_name(&name)
      }
    
      fn table_columns() -> String {
          String::from("id,name,birthday,delete_flag")
      }
      
    }
    
    #[cfg(test)]
    mod tests {
        use super::*;
        use mybatis::mybatis::Mybatis;
        use mybatis::snowflake::SNOWFLAKE;
        use mybatis::plus::{Skip, Mapping};
    
        ///
        /// Save a single object 
        ///
        #[tokio::test]
        async fn save_pets() {
            let mybatis = Mybatis::new();
    
            mybatis.link("mysql://root:passw0rd@localhost:3306/test").await.unwrap();
    
            let id = SNOWFLAKE.generate();
            let cat = Pets {
                id: Some(id.to_string()),
                name: Some("Cindy".to_string()),
                birthday: Some(mybatis::DateTimeNative::now()),
                delete_flag: Some(0),
            };
    
            mybatis.save(&cat,&[]).await;
        }
    
        ///
        /// Query a single object according to the specified field and return Option<Object>
        ///
        #[tokio::test]
        async fn query_pet_by_name() {
            let mybatis = Mybatis::new();
    
            mybatis.link("mysql://root:passw0rd@localhost:3306/test").await.unwrap();
    
            let result: Option<Pets> = mybatis.fetch_by_column("name", &"Cindy").await.unwrap();
            println!("result: {:?}", result);
        }
    }
    

贡献

到目前为止,我们只实现了 Summer-MyBatis 的一些灵活条件包装器。我们正在开发 XML 文件的映射和 Oracle 数据库驱动程序的支持。如果你有任何兴趣和想法,请提交 PR 或联系我。

我一直在努力工作,寻找各种贡献。期待你的帮助!

依赖关系

~6–26MB
~426K SLoC