MyBatis关联查询的实例教程
转载请注明出处:
前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
1.商品订单数据模型
1.1数据模型分析思路
(1)每张表记录的数据内容
分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程。
(2)每张表重要的字段设置
非空字段、外键字段
(3)数据库级别表与表之间的关系
外键关系
(4)表与表之间的业务关系
在分析表与表之间的业务关系时,一定要建立在某个业务意义基础上去分析。
1.2属性模型分析
2.一对一查询
2.1需求
查询订单信息,关联查询下单用户信息。
2.2方法一:resultType
2.2.1sql语句
确定查询的主表:订单表
确定查询的关联表:用户表
关联查询使用内链接?还是外链接?
由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可使用内链接。
SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id
2.2.2创建pojo
将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。
原始Orders.java不能映射全部字段,需要新创建pojo。
创建一个pojo继承包括查询字段较多的pojo类。
2.2.3mapper.xml
<?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"><!--namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离 注意:使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址 --><mapper namespace="joanna.yan.mybatis.mapper.OrdersCustomMapper"><!--查询订单,关联查询用户信息 --><select id="findOrdersUser" resultType="joanna.yan.mybatis.entity.OrdersCustom">SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id</select></mapper>
2.2.4mapper.java
public interface OrdersCustomMapper {//查询订单,关联查询用户信息public List<OrdersCustom> findOrdersUser() throws Exception; }
2.2.5测试程序
@Testpublic void findOrdersUserTest() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class); List<OrdersCustom> list=ordersCustomMapper.findOrdersUser(); System.out.println(list); sqlSession.close(); }
2.3方法二:resultMap
2.3.1sql语句
同resultType实现的sql
2.3.2使用resultMap映射的思路
使用resultMap将查询结果中的订单信息映射到Orders对象中,在Orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。
2.3.3需要orders类中添加user属性
2.3.4mapper.xml
2.3.4.1定义resultMap
<!--订单关联查询用户的resultMap 将整个查询的结果映射到oanna.yan.mybatis.entity.Orders中 --><resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserResultMap"><!-- 1.配置映射的订单信息 --><!-- id:指定查询列中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,配置多个id column:订单信息中的唯一标识列 property:订单信息中的唯一标识列所映射到Orders类中的哪个属性 --><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/><!-- 2.配置映射的关联的用户信息 --><!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders类中的哪个属性 --><association property="user" javaType="joanna.yan.mybatis.entity.User"><!-- 关联查询用户的唯一标识 column:指定唯一标识用户信息的列 property:映射到user的哪个属性 --><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="sex"/></association></resultMap>
2.3.4.2定义statement定义
<!--查询订单,关联查询用户信息,使用ResultMap --><select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id</select>
2.3.4.3mapper.java
public interface OrdersCustomMapper {//查询订单,关联查询用户信息,使用resultMappublic List<Orders> findOrdersUserResultMap() throws Exception; }
2.3.4.4测试程序
@Testpublic void findOrdersUserResultMapTest() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class); List<Orders> list=ordersCustomMapper.findOrdersUserResultMap(); System.out.println(list); sqlSession.close(); }
2.4 resultType和resultMap实现一对一查询小结
实现一对一查询:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求,建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果又特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
3.一对多查询
3.1需求
查询订单及订单明细的信息
3.2sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_idFROM orders, USER, orderdetailWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
3.3分析
使用resultType将上边的查询结果映射到pojo中,订单信息的就会重复。
要求:
对orders的映射不能出现重复记录。
解决:
在Orders.java类中添加List
最终会将订单信息映射到Orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。
3.4在Orders类中添加list订单明细属性
3.5定义resultMap
<!--订单及订单明细的resultMap 使用extends继承,就不需要再配置订单信息和用户信息的映射了 --><resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"><!-- 1.配置映射的订单信息 --><!-- 2.配置映射的关联的用户信息 --><!-- 使用extends继承,就不需要再配置订单信息和用户信息的映射了 --><!-- 3.配置映射的订单明细信息 --><!-- 订单明细信息 一个订单关联查询出了多条明细,要使用collection进行映射 collection:对关联查询到的多条记录映射到集合对象中 property:将关联查询到多条记录映射到joanna.yan.mybatis.entity.Orders中的哪个属性 ofType:指定映射到list集合属性中pojo的类型 --><collection property="orderdetails" ofType="joanna.yan.mybatis.entity.Orderdetail"><!-- id:订单明细的唯一标识 property:要讲订单明细的唯一标识映射到joanna.yan.mybatis.entity.Orderdetail的哪个属性 --><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/></collection></resultMap>
3.6mapper.xml
<!-- 查询订单,关联查询用户及订单明细,使用resultMap --><select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id</select>
3.7mapper.java
public interface OrdersCustomMapper {//查询订单,关联查询用户信息public List<OrdersCustom> findOrdersUser() throws Exception;//查询订单,关联查询用户信息,使用resultMappublic List<Orders> findOrdersUserResultMap() throws Exception;//查询订单(关联用户)及订单明细public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception; }
3.8测试程序
@Testpublic void findOrdersAndOrderDetailResultMapTest() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class); List<Orders> list=ordersCustomMapper.findOrdersAndOrderDetailResultMap(); System.out.println(list); sqlSession.close(); }
3.9小结
mybatis使用resultMap的collection对关联查询的多条记录映射到有个list集合属性中。
使用resultType实现:
将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在ordertails中。
4.多对多查询
4.1需求
查询用户及用户购买的商品信息。
4.2sql语句
查询主表:用户表
关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所有关联表:orders、orderdetail、items。
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price items_priceFROM orders, USER, orderdetail, itemsWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
4.3映射思路
将用户信息映射到user中。
在User类中添加订单列表属性List
在Orders中田间订单明细列表属性List
在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items。
4.4 mapper.xml
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price items_price FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id </select>
4.5定义resultMap
<!-- 查询用户及购买商品 --><resultMap type="joanna.yan.mybatis.entity.User" id="UserAndItemsResultMap"><!-- 1.用户信息 --><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/><!-- 2.订单信息 --><!-- 一个用户对应多个订单,使用collection映射 --><collection property="ordersList" ofType="joanna.yan.mybatis.entity.Orders"><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/><!-- 3.订单明细 --><!-- 一个订单包括多个明细 --><collection property="orderdetails" ofType="joanna.yan.mybatis.entity.Orderdetail"><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/><!-- 4.商品信息 --><!-- 一个订单明细对应一个商品 --><association property="items" javaType="joanna.yan.mybatis.entity.Items"><id column="items_id" property="id"/><result column="items_name" property="name"/><result column="items_detail" property="detail"/><result column="items_price" property="price"/></association></collection></collection></resultMap>
4.6mapper.java
public interface OrdersCustomMapper {//查询订单,关联查询用户信息public List<OrdersCustom> findOrdersUser() throws Exception;//查询订单,关联查询用户信息,使用resultMappublic List<Orders> findOrdersUserResultMap() throws Exception;//查询订单(关联用户)及订单明细public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;//查询用户购买商品信息public List<User> findUserAndItemsResultMap() throws Exception; }
4.7测试程序
@Testpublic void findUserAndItemsResultMapTest() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class); List<User> list=ordersCustomMapper.findUserAndItemsResultMap(); System.out.println(list); sqlSession.close(); }
4.8多对多查询总结
将查询用户购买的商品信息明细清单(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)
针对上面的需求就使用resultType将查询到的记录映射到一个扩展的pojo中,很简单实现明细清单的功能。
一对多是多对多的特例,如下需求:
查询用户购买的商品信息,用户和商品的关系是多对多关系。
需求1:
查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)
企业开发中常见明细列表,用户购买商品明细列表,
使用resultType将上边查询列映射到pojo输出。
需求2:
查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细)
使用resultMap将用户购买的商品明细列表映射到user对象中。
总结:
使用resultMap是针对那些对查询结果映射有特殊要求的功能,比如特殊要求映射成list中包含多个list。
5.resultMap总结
resultType:
作用:将查询结果按照sql列名pojo属性一致性映射到pojo中。
场合:
常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
resultMap:
使用association和collection完成一对一和一对多高级映射(对结果又特殊的映射要求)。
association:
作用:将关联查询信息映射到一个pojo对象中。
场合:
为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
collection:
作用:将关联查询信息映射到一个list集合中。
场合:为了方便擦还行遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样做册目的也是方便对查询结果集进行遍历查询。
如果使用resultType无法将查询结果映射到list集合中。
Atas ialah kandungan terperinci MyBatis关联查询的实例教程. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Tafsiran teg SQL dinamik MyBatis: Penjelasan terperinci tentang penggunaan teg Set MyBatis ialah rangka kerja lapisan kegigihan yang sangat baik Ia menyediakan banyak teg SQL dinamik dan boleh membina pernyataan operasi pangkalan data secara fleksibel. Antaranya, tag Set ialah tag yang digunakan untuk menjana klausa SET dalam kenyataan UPDATE, yang sangat biasa digunakan dalam operasi kemas kini. Artikel ini akan menerangkan secara terperinci penggunaan teg Set dalam MyBatis dan menunjukkan kefungsiannya melalui contoh kod tertentu. Apakah itu Set tag Set tag digunakan dalam MyBati

