MyBatis框架学习整理PART 1

1.什么是MyBatis?

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录.

也称之为一个ORM(实体关系模型)框架,把数据库中的数据映射成程序中的实体,把程序中的实体映射成数据库中的数据。


2.步骤:

1. 导入MyBatis所需的Jar包,目前最新版本是3.4.4 ,上课所用的版本是3.2.8.建议大家不要去用最新版本,用以前一些旧的,比较成熟稳定的版本。而且以的我们的项目中所涉及到的框架比较的多,有时候会出现版本不兼容的情况。

2. 配置主配置文件:文件名建议用:mybatis-config.xml。

配置数据访问接口映射文件。文件名要与数据访问接口名一致。


3.主配置文件代码


<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 外部属性文件导入,属性文件中通常配置数据库的连接信息  -->
<properties resource="config/conf.properties" />
<!-- <property name="driver" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value="" /> -->
<!-- 给每一个实体类去一个别名,建议别名和类名相同 -->
<typeAliases>
<!-- <typeAlias type="com.etc.dao" alias="User" /> -->
<!-- 把设定的包的类全部自动创建别名:创建的命名规则是:别名与类名相同 -->
<package name="com.etc.entity"/>
</typeAliases>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<!-- 定义开发环境 -->
<environment id="development">
<!-- 事务JDBC:由应用程序来管理事务,Managed:由系统来管理事务 -->
<transactionManager type="JDBC" />
<!-- 数据源类型是POOLED:表示使用连接池   UNPOOLED:表示不使用连接池 NDI在容器中来配置连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
<!-- 定义测试环境 -->
<environment id="test">
<!-- 事务JDBC:由应用程序来管理事务,Managed:由系统来管理事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源类型是POOLED:表示使用连接池   UNPOOLED:表示不使用连接池 NDI在容器中来配置连接池 -->
<dataSource type="POOLED">
<!-- config/conf.properties 属性文件中取连接数据库的信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
<!-- 定义运行环境 -->
<environment id="run">
<!-- 事务JDBC:由应用程序来管理事务,Managed:由系统来管理事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源类型是POOLED:表示使用连接池   UNPOOLED:表示不使用连接池 NDI在容器中来配置连接池 -->
<dataSource type="POOLED">
<!-- config/conf.properties 属性文件中取连接数据库的信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 映射数据访问接口的配置文件:注意,配置文件名与接口名要一致 -->
<mappers>
<!-- class:设置类名,url:引用某个路径下的接口文件 resource:直接指向映射文件  三种做法都不可取 -->
<!-- <mapper resource="/com/etc/dao/GradeDao.xml" /> -->
<!-- 把这个包中的所有映射文件全部进行扫描,注意:文件名一定要与接口名相同 -->
<package name="com.etc.dao"/>
</mappers>
</configuration>


4.映射文件配置


<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper  
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="com.etc.dao.SubjectDao">
  <resultMap type="Subject" id="subjectResult">
  <id column="subjectNo" property="subjectNo"/>
  <result column="subjectName" property="subjectName"/>
  <result column="classHour" property="classHour"/>
  <association property="grade" column="gradeId" select="com.etc.dao.GradeDao.findById">
  </association>  
  </resultMap>
<select id="find" resultMap="subjectResult">
select * from subject
</select>  
  <select id="search" resultMap="subjectResult" parameterType="Map">
  select *from subject where 1=1
  <!-- 动态SQL if test条件 -->
  <if test="name!=null">
  and subjectName like #{name}
  </if>
  <if test="hour!=null">
  and classHour &gt;=#{hour}
  </if>
  </select>
  <select id="search1" resultMap="subjectResult" parameterType="Map">
  select *from subject 
  <where><!-- 自动加上where 去掉第一个and -->
  <!-- 动态SQL if test条件 -->
  <if test="name!=null">
  and subjectName like #{name}
  </if>
  <if test="hour!=null">
  and classHour &gt;=#{hour}
  </if>
  </where>
  </select>
  <select id="searchOrder" resultMap="subjectResult" parameterType="Map">
  select * from subject
  <choose>
  <when test="name!=null">
  order by subjectName
  </when>
  <when test="hour!=null">
  order by classHour
  </when>
  <otherwise>
  order by subjectNo 
  </otherwise>
 
  </choose>
  </select>
  <select id="search2" resultMap="subjectResult" parameterType="Map">
  select * from subject  where subjectNo in
