Mybatis小结

Mybatis小结

  1. Mybais优秀的== 持久层== 框架技术,是一个orm体系的技术内容。

  2. 持久层:数据的持久化操作

  3. 框架:软件的半成品(毛坯房)–冗余、扩展 、维护。
    ORM: 对象关系映射

    Class Person{
    Private Dog dog;
    }
    Class Dog{
    }
    Mysql 关系型数据
    通过二维表进行描述,实现一一对应的效果。

Mybatis使用:
(1)可以灵活的切换不同的关系型的数据库
(2)自动的事务管理,sql执行单元(包含了多条sql语句),在主配置文件中添加了事务,不需要在每个操作的方法中重复添加事务,减少代码冗余。事务管理器—>链接对象中途不能够更换。
(3)Mybaits配置的sql是在单独的一个配置文件中,不是在我们代码里面。
Java sql 不能够耦合在一起的,可读性较差。
(4)Namespace sql配置文件中的属性必须出现, 区分多个配置文件中的statement对象
(5)Mapper中映射语句的执行过程

A: select uid,name,uphone from user
结果:
在这里插入图片描述
这些数据被封装成 ResultSet(只能获取我们的结果数据)
ResultSet—> ResultSetMetadata(获取我们每一行的列数,获取列的名称就是java类中的属性名)
在配置文件中描述了结果对应的java类型

resultType="com.offcn.pojo.User"
Class clazz = Class.ForName(“com.offcn.pojo.User”);
Object obj = Clazz.newInstance();
String  FieldName = ResultSetMetadata.getColumnName(int);
Field field = Clazz.getField(FieldName );
field.setAccessible(true);
Field.set(obj,value);

(6)Statement的封装

<select id="selectBlog" resultType="com.offcn.pojo.User">
    select uid,uname,uphone from user     
</select>

Mybatis底层是一个集合map<标记,Statement>

基于接口代理方式

public interface UserMapper {
	
	//声明内容 基于业务的操作
	public List<User> getAllInfo();
	
}
  <select id="getAllInfo" resultType="com.offcn.pojo.User">
        select uid,uname,uphone from user     
  </select>

//基于接口代理的操作(动态代理的设计模式 接口代理对象)

UserMapper mapper = openSession.getMapper(UserMapper.class);
//代理对象调用方法不是接口自身对象调用方法
List<User> list = mapper.getAllInfo();

多参数处理

注意:
我们在sql中去使用我们的方法的参数索引的时候 3.4.1及以下版本使用 0 1
以上版本我们使用 arg0 arg1

我们经常使用的就是:
@Param
Object

#{} ${}区别

#{}: 解析成为占位符 PreparedStatement 预编译
${}: 解析程拼接字符串 Statement 静态sql

Like 模糊查询:

select uid,uname,uphone from user  where uname like "%"#{uname}"%"
select uid,uname,uphone from user  where uname like ‘%${uname}%’
select uid,uname,uphone from user  where uname like
 CONCAT('%',concat(#{uname},'%'))

SELECT * FROM USER WHERE uname LIKE ‘%/%%’ ESCAPE ‘/’
声明一个转义字符: ESCAPE ‘一个字符 我们习惯使用 /’,这个字符后面的近邻这的那个字符内容不被转义。

多表联合查询(业务的考察和模型关系的建立)

<resultMap type="com.offcn.pojo.User" id="newUser">
      <id column="uid" property="uid"></id>
      <result column="uname" property="uname"/>
      <result column="uphone" property="uphone"/>
      <association
       property="car" column="uid" 
      javaType="com.offcn.pojo.Car" 
      select="com.offcn.dao.CarMapper.getCarByCid" 
      ></association>
      <collection 
      property="list" column="uid" 
      ofType="com.offcn.pojo.Orders" 
      select="com.offcn.dao.OrdersMapper.getOrdersByUid"
      ></collection>
  </resultMap>

延迟加载:

<!--按需加载:根据用户的需要去数据库中查询数据。
fetchType="lazy" 
-->

<association
 property="car" column="uid" javaType="com.offcn.pojo.Car" 
select="com.offcn.dao.CarMapper.getCarByCid"
 fetchType="lazy" ></association>
      <collection
       property="list" column="uid" ofType="com.offcn.pojo.Orders" 
      select="com.offcn.dao.OrdersMapper.getOrdersByUid"
       fetchType="lazy"></collection>

动态sql语句

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
if
trim (where, set)
foreach

choose (when, otherwise)

前提提条件:使用的变量名称必须有声明

<if test=”变量名称必须有声明”>
    Sql操作
</if>

  <select id="getLikeInfo" resultType="com.offcn.pojo.User" parameterType="string">
      select uid,uname,uphone from user  
<!--  
如果标新范围内有成立的条件 那么就会解析程where关键字,忽略第一个成立条件前面 and or
如果标新范围内没有成立的条件 where标签自动忽略                    
-->
      <!-- 
      <where>
          <if test="uname!=null and uname.length()>0 or uname.equals('admin')">
                uname = #{uname}
          </if>
          <if test="uphone!=null and uphone.length()>0 or uphone.equals('110')">
                and uphone = #{uphone}
          </if>  
       </where>   
      -->
      
      <trim prefix="where" prefixOverrides="and|or">     
          <if test="uname!=null and uname.length()>0 or uname.equals('admin')">
                uname = #{uname}
          </if>
          <if test="uphone!=null and uphone.length()>0 or uphone.equals('110')">
                and uphone = #{uphone}
          </if>                
      </trim>   
  </select> 
  
  <delete id="batchDelete" parameterType="java.util.List">
        delete from  user 
        <where>
         <if test="array != null">                   
          <foreach collection="array" item="id" open="uid in(" close=")" separator=",">
          </foreach>
         </if>                 
        </where>   
  </delete>

逆向工程的内容使用

/*
		 *  public UserExample() {
              oredCriteria = new ArrayList<Criteria>();  条件对象集合初始化
            }
		 * 
		 * */
		UserExample userExample = new UserExample();
		Criteria cc = userExample.createCriteria();
		cc.andUidEqualTo(2);
		cc.andUnameEqualTo("admin");
		cc.andUphoneEqualTo("10");
		
		
		Criteria ccc = userExample.createCriteria();
		ccc.andUidBetween(45, 1660);
		
		userExample.or(ccc);		
		userExample.setOrderByClause("uname");
		userExample.setDistinct(true);		
		mapper.selectByExample(userExample);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值