這篇文章帶給大家的內容是關於Mybatis映射檔的詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
MyBatis真正的核心是在映射文件,由於它的異常強大,如果拿它和相同功能的JDBC程式碼相比,你會發現它省掉了將近95%的程式碼。
MyBatis實體類別映射檔案
MyBatis有幾個頂級元素
select:映射查詢語句
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee"> select * from tal_employee </select>
insert:映射插入語句
使用#{參數屬性名稱}賦值
<insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee"> insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert>
:映射修改語句
<update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee"> update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id} </update>
:映射刪除語句
<delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete>
:可以被其它sql語句重用的sql語句。
:是最複雜也是最強大的元素,用來和資料庫表和實體類別進行映射。
<resultMap type="com.simple.mybatis.entitys.Employee" id="Employee"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/></resultMap><!-- 返回外部resultMap格式的类型。--> <select id="findAll" resultMap="Employee"> select id,last_name AS lastName,email,gender from tal_employee </select>
:給定命名空間的快取配置。
:其它命名空間快取配置的參考。
我們結合第一章,使用先前與資料庫互交的方式:
sqlSession.selectList("命名空间.select标签ID"); sqlSession.selectOne("命名空间.select标签ID"); sqlSession.update("命名空间.update标签ID", "Object类型参数"); sqlSession.delete("命名空间.delete标签ID", "Object类型参数"); sqlSession.insert("命名空间.insert标签ID", "Object类型参数");
增刪改必須提交交易:sqlSession.commit();
##使用XML映射檔案方式來執行方法時,由於是透過字串方式來呼叫方法,對類型的約束也不是強制性的,可讀性較差,這是早期ibatis的呼叫方式。除此之外Mybatis也提供另外兩種實作方式MyBatis註解方式1、@Select:用來修飾使用查詢語句的方法2、@Insert :用來修飾使用增加語句的方法、3、@Update:用來修飾使用修改修改的方法。 4、@Delete:用來修飾使用刪除語句的方法。 public interface EmployeeAnnotation {@Select("select id,last_name AS lastName,email,gender from tal_employee")
List
#
@Insert("insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})") int saveEmp(Employee employee); @Update("update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}") boolean updateEmp(Employee employee); @Delete("elete from tal_employee where id=#{id}") long deleteEmp(Integer id); }然後我們需要在mybatis主設定檔中映射這個註解介面
<!-- 映射注解类 --> <mapper class="com.simple.mybatis.dao.EmployeeAnnotation"/> @Test public void testAnnotation(){ SqlSession session = sqlSessionFactory.openSession(); EmployeeAnnotation employeeAnnotation = session.getMapper(EmployeeAnnotation.class); Employee employee = new Employee("测试注解增加", "email", "男"); employeeAnnotation.saveEmp(employee); //提交事务 session.commit(); session.close(); }使用註解雖然更方便,但是配置複雜sql語句時較為複雜。所以很多時候採用兩種結合的方式。 Mybatis介面程式設計我們先新增一個介面
public interface EmployeeMapper { List<Employee> findAll(); int saveEmp(Employee employee); boolean updateEmp(Employee employee); long deleteEmp(Integer id); }實體類別對映檔案命名空間(namespace)必須對應介面全名,裡面的方法需要對應裡面增刪改查標籤ID完成綁定
<?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.simple.mybatis.dao.EmployeeMapper"> <resultMap type="com.simple.mybatis.entitys.Employee" id="Employee"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> </resultMap> <!-- 返回外部resultMap格式的类型。--> <select id="findAll" resultMap="Employee"> select id,last_name AS lastName,email,gender from tal_employee </select> <insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee"> insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert> <update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee"> update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id} </update> <delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete> </mapper>並且必須在MyBatis主設定檔中載入這個映射檔
<mappers> <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" /> </mappers>使用方式:
@Test public void test4(){ SqlSession session = sqlSessionFactory.openSession(); //获取接口。这个接口mybatis会帮我创建代理实现类完成接口与XML映射的绑定 EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); employeeMapper.deleteEmp(1); session.commit(); session.close(); }取得插入後的自動增長主鍵useGeneratedKeys參數只針對insert 語句生效,預設為false。設定為 true 時,表示如果插入的表以自增列為主鍵,則允許 JDBC 支援自動產生主鍵,並可將自動產生的主鍵傳回。 keyProperty是要封裝給parameterType="com.simple.mybatis.entitys.Employee中的主鍵ID屬性名稱
<insert id="saveEmpGetKey" parameterType="com.simple.mybatis.entitys.Employee" useGeneratedKeys="true" keyProperty="id" > insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert> @Test public void saveEmpGetKey(){ SqlSession session = sqlSessionFactory.openSession(); EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); Employee employee = new Employee("自动封装主键", "email", "男");//增加之前主键没赋值 employeeMapper.saveEmpGetKey(employee); session.commit();//提交事务 System.out.println("增加后主键有值: " + employee.getId()); session.close();//关闭资源 }Mybatis參數規則一個參數時:#直接使用#{xxx}來存取參數即可。參數名稱任意。例如#{a},#{b}都可以存取參數值。如果是集合(Collection,List,Set)類型,使用集合名稱小寫為key值。必須介面方法:
long deleteEmp(Integer emp);映射檔:
<delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete>在這裡可以看到我們是沒有給這個賦值的,#{id}我這個屬性名稱也不叫id而是emp。所以一個參數是名字可以任意如果是傳入的集合類型傳入Map參數時取值:
//接口有方法:long deleteEmp(Map<String, Object> map); <delete id="deleteEmp" parameterType="Map"> delete from tal_employee where id=#{empID} </delete>我們這裡取值是empID,這想想都知道創建一個map.put(“empID”,1)作為參數傳入方法調用就行了多個參數時:
- 預設:就不能使用#{xxx}來存取參數了。當有多個參數時,mybatis會將參數封裝為一個map集合,只能透過#{下標}或#{paramN}的方式來取得值。
- 命名參數:明確指定封裝參數時手動指定map的key。透過在介面方法上新增@Param("key")來指定參數名稱。
- 實體類別:如果多個參數是封裝好的業務類,那麼直接傳入業務物件即可。可以透過#{屬性名稱}取得屬性即可。Map:如果多個參數不是已封裝的業務類,那麼傳入map集合即可。透過#{key}取得對應的value值。
##MyBatis中,除了可以使用#{}來取得參數的值意外,也可以使用${}來取得參數的值。
區別:#{}:會以預先編譯的方式,將參數產生到sql語句中。$ {}:會直接將值產生到sql語句。
大多數情況下,我們都是以#{}來取得參數,但是有些地方不支援佔位符的地方那麼就可以使用${ }來取得參數,例如表名。
resultType傳回型別
- #對於增刪改的方法,Mybatis會自動對結果進行封裝,傳回int,Boolean,long都可以。
- 對於傳回實體物件和List集合,resultType可以設定為實體類型。
- 如果傳回單一對象,也可以封裝為Map
- 如果傳回Map集合對象,例如Map
ResultMap标签介绍
ResultMap的常用子标签
id:映射主键。result:映射普通列。
association:复杂结果映射。
collection:复杂类型的集合映射。
constructor:构造函数注入。
前面我们的案例我们数据库的字段与实体类的属性基本上一致,或者不一致使用取别名方案解决,可是每条语句都去取别名是非常麻烦的,ResultMap这个标签就很好的解决数据库与实体类字段不对应的问题
我们新创建一个部门表:
CREATE TABLE tal_dept( d_id INT PRIMARY KEY AUTO_INCREMENT, d_name VARCHAR(50) );
对应实体类:
public class Dept { private Integer id; private Integer name; }
如果我们查询语句直接使用resultType="com.simple.mybatis.entitys.Dept那么毫无疑问我们的实体类中名字不对应是赋值为null的,我们可以ResultMap映射实体类与数据库的对应关系
<!--配置返回结果,配置数据库字段与类属性的映射--> <resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> </resultMap> <!--使用resultMap使用指向上面返回结果的ID--> <select id="getDeptOne" parameterType="Integer" resultMap="DeptResult"> select * from tal_dept where d_id = #{id} </select>
关系映射
在数据库中,许多数据是分布在多个表中的,有时候需要将多个表的数据关联起来进行查询。那么在ORM框架中,我们需要处理数据表的映射关系。
常见的映射关系:
关联属性映射association
映射collection映射
result方式映射属性
这种方式并不推荐,没有什么重用性
<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> <!-- 指定Employee中Dept对象属性 --> <result property="dept.id" column="d_id"/> <result property="dept.name" column="d_name"/> </resultMap> <select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept"> select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id </select>
association映射(分步查询)
多对一,查询员工获取员工中的部门:
<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> <!-- property指定实体类中对象dept 指定发过去的参数column="d_id" select指定com.simple.mybatis.dao.DeptMapper映射文件中getDeptOne查询方法 --> <association property="dept" column="d_id" select="com.simple.mybatis.dao.DeptMapper.getDeptOne"></association> </resultMap> <!--resultMap指定使用上面定义的返回结果--> <select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept"> select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id </select>
Collection查询
一对多,获取部门同时部门中员工也获取:
<!--部门映射--> <resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> <!--property指定Dept中集合属性名 ofType指定集合中属性类型 --> <collection property="Employees" ofType="com.simple.mybatis.entitys.Employee" > <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> </collection> </resultMap> <select id="getDeptAll" resultMap="DeptResult"> select * from tal_dept d left join tal_Employee e on d.d_id = e.d_id </select>
Collection嵌套查询
一对多分布查询
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptOrEmployee"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> <!--select指定com.simple.mybatis.dao.EmployeeMapper映射文件中的getEmployeeByDeptId--> <collection property="Employees" column="d_id" ofType="com.simple.mybatis.entitys.Employee" select="com.simple.mybatis.dao.EmployeeMapper.getEmployeeByDeptId"> </collection> </resultMap> <!--com.simple.mybatis.dao.EmployeeMapperXML中方法--> <select id="getEmployeeByDeptId" parameterType="Integer" resultType="com.simple.mybatis.entitys.Employee"> select * from tal_employee where d_id = #{id} </select>
关联查询和分步查询的区别:
关联查询一次将多个表的数据查询出来,分步查询通过多次查询获取查询结果。
配置文件不同,关联查询需要定义额外的映射,分步查询需要定义外键列,和查询的select方法。
关联查询不支持延迟加载,分步查询支持延迟加载。fetchType="lazy"
延迟加载
刚才分布查询是一次将结果查询出来,为了提高效率,mybatis还支持延迟加载技术,等需要用到对象时才进行查询。
在mybatis主配置文件中配置:
<!– 通过全局配置文件设置延迟加载--> <settings> <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
设置级联延迟加载
<!– 设置延迟加载属性--> <association fetchType="lazy"/>
以上是Mybatis映射檔的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

缓存的概述和分类概述缓存就是一块内存空间.保存临时数据为什么使用缓存将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取的时候,直接从缓存中获取,可以减少和数据库交互的次数,这样可以提升程序的性能!缓存的适用情况适用于缓存的:经常查询但不经常修改的(eg:省市,类别数据),数据的正确与否对最终结果影响不大的不适用缓存的:经常改变的数据,敏感数据(例如:股市的牌价,银行的汇率,银行卡里面的钱)等等MyBatis缓存类别一级缓存:它是sqlSession对象的缓存,自带的(不需要配置)不

mybatis分页的方式:1、借助数组进行分页,首先查询出全部数据,然后再list中截取需要的部分。2、借助Sql语句进行分页,在sql语句后面添加limit分页语句即可。3、利用拦截器分页,通过拦截器给sql语句末尾加上limit语句来分页查询。4、利用RowBounds实现分页,需要一次获取所有符合条件的数据,然后在内存中对大数据进行操作即可实现分页效果。

MyBatis允许使用插件来拦截的方法Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)ParameterHandler(getParameterObject,setParameters)ResultSetHandler(handleResultSets,handleOutputParameters)StatementHandler(prepare,parameterize,ba

背景实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需。使用场景可以用于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;设计思路递归模型即根节点、枝干节点、叶子节点,数据模型如下:idcodenameparent_code110000电脑0220000手机0310001联想笔记本10000410002惠普笔记本1000051000101联想拯救者1000161000102联想小新系列10001实现代码表结构CREATETABLE`

当某些sql因为不知名原因堵塞时,为了不影响后台服务运行,想要给sql增加执行时间限制,超时后就抛异常,保证后台线程不会因为sql堵塞而堵塞。一、yml全局配置单数据源可以,多数据源时会失效二、java配置类配置成功抛出超时异常。importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;importorg.apache.

简介今天开发时想将自己写好的代码拿来优化,因为不想在开发服弄,怕搞坏了到时候GIT到生产服一大堆问题,然后把它分离到我轮子(工具)项目上,最后运行后发现我获取List的时候很卡至少10秒,我惊了平时也就我的正常版本是800ms左右(不要看它很久,因为数据量很大,也很正常。),前提是我也知道很慢,就等的确需要优化时,我在放出我优化的plus版本,回到10秒哪里,最开始我刚刚接到这个app项目时,在我用PageHelper.startPage(page,num);(分页),还没等查到的数据封装(Pa

一、什么是缓存缓存是内存当中一块存储数据的区域,目的是提高查询效率。MyBatis会将查询结果存储在缓存当中,当下次执行相同的SQL时不访问数据库,而是直接从缓存中获取结果,从而减少服务器的压力。什么是缓存?存在于内存中的一块数据。缓存有什么作用?减少程序和数据库的交互,提高查询效率,降低服务器和数据库的压力。什么样的数据使用缓存?经常查询但不常改变的,改变后对结果影响不大的数据。MyBatis缓存分为哪几类?一级缓存和二级缓存如何判断两次Sql是相同的?查询的Sql语句相同传递的参数值相同对结

一、思路将分页所需的内容都放到一个实体类中分页数据所需要的实体类!内包含页码,页大小,总条数,总页数,起始行pagehelpr提供了这个类pageInfo,不需要我们自己创建二、主要逻辑select*from表名limit起始行,展示几条数据#第n页每页展示五条数据select*from表名limit(n-1)*5,5#每页展示多少条pageSize3#总共有多少条totalselectcount(*)from表名#总页数pagespages=total%pagesSize==0?total/p


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器