二、CRUD操作以及配置解析

二、CRUD操作以及配置解析

1.在原来基础上加上增加、删除和更改

在UserDao的接口中

    /**
     * 根据id查询用户
     */
    User getUserById(int id);

    /**
     * 增加一个用户
     */
    int addUser(User user);
    /**
     * 修改一个用户
     */
    int updateUser(User user);
    /**
     * 删除一个用户
     */
    int deleteUser(int id);

在UserMapper.xml中

<mapper namespace="com.join.dao.UserDao">
    <select id="getUserList"  resultType="com.join.entity.User">
     select * from mybatis.user
    </select>

     <select id = "getUserById" resultType="com.join.entity.User" parameterType="int" >
         select * from mybatis.user where id = #{id}

     </select>
    <insert id="addUser" parameterType="com.join.entity.User">
            insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});

    </insert>

    <update id = "updateUser" parameterType="com.join.entity.User">
        update mybatis.user set name = #{name} ,pwd = #{pwd} where id = #{id};
    </update>

    <delete id = "deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id}

    </delete>

    </mapper>

进行测试

/**
     * 增删改需要提交事务,不然无法对数据库进行更改
     */
    @Test
    public void addUser() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int flag = mapper.addUser(new User(4,"4","123"));

        System.out.println(flag);

        //提交事务 ***
        sqlSession.commit();

        sqlSession.close();
    }

    /**
     * 更新一个用户
     */
    @Test
    public void updateUser() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int flag = mapper.updateUser(new User(1,"1","123456"));

        System.out.println(flag);

        //提交事务 ***
        sqlSession.commit();

        sqlSession.close();
    }

    /**
     * 更新一个用户
     */
    @Test
    public void deleteUser() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int flag = mapper.deleteUser(4);

        System.out.println(flag);

        //提交事务 ***
        sqlSession.commit();

        sqlSession.close();
    }

2.Map跟模糊查询扩展

   (1).假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

UserDao

User getUserById2(Map<String,Object> map);

int addUser2(Map<String,Object> map);

在UserMapper.xml中

<!--    通过map传递,获取用户-->
    <select id = "getUserById2" resultType="com.join.entity.User" parameterType="map" >
         select * from mybatis.user where id = #{id} and name = #{name}

     </select>


<!--    使用map插入,对象中的属性,可以直接取出来,传递map的key-->
    <insert id="addUser2" parameterType="map">
            insert into mybatis.user (id,name,pwd) values(#{userId},#{username},#{password});

    </insert>

进行测试

    /**
     * 查询一个user使用map
     */
    @Test
    public void selectUserById2() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        Map<String ,Object> map = new HashMap<String,Object>();
        map.put("id",2);
        map.put("name","2");
        User user = mapper.getUserById2(map);

        System.out.println(user);

        //提交事务 ***
        sqlSession.commit();

        sqlSession.close();
    }


    /**
     * 增加一个user使用map
     */
    @Test
    public void addUser2() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        Map<String ,Object> map = new HashMap<String,Object>();
        map.put("userId",4);
        map.put("username","4");
        map.put("password","123456");
        int flag = mapper.addUser2(map);

        System.out.println(flag);

        //提交事务 ***
        sqlSession.commit();

        sqlSession.close();
    }

(2)模糊查询

UserDao

List<User> getUserLike(String value);

在UserMapper.xml中

<!--    模糊查询1-->

    <select id="getUserLike"  resultType="com.join.entity.User">
     select * from mybatis.user  where  pwd like #{value}
    </select>

 

进行测试

/**
     * 模糊查询user1,并且不会出现sql注入
     */
    @Test
    public void getUserLike() {
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();
        //方法一:
        //List<User> users = session.getUserList("com.join.dao.UserMapper.getUserList");
        //方法二,执行,以后直接用Mapper代替Dao:
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.getUserLike("%123%");

        for (User user: users){
            System.out.println(user);
        }
        sqlSession.close();
    }

2. 配置解析

(1)核心配置文件

configuration(配置)   //
properties(属性)     //
settings(设置)    //
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
  environment(环境变量)
  transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

(2)环境配置(environments)

      MyBatis可以配置成适应多种环境
      不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。学会使用配置多套运行环境!
      Mybatis默认的事务管理器就是JDBC,连接池: POOLED

(3)属性(propertise)

我们可以通过properties属性来实现引用配置文件

<!--第二种在xml中配置,对应下面的environment中也要改成name-->
    <properties resource="db.properties" >
        <property name="name" value="root"/>
        <property name="pwd" value="root"/>


    </properties>

    <!--   第一种方式(优先使用) 引入外部配置文件,跟配置文件对应-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${pwd}"/>
                </dataSource>
            </environment>
        </environments>


 

 

4. 别名 (typeAliases)

类型别名是为Java类型设置一个短的名字。它只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
 

        <!-- 别名
    实体类少的使用第一种,可以自定义
    实体类多的时候使用第二种,不能自己定义,如果实体类有注解,可以直接用注解的名字
    -->
    <typeAliases>
        <!--  给实体类起一个别名-->
        <typeAlias type="com.join.entity.User"  alias="User"></typeAlias>
        <package name="entity"/>
    </typeAliases>

    <typeAliases>
        <!-- 扫描实体类的包,它的默认别名就为这个类的类名,首字母小写!(也可以大写) -->
        <package name="entity"/>
    </typeAliases>

5. 设置(setting)

  •  懒加载

  •  日志实现

  •  缓存开启关闭

一个配置完整的 settings 元素的示例如下:

<settings>
 <setting name="cacheEnabled" value="true"/>
 <setting name="lazyLoadingEnabled" value="true"/>
 <setting name="multipleResultSetsEnabled" value="true"/>
 <setting name="useColumnLabel" value="true"/>
 <setting name="useGeneratedKeys" value="false"/>
 <setting name="autoMappingBehavior" value="PARTIAL"/>
 <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
 <setting name="defaultExecutorType" value="SIMPLE"/>
 <setting name="defaultStatementTimeout" value="25"/>
 <setting name="defaultFetchSize" value="100"/>
 <setting name="safeRowBoundsEnabled" value="false"/>
 <setting name="mapUnderscoreToCamelCase" value="false"/>    //大小写,就是fast_test
 <setting name="localCacheScope" value="SESSION"/>
 <setting name="jdbcTypeForNull" value="OTHER"/>
 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

6.映射器(mappers)

   <!-- 映射文件,必须要用
     每一个Mapper.xml都需要在mybatis的核心配置文件中注册
     -->
    <mappers>
           <!--  mapper.xml可以放在任何地方 (推荐)     -->
        <mapper resource="com/join/dao/UserMapper.xml"/>
           <!--   使用class文件绑定注册 ,接口跟他的mapper配置文件必须同名
             并且在同一个包下-->
        <mapper class = "com.join.dao.UserMapper"></mapper>
          <!-- 使用扫描包进行注入,跟class的注意点相同-->
        <package name="com.join.dao"/>

    </mappers>

3. 生命周期和作用域

作用域理解

  • SqlSessionFactoryBuilder                                                                                                                                                               的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。                                               因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。

  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。

  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。(全局)

  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try...catch...finally... 语句来保证其正确关闭。

  • 所以 SqlSession 的最佳的作用域是请求或方法作用域。(局部变量),即结束该方法就关闭

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值