版权声明:原创文章,转载请说明出处 https://blog.csdn.net/Destiny_strive/article/details/82716217
目录
一、项目数据库表和数据的截图。
也可自己录入数据,测试关联查询和增删改查。
二、maven项目所需依赖。
<dependencies>
<!--数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
三、mybatis配置文件。
这里扫描得事mapper接口了,不再是xml文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases> <!--设置别名-->
<package name="com.byh.pojo"/>
</typeAliases>
<!--连接数据库-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dbmybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!--扫描mapper文件-->
<mappers>
<mapper class="com.byh.mapper.CategoryMapper"/>
<mapper class="com.byh.mapper.ProductMapper"/>
<mapper class="com.byh.mapper.OrderMapper"/>
<mapper class="com.byh.mapper.OrderItemMapper"/>
</mappers>
</configuration>
四、增删改查。
只需把xml中的sql语句放在方法上就可以了。
@Insert("insert into category ( name ) values (#{name})")
void addCategory(Category category);
@Delete("delete from category where id= #{id}")
void delCategory(Category category);
@Update("update category set name=#{name} where id=#{id}")
void updateCategory(Category category);
@Select("select * from category where id= #{id}")
Category getCategoryById(int id);
五、一对多
查询分类的时候,查询分类下的商品:
1.CategoryMapper接口中:(@Results 通过@Result和@Many中调用ProductMapper.productListByCid()方法相结合,来获取一对多关系)
@Select("select * from category")
@Results({
@Result(column = "id",property = "id"),
@Result(property = "products",javaType = List.class,column = "id",//column = "id":表示拿着category表中的主键id,去查询product表
many = @Many(select = "com.byh.mapper.ProductMapper.productListByCid"))
})
List<Category> listCategory();
2.ProductMapper接口中:(根据分类id获取产品集合)
@Select("select * from product where cid=#{cid}")
List<Product> productListByCid(int cid);
3.测试:最后直接调用listCategory();方法即可查出分类列表,以及每个分类下的所有商品列表。
六、多对一
1.CategoryMapper接口中添加:
@Select("select * from category where id= #{id}")
Category getCategoryById(int id);
2.ProductMapper接口中添加:
@Select("select * from product")
@Results({
@Result(property="category",column="cid",one=@One(select="com.byh.mapper.CategoryMapper.getCategoryById"))
})
List<Product> list();
3.测试:直接调用list();方法即可查询商品列表,以及每个列表所属分类。
七、多对多
1.ProductMapper接口中添加:
@Select("select * from product where id = #{id}")
public Product getProductById(int id);
2.OrderItemMapper接口添加:
//根据oid查询订单下的订单项列表 在根据pid查询对应product
//查询单个商品实体,然后给orderitem实体中的product属性设置值,表示订单项中所属的商品为具体的什么。
@Select(" select * from order_item where oid = #{oid}")
@Results({
@Result(property="product",column="pid",one=@One(select="com.byh.mapper.ProductMapper.getProductById"))
})
List<OrderItem> listByOrder(int oid);
3.OrderMapper接口中添加:给order实体中的orderitems属性设置值,通过order的id调用OrderItemMapper中的方法listByOrder(int oid)完成。这样就是给每个订单关联相关的订单项。
@Select("select * from `order`")
@Results({
@Result(column = "id",property = "id"), //这里的javaType应该是属性的类型
@Result(property = "orderItems",column = "id",javaType = List.class,
many = @Many(select = "com.byh.mapper.OrderItemMapper.listByOrder"))
})
List<Order> orderList();
4.测试:调用orderList();方法即可查看订单列表,以及订单列表下有哪些订单项,订单项中又有哪些商品。
八、所有测试的一个总体的测试类:
import com.byh.mapper.CategoryMapper;
import com.byh.mapper.OrderMapper;
import com.byh.mapper.ProductMapper;
import com.byh.pojo.Category;
import com.byh.pojo.Order;
import com.byh.pojo.OrderItem;
import com.byh.pojo.Product;
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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo1 {
private SqlSession session ;
private CategoryMapper categoryMapper;
private ProductMapper productMapper;
private OrderMapper orderMapper;
@Before
public void bef() throws IOException {
//mybatis的配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建能执行映射文件中sql的sqlSession
session=sqlSessionFactory.openSession();
categoryMapper = session.getMapper(CategoryMapper.class);
productMapper = session.getMapper(ProductMapper.class);
orderMapper = session.getMapper(OrderMapper.class);
}
/**
* 关闭SqlSession的方法
* @param session
*/
public void close(SqlSession session){
session.commit();
session.close();
}
@Test //查询所有
public void findAll() throws IOException {
List<Category> cs=categoryMapper.listCategory();
for (Category c : cs) {
System.out.println(c.getName()+c.getProducts());
}
}
@Test //增加
public void add() throws IOException {
Category c = new Category();
c.setName("我是新增的分类");
categoryMapper.addCategory(c);
findAll();
//提交和关闭,调用自定义方法
close(session);
}
@Test //删除
public void del() throws IOException {
findAll();
System.out.println("------------删除后-----------");
Category c = new Category();
c.setId(5);
categoryMapper.delCategory(c);//这里的5是一个数据库存在的id
findAll();
close(session);
}
@Test //更新
public void update() throws IOException {
findAll();
System.out.println("------------更新后-----------");
Category c = categoryMapper.getCategoryById(2);//查询单个对象
c.setName("分类2被修改了a");
categoryMapper.updateCategory(c);
findAll();
close(session);
}
@Test
public void mToOne(){
List<Product> list = productMapper.list();
for (Product p:list){
System.out.println(p);
}
}
@Test
public void MtoM(){
List<Order> list = orderMapper.orderList();
for (Order o:list){
System.out.println(o.getCode());
List<OrderItem> ois= o.getOrderItems();
if(null!=ois){
for (OrderItem oi : ois) {
System.out.format("%d\t%s\t%f\t%d%n",oi.getId(), oi.getProduct().getName(),oi.getProduct().getPrice(),oi.getNumber());
}
}
}
}
}