Pesona Pembelajaran Bahasa C: Membuka Potensi Pengaturcara Dengan perkembangan teknologi yang berterusan, pengaturcaraan komputer telah menjadi satu bidang yang telah menarik perhatian ramai. Di antara banyak bahasa pengaturcaraan, bahasa C sentiasa digemari oleh pengaturcara. Kesederhanaan, kecekapan dan aplikasinya yang luas menjadikan pembelajaran bahasa C sebagai langkah pertama untuk ramai orang memasuki bidang pengaturcaraan. Artikel ini akan membincangkan daya tarikan mempelajari bahasa C dan cara membuka kunci potensi pengaturcara dengan mempelajari bahasa C. Pertama sekali, daya tarikan mempelajari bahasa C terletak pada kesederhanaannya. Berbanding dengan bahasa pengaturcaraan lain, bahasa C

Analisis mekanisme caching MyBatis: Perbezaan dan aplikasi cache peringkat pertama dan cache peringkat kedua Dalam rangka kerja MyBatis, caching ialah ciri yang sangat penting yang boleh meningkatkan prestasi operasi pangkalan data dengan berkesan. Antaranya, cache tahap pertama dan cache tahap kedua adalah dua mekanisme caching yang biasa digunakan dalam MyBatis. Artikel ini akan menganalisis perbezaan dan aplikasi cache peringkat pertama dan cache peringkat kedua secara terperinci, dan memberikan contoh kod khusus untuk digambarkan. 1. Cache Tahap 1 Cache tahap 1 juga dipanggil cache setempat Ia didayakan secara lalai dan tidak boleh dimatikan. Cache tahap pertama ialah SqlSes

