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)

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
-
<setting name=“cachEnable value=“true”/>
sqlMapConfig.xml中 -
<cache></cache> userMapper.xml
-
<select useCache=“true”> 当前开启二级缓存
-
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
网友评论