1.新建数据库
CREATE TABLE category_ ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name varchar(32) DEFAULT NULL ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO category_ VALUES (null,'category1'); INSERT INTO category_ VALUES (null,'category2'); create table product_( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, name varchar(30) DEFAULT NULL, price float DEFAULT 0, cid int ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO product_ VALUES (1,'product a', 88.88, 1); INSERT INTO product_ VALUES (2,'product b', 88.88, 1); INSERT INTO product_ VALUES (3,'product c', 88.88, 1); INSERT INTO product_ VALUES (4,'product x', 88.88, 2); INSERT INTO product_ VALUES (5,'product y', 88.88, 2); INSERT INTO product_ VALUES (6,'product z', 88.88, 2);
2.新建lib,添加jar包,新建为库,新建mybatis的配置文件mybatis-config.xml
3.新建实体类:产品 Product,分类 Category
package com.how2java.pojo; /**产品 * @author lenovo */ public class Product { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Product [id=" + id + ", name=" + name + ", price=" + price + "]"; } }
package com.how2java.pojo; import java.util.List; /** * 分类 * @author lenovo */ public class Category { private int id; private String name; List<Product> products; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this.products = products; } @Override public String toString() { return "Category [id=" + id + ", name=" + name + "]"; } }
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.how2java.pojo"> <insert id="addCategory" parameterType="Category" > insert into mybatis.category_ ( name ) values (#{name}) </insert> <delete id="deleteCategory" parameterType="Category" > delete from mybatis.category_ where id= #{id} </delete> <select id="getCategory" parameterType="_int" resultType="Category"> select * from mybatis.category_ where id= #{id} </select> <update id="updateCategory" parameterType="Category" > update category_ set name=#{name} where id=#{id} </update> <select id="listCategory" resultType="Category"> select * from mybatis.category_ </select> </mapper>
5.配置实体类的接口 CategoryMapper ,ProductMapper
package com.how2java.mapper; import java.util.List; import org.apache.ibatis.annotations.Many; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import com.how2java.pojo.Category; public interface CategoryMapper { @Select(" select * from category_ ") @Results({@Result(property = "products", javaType = List.class, column = "id", many = @Many(select = "com.how2java.mapper.ProductMapper.listByCategory"))}) public List<Category> list(); }
package com.how2java.mapper; import java.util.List; import org.apache.ibatis.annotations.Select; import com.how2java.pojo.Product; public interface ProductMapper { @Select(" select * from product_ where cid = #{cid}") public List<Product> listByCategory(int cid); }
6.创建测试类
package com.how2java; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.how2java.mapper.CategoryMapper; import com.how2java.pojo.Category; import com.how2java.pojo.Product; /** * 延迟加载 * @author lenovo */ public class TestMybatis { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); CategoryMapper mapper = session.getMapper(CategoryMapper.class); List<Category> cs = mapper.list(); for (Category c : cs) { System.out.println(c.getName()); List<Product> ps = c.getProducts(); for (Product p : ps) { System.out.println("\t"+p.getName()); } } session.commit(); session.close(); } }
7.运行结果:
DEBUG [main] - ==> Preparing: select * from category_
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Columns: id, name
TRACE [main] - <== Row: 1, category1
DEBUG [main] - ====> Preparing: select * from product_ where cid = ?
DEBUG [main] - ====> Parameters: 1(Integer)
TRACE [main] - <==== Columns: id, name, price, cid
TRACE [main] - <==== Row: 1, product a, 88.88, 1
TRACE [main] - <==== Row: 2, product b, 88.88, 1
TRACE [main] - <==== Row: 3, product c, 88.88, 1
DEBUG [main] - <==== Total: 3
TRACE [main] - <== Row: 2, category2
DEBUG [main] - ====> Preparing: select * from product_ where cid = ?
DEBUG [main] - ====> Parameters: 2(Integer)
TRACE [main] - <==== Columns: id, name, price, cid
TRACE [main] - <==== Row: 4, product x, 88.88, 2
TRACE [main] - <==== Row: 5, product y, 88.88, 2
TRACE [main] - <==== Row: 6, product z, 88.88, 2
DEBUG [main] - <==== Total: 3
DEBUG [main] - <== Total: 2
category1
product a
product b
product c
category2
product x
product y
product z
7.2运行结果:
package com.how2java; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.how2java.mapper.CategoryMapper; import com.how2java.pojo.Category; import com.how2java.pojo.Product; /** * 延迟加载 * @author lenovo */ public class TestMybatis { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); CategoryMapper mapper = session.getMapper(CategoryMapper.class); List<Category> cs = mapper.list(); for (Category c : cs) { System.out.println(c.getName()); // List<Product> ps = c.getProducts(); // for (Product p : ps) { // System.out.println("\t"+p.getName()); // } } session.commit(); session.close(); } }
只获取分类,不获取产品,执行后发现,获取产品的SQL语句也执行了
DEBUG [main] - ==> Preparing: select * from category_
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Columns: id, name
TRACE [main] - <== Row: 1, category1
DEBUG [main] - ====> Preparing: select * from product_ where cid = ?
DEBUG [main] - ====> Parameters: 1(Integer)
TRACE [main] - <==== Columns: id, name, price, cid
TRACE [main] - <==== Row: 1, product a, 88.88, 1
TRACE [main] - <==== Row: 2, product b, 88.88, 1
TRACE [main] - <==== Row: 3, product c, 88.88, 1
DEBUG [main] - <==== Total: 3
TRACE [main] - <== Row: 2, category2
DEBUG [main] - ====> Preparing: select * from product_ where cid = ?
DEBUG [main] - ====> Parameters: 2(Integer)
TRACE [main] - <==== Columns: id, name, price, cid
TRACE [main] - <==== Row: 4, product x, 88.88, 2
TRACE [main] - <==== Row: 5, product y, 88.88, 2
TRACE [main] - <==== Row: 6, product z, 88.88, 2
DEBUG [main] - <==== Total: 3
DEBUG [main] - <== Total: 2
category1
category2