概述 核心概述 包类的自动扫描(AutoScan) 依赖注入(IoC) 方法拦截(AOP) 记录类属性状态 (PropertyState) 事件服务(Event) 模块(Module) 国际化(I18N) Lang 配置体系概述 配置体系目录结构及配置 示例一:解析XML配置 示例二:解析Properties配置 配置体系模块更多操作 日志概述 日志模块配置 使用示例 JDBC持久化概述及模块配置 数据源(DataSource) 数据实体(Entity) 自动生成实体类(方式一) 自动生成实体类(方式二) 事务(Transaction) 会话(Session) 数据实体操作 结果集(ResultSet) 查询(Query) 存储器(Repository) 高级特性—多表查询及自定义结果集数据处理 高级特性—存储过程调用与结果集数据处理 高级特性—数据库锁操作 插件概述 插件工厂 自定义插件工厂 插件结构 插件的实现及使用 服务概述 服务端(Server)示例 客户端(Client)示例 客户端和服务端对象的使用 验证概述 默认验证器及参数说明 默认国际化资源文件内容 验证框架使用示例 自定义验证器 缓存概述 缓存模块配置 缓存模块使用示例 WebMVC概述 模块初始化及配置说明 控制器(Controller) 控制器参数(Parameter) 环境上下文对象(WebContext) 文件上传(Upload) 视图(View) 验证(Validation) 缓存(Cache) 拦截器(Intercept) Cookies操作 国际化(I18N) 约定模式(Convention Mode) 高级特性—控制器请求处理器 高级特性—异常错误处理器

概述

YMP在线手册

浏览13637
更新时间2022-04-11

会话是对应用中具体业务操作触发的一系列与数据库之间的交互过程的封装,通过建立一个临时通道,负责与数据库之间连接资源的创建及回收,同时提供更为高级的抽象指令接口调用,基于会话的优点:

开发人员不需要担心连接资源是否正确释放;

严格的编码规范更利于维护和理解;

