mybatis注解式的增删改查、一对多、多对一、多对多

版权声明:原创文章,转载请说明出处 https://blog.csdn.net/Destiny_strive/article/details/82716217

目录

一、项目数据库表和数据的截图。

二、maven项目所需依赖。

三、mybatis配置文件。

四、增删改查。

五、一对多

六、多对一

七、多对多

八、所有测试的一个总体的测试类:

九、项目主体结构图:


 

一、项目数据库表和数据的截图。

也可自己录入数据,测试关联查询和增删改查。

二、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());
                }
            }
        }

    }


}

九、项目主体结构图:

猜你喜欢

转载自blog.csdn.net/Destiny_strive/article/details/82716217