NutzSite

Java快速开发框架


一对多映射

<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&lt;Pet&gt; pets; public List&lt;Pet&gt; getPets() { return pets; } public void setPets(List&lt;Pet&gt; pets) { this.pets = pets; } }</code></pre> <h2>插入操作</h2> <p>如果你已经实现准备好了这样的对象:</p> <pre><code class="language-java">Master master = new Master(); master.setName("Peter"); List&lt;Pet&gt; pets = new ArrayList&lt;Pet&gt;(); pets.add(new Pet("XiaoBai")); pets.add(new Pet("XiaoHei")); master.setPets(pets); dao.insertWith(master, "pets");</code></pre> <p>Nutz.Dao 会根据正则表达式 &quot;pets&quot; 寻找可以被匹配上的映射字段(只要声明了 @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&lt;Master&gt; 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>

页面列表

ITEM_HTML