java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis注解使用,ORM层优化

MyBatis的注解使用、ORM层优化方式(懒加载和缓存)

作者:bamzhy13

这篇文章主要介绍了MyBatis的注解使用、ORM层优化方式(懒加载和缓存),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis注解

@Select( "SELECT * FROM tt_user WHERE username Like #{id};")
User findUserByName(String name);

<!--以map为输入参数查找-->
@Select("select * from tt_user where username= #{name} and  password=#{pass}")
User findUserByUsernameAndPassword(HashMap map);
@Insert("insert into tt_user values (#{id},#{username},#{password},#{email},#{age})")
int AddUser(User user) throws IOException;
@Update("update tt_user set username = #{username} where id = #{id}")
void updateUserById(User user);
@Delete("delete from tt_user where id =#{id}")
void deleteUserById(String id);

动态SQL语句

@SelectProvider(type = UserDaoSqlProvider.class,method = "findUserByName")
List<User> findUserByName(String username) throws IOException;
    public String findUserByName(String username){
        //return  "select * from tt_user where username like '" +username+"'";
        String sql = new SQL() {{
            SELECT("*");
            FROM("tt_user");
            if (username!=null&&!username.isEmpty()){
                WHERE("username like "+username );
            }
        }}.toString();
        System.out.println("sql="+sql);
        return sql;
}

Mybatis提供了一个匿名内部类

这里写图片描述

另一种写法:

    public String getxxx(){

       return new SQL().UPDATE("PERSON")
                 .SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}")
                 .WHERE("ID = #{id}")
                 .toString();
    }
}

Mybatis对ORM层的优化

缓存

查了一次,结果保存在本地,下次查相同内容的时候就不用再去访问数据库了。

懒加载

Lazyloading:先加载主信息,在需要的时候再去加载关联数据

Mybatis中ResultMap中的association和Collection标签具有懒加载的功能

在主配置文件中的configuration标签下配置

    <!--全局懒加载-->
    <settings>
        <!--开关-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

在从配置文件中的association或者collection里边添加fetchType字段(fetch翻译是拿、取)

    <resultMap id="studentAndCourses" type="com.bamzhy.bean.Student">
        <id column="id" property="id"></id>
        <collection property="courses"
                    javaType="list"
                    select="com.bamzhy.dao.UserDao.findcourseBySid"
                    column="id"
                    fetchType="eager">
            <id column="cid" property="cid"></id>
        </collection>
    </resultMap>

MyBatis缓存机制

这里写图片描述

这里写图片描述

我查了两次,但是只执行了一次sql语句

这里写图片描述

现在在第一次查询结束后关闭sqlSession,再重新new一个session出来,

这里写图片描述

执行查询

这里写图片描述

果然,sql语句被执行了两次,可以证明一级缓存的确存在

二级缓存

二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是二级缓存区域。

主配置文件里边:

这里写图片描述 从配置文件: 这里写图片描述

注意点 cache对象需要实现序列化接口,否则会报Error serializing object

这里写图片描述

虽然我关闭了sqlsession,但仍然没有执行两次sql。

这里写图片描述

说明二级缓存的确存在

比如我创建了一个sqlsession,不关闭,再创建一个sqlsession,那么二级缓存看见第一个sqlsession没有关闭(一级缓存生效了),二级缓存他就不生效了。事实上这俩session不是同一个session,二级缓存也没生效,这样要执行两次sql语句。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文