Semasa mengedit kandungan teks dalam Word, anda kadangkala perlu memasukkan simbol formula. Sesetengah lelaki tidak tahu cara memasukkan nombor akar dalam Word, jadi Xiaomian meminta saya untuk berkongsi dengan rakan saya tutorial tentang cara memasukkan nombor akar dalam Word. Semoga membantu kawan-kawan. Mula-mula, buka perisian Word pada komputer anda, kemudian buka fail yang ingin anda edit, dan gerakkan kursor ke lokasi yang anda perlukan untuk memasukkan tanda akar, rujuk contoh gambar di bawah. 2. Pilih [Sisipkan], dan kemudian pilih [Formula] dalam simbol. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 3. Kemudian pilih [Insert New Formula] di bawah. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 4. Pilih [Radical], dan kemudian pilih radikal yang sesuai. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah:

Pemain boleh mengumpul bahan yang berbeza untuk membina bangunan apabila bermain di Mistlock Kingdom Ramai pemain ingin tahu sama ada untuk membina bangunan di alam liar Bangunan tidak boleh dibina di dalam Mistlock Kingdom. . Bolehkah bangunan dibina di alam liar di Mistlock Kingdom? 1. Bangunan tidak boleh dibina di kawasan liar Kerajaan Mist Lock. 2. Bangunan mesti dibina dalam skop altar. 3. Pemain boleh meletakkan Spirit Fire Altar dengan sendirinya, tetapi apabila mereka meninggalkan julat, mereka tidak akan dapat membina bangunan. 4. Kita juga boleh terus menggali lubang di gunung sebagai rumah kita, jadi kita tidak perlu menggunakan bahan binaan. 5. Terdapat mekanisme keselesaan dalam bangunan yang dibina oleh pemain sendiri, iaitu, lebih baik dalaman, lebih tinggi keselesaan. 6. Keselesaan yang tinggi akan membawa bonus atribut kepada pemain, seperti

Tajuk: Pelajari fungsi utama dalam bahasa Go dari awal Sebagai bahasa pengaturcaraan yang mudah dan cekap, bahasa Go digemari oleh pembangun. Dalam bahasa Go, fungsi utama ialah fungsi masuk, dan setiap program Go mesti mengandungi fungsi utama sebagai titik masuk program. Artikel ini akan memperkenalkan cara mempelajari fungsi utama dalam bahasa Go dari awal dan memberikan contoh kod khusus. 1. Pertama, kita perlu memasang persekitaran pembangunan bahasa Go. Anda boleh pergi ke laman web rasmi (https://golang.org

MyBatis ialah rangka kerja lapisan ketekunan popular yang menyediakan pemetaan SQL yang mudah dan fungsi operasi pangkalan data, membolehkan pembangun berinteraksi dengan pangkalan data dengan lebih cekap. Dalam proses pembangunan sebenar, kadangkala kita perlu mencetak penyata SQL yang dilaksanakan oleh MyBatis pada konsol dalam masa nyata untuk menyahpepijat dan mengoptimumkan pertanyaan SQL dengan lebih baik. Artikel ini akan memperkenalkan cara merealisasikan pencetakan masa nyata SQL pada konsol dalam MyBatis dan memberikan contoh kod khusus. Pertama, kita perlu menambah My

Panduan Pemasangan PyTorch: Sediakan persekitaran pembangunan dengan pantas dalam PyCharm PyTorch ialah salah satu rangka kerja yang paling popular dalam bidang pembelajaran mendalam semasa Ia mempunyai ciri-ciri kemudahan penggunaan dan fleksibiliti, dan digemari oleh pembangun. Artikel ini akan memperkenalkan cara cepat menyediakan persekitaran pembangunan PyTorch dalam PyCharm, supaya anda boleh memulakan pembangunan projek pembelajaran mendalam. Langkah 1: Pasang PyTorch Mula-mula, kita perlu memasang PyTorch. Pemasangan PyTorch biasanya perlu mengambil kira persekitaran sistem