<!-- collection:集合对象 item:迭代出的值 separator:分隔符号 open:开始 close:关闭 -->
<foreach collection="list" item="id" separator=","
   open="(" close=")">
     #{id}
</foreach>    
<!-- select * from subject where subjectNo in (2,5,4)  -->
</select>
  </mapper>


5.API,工厂的创建


package com.etc.util;


import java.io.IOException;
import java.io.InputStream;


import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//辅助类,创建SqlSession对象
public class SqlSessionFactoryUtil {
//读取MyBatis的主配置文件,形成一个文件流,注意:只需要读取一次文件就可以了
static SqlSessionFactory factory=null;
static InputStream is=null;
static{//用一个静态块读取主配置文件,获取返回的文件流。静态块在编译时就初始化
try {
is = Resources.getResourceAsStream("config/mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
//采用单例模式来保证工厂创建唯一
//这是懒汉式
public static SqlSessionFactory getSqlSessionFactory(){
if(factory==null){
//创建SqlSessionFactory工厂
factory =new SqlSessionFactoryBuilder().build(is);
}
return factory;
}
//获取SqlSession对象
public static SqlSession getSqlSession(){
return getSqlSessionFactory().openSession();
}

}


6.增删改

步骤:

1. 创建映射文件中对应的指令节点 ,并编写SQL语句

2. 执行指令,并必须提交事务.

3. 关闭SqlSession对象。


session=SqlSessionFactoryUtil.getSqlSession();
GradeDao dao=session.getMapper(GradeDao.class);
result=dao.add(grade);
session.commit();

return result;


7.查询

注意:查询不需要提交事务。

1. 创建映射文件中对应的指令节点,并编写SQL语句

2. 配置返回结果集resultMap

3. 关闭SqlSession对象。

增加:

获取主键的方法一:

<!-- parameterType:表示传入的类型  #{}:表示占位符 ? -->

<insert id="add" parameterType="Grade">

<!-- last_insert_id() 系统中的函数,能够获取最后产生的自动增长值 AFTER:表示执行之后再获取 -->

     <selectKeykeyProperty="id" resultType="int"order="AFTER">

         select last_insert_id()

     </selectKey>

  insert into gradevalues(null,#{gradeName})

</insert>

获取主键的方法二:

<!-- parameterType:表示传入的类型  #{}:表示占位符 ? -->

<insert id="add" parameterType="Grade"useGeneratedKeys="true" keyProperty="id">        

       insert into grade values(null,#{gradeName})

</insert>

SqlSession 自身也提供了数据操作方法:因为有类型转换问题及命名冲突的问题,所有不推荐使用,建议用映射文件数据访问接口来进行操作

Insert  增加

Update  修改

Delete  删除

selectOne  查询一个对象

selectList 查询多个对象

示例:

session.selectList("com.etc.dao.GradeDao.find");

参数1:保证Id的值的唯一性,如何不唯一,则一定要用全限定名。


8.分页查询

方法有两种,

1. MyBatis 自带的分页类: WorBounds,利用对象来实现分页功能,在查询时把这个类的对象作为参数传入,实现分页功能,但是这种方法性能上不是很好,如果表中的数据量大则不推荐使用。数据量少还是可用的。分页的机制是:把数据全部取出来之后 ,再进行分页。

    //创建分页对象  参数1: 记录数的起始行,参数2:抓取记录数。

   RowBounds rb = new RowBounds(0,3);

   //带分页查询

  returnsession.selectList("com.etc.dao.GradeDao.find",null,rb);

2. 基于SQL语句来实现分页  //parameterType=”Map”表示传入参数是一个Map对象   (&lt;=#{gid} 是<=的意思)

     1. 配置文件 

<selectid="find" resultMap="gradeMap" parameterType="Map">

          select * from grade where id &lt;=#{gid} limit #{pageindex},#{pageSize}       

</select>

     2. 查询方法的封装。

         //查询条件及分页数据的封装,封装成一个Map对象,并把Map对象传入映射文件中

          int pageindex =1;   //当前页

          int pageSize = 3;    //每页大小

         Map<String,Object> map = newHashMap<String,Object>();

         map.put("pageindex",(pageindex-1)*pageSize);   //计算需要跳过多少条数据

          map.put("pageSize",pageSize);

 map.put("gid",5);         

         GradeDao dao =session.getMapper(GradeDao.class);

         return dao.find(map);  //调用方法取查询出来的分页数据。

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值