美文网首页
SSM Mybatis

SSM Mybatis

作者: 极速魔法 | 来源:发表于2020-09-05 08:22 被阅读0次

Mybatis

框架就是一套规范
SSH:struct2 spring hibernate
SSM: springmvc spring mybatis

基于ORM 半自动、轻量级框架

半自动:mybtis 手动编写SQL
全自动: hibernate

轻量级:程序启动消耗资源少

ORM

Object Relational Mapping 对象关系映射
O:对象模型,实体对象
R:关系型数据库的结构模型 数据库表
M:映射,实体对象和数据库表建立映射

一个实体(类)对应数据库表
一个对象对应数据库一条记录

/UserMapper.xml/

<!-- namespace id 构成唯一标识,resultType 返回结果类型封装,包的绝对路径 -->
 <mapper namespace="user">
    <select id="findALl" resultType="com.lagou.User">
        select * from user
    </select>

<!-- 指定参数对象;属性名称保持javaBean一致,因为mybatis调用getxx方法获得值->
    <insert id="saveUser parameterType="com.lagou.User">
        insert into(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>

    <update id="updateUser" parameterType="com.lagou.User">
        update user set name=#{username} where id=#{id}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{}
    </delete>
</mapper>
  • insert,update 操作手动提交事务 ,sqlSesson.openSession()导致的
    sqlSesson.openSession(true) 自动提交

传统开发方式

...
sqlSession.selectOne(String statement,Object param);
sqlSession.selectList(String statement,Object param);
sqlSession.insert("UserMapper.insert",user);
sqlSession.update("UserMapper. updateUser",user)
sqlSession.delete("UserMapper.deleteUser",1)
sqlSession.commit()

sqlMapConfig.xml 数据库环境配置文件


<!-- 加载property 文件 -->
<properties resource="jdbc.properties"></properties>

<typeAliases>
<!-- 批量起别名 -->
    <package name="com.lagou"/>
</typeAliases>
...
<dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"></property>
</dataSource>

<mappers>
    <mpper resourse="mapper/UserMappper.xml"></mapper>

    <!--批量加载mapper.xml -->
    <package name="com.lagou.mapper"/>
</mappers>
  • 加载配置文件
  • 获取sqlSessionFactory
  • 获取sqlSession
  • 执行sql
  • 关闭资源

代理开发方式

  • namespace ,id, parameterType ,resultType和接口对应
// 代理对象
UserMapper mapper= sqlsession.getMapper(UserMapper.class)
image

ResultMap

数据库字段名和javabean属性不一致

...
<!-- type javaBean类,property类中的属性,column表的字段名,id标签代表主键,result标签代表普通标签-->
<resultMap id="userResultMap" type="User">
    <id property="id" column="id"></id>
    <result property="usernameabc" column="username"></result>
</resultMap>

多条件查询

参数传递

 1. ${arg0},${arg1}

 2. @Param(“id”) int id  , select * from where id=#{id}

 3.pojo对象  parameterType=“user” select * from where id=#{id}, parmeterType是对象类型,id要和属性名称一致
#{} 占位符,引用参数值自动添加单引号,单个基本类型或String #{}中变量名随意写
${} sql原样拼接,单个基本类型或String 只能写${value}

返回主键

标签属性userGeneratedKeys=“true” keyProperty=“id"

<selectKey order="After" keyColumn="id" keyProperty="id" resultType="int">SELECT LAST_INSERT_ID();</selectKey>

动态sql

<!--if 标签 -->
<!--where 标签相当于 1=1标签 -->
<select ...>
    select * from user 【where 1=1】
    <where>
    <if test="id !=null">
        and id=#{id}
    </if>
</where>
</select>

<update id="">
    update user
    <set>
        <if test="username != null">
            <!-- 加逗号-->
            username=#{username},
        </if>
        ...
        where id=#{id}
    </set>
</update>

<!--select xx from user in -->
<select id="" parameterType="list" resultType="user">
    select * from user
    <where>
<!-- open开始,close代表结束,"collection"代表集合,数组“array”-->
        <foreach collection="collection" open="id in (" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>

<!--sql复用 -->
<sql id="selectUser">
    select * from user
</sql>

<include refid="selectUser"></include>

Plugins

...
<plugins>
    <plugin interceptor="">
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>
// 当前页,每页条数
PageHelper.startPage(pageNum,PageSize);
...
PageInfo<User> pageInfo = new PageInfo<User>(Users);

多表查询

<resultMap>
    ...
    <!-- property 的封装的属性,javaType封装的类型-->
    <association property="user" javaType="com.lagou.User">
        <id property="id" column="uid"></id>
        ...
    </associtaion>
</resultMap>
    ...
        <!--一对多 -->
        <collection property="orderList" ofType="com.lagou.Order">
            <!--uid查询时的别名 -->
            <id property="id" column="uid"></id>
            <result/>
        </collection>

<!--多对多 -->
        
  • bean代码实现
  • 配置mapper.xml 的resultMap

嵌套查询

 <!-- 一对一,association column属性代表当前表传参的字段,再调用select标签中的sql语句-->
<resultMap id="orderMap2">
...
<association property="user" javaType="com.lagou.User" select="com.lagou.mapper.UserMapper.findById" column="uid">
    
</association>

</resultMap>

<select id=“” resultMap="orderMap2">
    select * from orders
</select>

加载策略

延迟加载, 用到关联数据时再查询。一对多,多对多查询
优点:提高数据库性能
缺点:需要大批量数据,用户等待时间变长

立即加载 :一对一查询

局部懒加载

<associtation> <collection>标签中添加属性fetchType=“lazy”,延迟加载。fetxhType=“eager”,立即加载

全局懒加载

<setting name="lazyLoadingEnabled" value="true"/>
局部配置优于全局配置

缓存

经常查询,不经常变化放到缓存,提高查询效率

一级缓存

一级缓存默认开启,sqlSession级别缓存
1. 第一次 先查询一级缓存,没有数据,查询数据库
2. 第二次查询,查询一级缓存,缓存中有数据。
3. C,U,D操作,clearCache,commit,close 会清空缓存
4. <select flushCache=“true”>配置清空缓存

二级缓存

默认不开启,namespace级别,跨sqlSession

  1. <setting name=“cachEnable value=“true”/>
    sqlMapConfig.xml中

  2. <cache></cache> userMapper.xml

  3. <select useCache=“true”> 当前开启二级缓存

  4. sqlSession.close() 一级缓存刷新到二级缓存

二级缓存 —》一级缓存 ——》数据库
多表查询开启二级缓存,产生脏读问题。

注解开发

/UserMapper.java/

@Select(“select * from user”)
public List<User> findALl();

// 参数对应bean属性
@Insert("insert into user (username) values (#{username})")
public void save(User user);

@Results <resultMap>
@Result <result>,<id>
@One <assocation>
@Many <collection>

/OrderMapper.java/

@Select("select * from orders")
@Results({ //id 代表主键
    @Result(property="id",column="id",id=true),
    @Result(property="total",column="total"),
    @Result(property="uid",column="uid"),
 @Result(property="user",javaType=User.class,column="id",one=@One(selec"namepsace.id",fetchType=FetchType.EAGER))
})

//一对多
@Result(property="orderList",javaType=List.class,column="uid",many=@Many(select="com.lagou.mapper.OrderMapper.findById"))

注解开启二级缓存

@CacheNameSpace
interface UserMapper

相关文章

网友评论

      本文标题:SSM Mybatis

      本文链接:https://www.haomeiwen.com/subject/hnexektx.html