一对多映射
<h1><center>一对多映射</center></h1>
<p>在 POJO 中配置一对多映射</p>
<pre><code class="language-java">@Table("t_master")
public class Master extends Pojo {
@Many(field = "masterId")
// 1.r.59之前需要写target参数
// @Many(target = Pet.class, field = "masterId")
private List<Pet> pets;
public List<Pet> getPets() {
return pets;
}
public void setPets(List<Pet> pets) {
this.pets = pets;
}
}</code></pre>
<h2>插入操作</h2>
<p>如果你已经实现准备好了这样的对象:</p>
<pre><code class="language-java">Master master = new Master();
master.setName("Peter");
List<Pet> pets = new ArrayList<Pet>();
pets.add(new Pet("XiaoBai"));
pets.add(new Pet("XiaoHei"));
master.setPets(pets);
dao.insertWith(master, "pets");</code></pre>
<p>Nutz.Dao 会根据正则表达式 "pets" 寻找可以被匹配上的映射字段(只要声明了 @One, @Many, @ManyMany 任何一个注解,都是映射字段) 并根据注解具体的配置信息,执行相应的 SQL。比如上面的操作,会实际上:</p>
<pre><code class="language-sql">执行 SQL : INSERT INTO t_master (name) VALUES("Peter");
执行 SQL 获取 最大值: SELECT MAX(id) FROM t_master // 假设返回的值是 29
将该最大值 29 赋给 master 对象的主键 id
循环 master.pets,将该最大值 29 赋给每一个 pet 对象的 pet.masterId 字段
执行 SQL : INSERT INTO t_pet (name,masterId) VALUES("XiaoBai",29)
执行 SQL : INSERT INTO t_pet (name,masterId) VALUES("XiaoHei",29)</code></pre>
<p>当然,你要想选择仅仅只插入映射字段的话,你可以:</p>
<pre><code class="language-java">dao.insertLinks(master,"pets");</code></pre>
<p>那么上述操作实际上会执行:</p>
<p>循环 master.pets,将该master.id (主键) 赋给每一个 pet 对象的 pet.masterId 字段,我们假设该值为 29</p>
<pre><code class="language-java">执行 SQL : INSERT INTO t_pet (name,masterId) VALUES("XiaoBai",29)
执行 SQL : INSERT INTO t_pet (name,masterId) VALUES("XiaoHei",29)</code></pre>
<p>看,并不会插入 master 对象。</p>
<h2>获取操作</h2>
<p>仅仅获取映射对象:</p>
<pre><code class="language-java">Master master = dao.fetch(Master.class, "Peter");
dao.fetchLinks(master, "pets");</code></pre>
<p>或者</p>
<pre><code> List<Master> masters = dao.queryByJoin(Master.class, "pets",Cnd.NEW().and("name","=","Peter"));</code></pre>
<p>queryByJoin框架会自动 生成SQL left join
这会执行操作:</p>
<pre><code class="language-sql">执行 SQL: SELECT * FROM t_master WHERE name='Peter'; // 如果 master.id 是 12
执行 SQL: SELECT * FROM t_pet WHERE masterId=12;</code></pre>
<p>但是 Nutz.Dao 没有提供一次获取 master 对象以及 pets 对象的方法,因为,你完全可以把上面的两句话写在一行上:</p>
<pre><code class="language-java">Master master = dao.fetchLinks(dao.fetch(Master.class, "Peter"), "pets");</code></pre>
<p>然后,你可以通过 master.getPets() 得到 Nutz.Dao 为 master.pets 字段设置的值。</p>
<h2>更新操作</h2>
<p>同时更新 pet 和 master</p>
<pre><code class="language-java">dao.updateWith(master, "pets");</code></pre>
<p>这会执行</p>
<p>执行SQL: UPDATE t_master ....
循环 master.pets 并依次执行SQL: UPDATE t_pet ...
仅仅更新 pets</p>
<pre><code class="language-java">dao.updateLinks(master, "pets");</code></pre>
<p>这会执行</p>
<p>循环 master.pets 并依次执行SQL: UPDATE t_pet ...</p>
<h2>删除操作</h2>
<p>同时删除 master 和 pets</p>
<pre><code class="language-java">dao.deleteWith(master, "pets");</code></pre>
<p>仅仅删除 pets</p>
<pre><code class="language-java">dao.deleteLinks(master, "pets");</code></pre>
<p>清除 pets</p>
<pre><code class="language-java">dao.clearLinks(master, "pets");</code></pre>
<p>清除同删除的区别在于,清除只会执行一条 SQL 删除一批映射对象,而且删除会逐个调用 dao.delete 来删除对象</p>
<p>详细文档 :<a href="https://nutzam.com/core/dao/links_many.html">https://nutzam.com/core/dao/links_many.html</a></p>