手册

目录

会话(Session)

收藏742

阅读11891

更新时间2022-04-11

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

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

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

更好的业务封装性;

  • 会话对象参数:

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

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

    • 会话执行器(ISessionExecutor):

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

  • 开启会话示例代码:

    // 使用默认数据源开启会话
    User _result = JDBC.get().openSession(new ISessionExecutor() {
        public User execute(ISession session) throws Exception {
            // TODO 此处填写业务逻辑代码
            return session.findFirst(EntitySQL.create(User.class));
        }
    });
    
    // 使用指定的数据源开启会话
    IConnectionHolder _conn = JDBC.get().getConnectionHolder("oracledb");
    // 不需要关心_conn对象的资源释放
    IResultSet _results = JDBC.get().openSession(_conn, new ISessionExecutor>() {
        public IResultSet 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 {
    
            @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 _users = session.find(_user);
        // 或者返回指定的字段
        _users = session.find(_user, Fields.create(User.FIELDS.ID, User.FIELDS.AGE));
      • 方式二:通过自定义条件,查询所有符合条件的记录;

        IResultSet _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 _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接口文档和相关源码;

科技资讯

更多

精选课程

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

共29课时

61.7万人学习

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

共25课时

39.3万人学习

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

共43课时

70.9万人学习

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

共25课时

61.6万人学习

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

共22课时

23万人学习

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

共28课时

33.9万人学习

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

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号