更好的业务封装性;

  • 会话对象参数:

    • 数据库连接持有者(IConnectionHolder):

      指定本次会话使用的数据源连接;

    • 会话执行器(ISessionExecutor):

      以内部类的形式定义本次会话返回结果对象并提供Session实例对象的引用;

  • 开启会话示例代码:

    // 使用默认数据源开启会话
    User _result = JDBC.get().openSession(new ISessionExecutor<User>() {
        public User execute(ISession session) throws Exception {
            // TODO 此处填写业务逻辑代码
            return session.findFirst(EntitySQL.create(User.class));
        }
    });
    
    // 使用指定的数据源开启会话
    IConnectionHolder _conn = JDBC.get().getConnectionHolder("oracledb");
    // 不需要关心_conn对象的资源释放
    IResultSet<User> _results = JDBC.get().openSession(_conn, new ISessionExecutor<IResultSet<User>>() {
        public IResultSet<User> execute(ISession session) throws Exception {
            // TODO 此处填写业务逻辑代码
            return session.find(EntitySQL.create(User.class));
        }
    });
  • 基于ISession接口的数据库操作:

    示例代码是围绕用户(User)数据实体完成的CRUD(新增、查询、修改、删除)操作来展示如何使用ISession对象,数据实体如下:

        @Entity("user")
        public static class User extends BaseEntity<User, String> {
    
            @Id
            @Property
            private String id;
    
            @Property(name = "user_name")
            private String username;
    
            @Property(name = "pwd")
            private String pwd;
    
            @Property(name = "sex")
            private String sex;
    
            @Property(name = "age")
            private Integer age;
    
            // 忽略Getter和Setter方法
    
            public static class FIELDS {
                public static final String ID = "id";
                public static final String USER_NAME = "username";
                public static final String PWD = "pwd";
                public static final String SEX = "sex";
                public static final String AGE = "age";
            }
            public static final String TABLE_NAME = "user";
        }
    • 插入(Insert):

      User _user = new User();
      _user.setId(UUIDUtils.UUID());
      _user.setUsername("suninformation");
      _user.setPwd(DigestUtils.md5Hex("123456"));
      _user.setAge(20);
      _user.setSex("F");
      // 执行数据插入
      session.insert(_user);
      
      // 或者在插入时也可以指定/排除某些字段
      session.insert(_user, Fields.create(User.FIELDS.SEX, User.FIELDS.AGE).excluded(true));
    • 更新(Update):

      User _user = new User();
      _user.setId("bc19f5645aa9438089c5e9954e5f1ac5");
      _user.setPwd(DigestUtils.md5Hex("654321"));
      // 更新指定的字段
      session.update(_user, Fields.create(User.FIELDS.PWD));
    • 查询(Find):

      • 方式一:通过数据实体设置条件(非空属性之间将使用and条件连接),查询所有符合条件的记录;

        User _user = new User();
        _user.setUsername("suninformation");
        _user.setPwd(DigestUtils.md5Hex("123456"));
        // 返回所有字段
        IResultSet<User> _users = session.find(_user);
        // 或者返回指定的字段
        _users = session.find(_user, Fields.create(User.FIELDS.ID, User.FIELDS.AGE));
      • 方式二:通过自定义条件,查询所有符合条件的记录;

        IResultSet<User> _users = session.find(
                EntitySQL.create(User.class)
                        .field(User.FIELDS.ID)
                        .field(User.FIELDS.SEX), 
                // 设置Order By条件
                Where.create()
                        .orderDesc(User.FIELDS.USER_NAME));
      • 方式三:分页查询;

        IResultSet<User> _users = session.find(
                EntitySQL.create(User.class)
                        .field(User.FIELDS.ID)
                        .field(User.FIELDS.SEX),
                Where.create()
                        .orderDesc(User.FIELDS.USER_NAME),
                // 查询第1页,每页10条记录,统计总记录数
                Page.create(1).pageSize(10).count(true));
      • 方式四:仅返回符合条件的第一条记录(FindFirst);

        // 查询用户名称和密码都匹配的第一条记录
        User _user = session.findFirst(EntitySQL.create(User.class), 
                Where.create(
                        Cond.create()
                                .eq(User.FIELDS.USER_NAME).param("suninformation")
                                .eq(User.FIELDS.PWD).param(DigestUtils.md5Hex("123456"))));

      :更多的查询方式将在后面的 “查询(Query)” 章节中详细阐述;

    • 删除(Delete):

      • 根据实体主键删除记录:

        User _user = new User();
        _user.setId("bc19f5645aa9438089c5e9954e5f1ac5");
        //
        session.delete(_user);
        
        //
        session.delete(User.class, "bc19f5645aa9438089c5e9954e5f1ac5");
      • 根据条件删除记录:

        // 删除年龄小于20岁的用户记录
        session.executeForUpdate(
                SQL.create(
                        Delete.create(User.class).where(
                                Where.create(
                                        Cond.create()
                                                .lt(User.FIELDS.AGE).param(20)))));
    • 统计(Count):

          // 统计年龄小于20岁的用户记录总数
      
          // 方式一:
          long _count = session.count(User.class, 
                  Where.create(
                          Cond.create()
                                  .lt(User.FIELDS.AGE).param(20)));
      
          // 方式二:
          _count = session.count(
                  SQL.create(
                          Delete.create(User.class).where(
                                  Where.create(
                                          Cond.create()
                                                  .lt(User.FIELDS.AGE).param(20)))));
    • 执行更新类操作(ExecuteForUpdate):

      该方法用于执行ISession接口中并未提供对应的方法封装且执行操作会对数据库产生变化的SQL语句,执行该方法后将返回受影响记录行数,如上面执行的删除年龄小于20岁的用户记录:

          int _effectCount =session.executeForUpdate(
                  SQL.create(
                          Delete.create(User.class).where(
                                  Where.create(
                                          Cond.create()
                                                  .lt(User.FIELDS.AGE).param(20)))));

    :以上操作均支持批量操作,具体使用请阅读API接口文档和相关源码;

相关视频

更多

免费

php8,我来也
初级php8,我来也

34万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.6万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

31万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

64.9万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.2万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.6万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.1万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.3万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.2万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.1万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载