(5)MyBatis使用注解开发

1.实现CURD

新建项目HelloMybatis3。基于前面博客的项目HelloMybatis2

1.1.在main.java.mapper下新建接口CategoryMapper

package mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import pojo.Category;

public interface CategoryMapper
{

    @Insert(" insert into category_ ( name ) values (#{name}) ")
    public int add(Category category);

    @Delete(" delete from category_ where id= #{id} ")
    public void delete(int id);

    @Select("select * from category_ where id= #{id} ")
    public Category get(int id);

    @Update("update category_ set name=#{name} where id=#{id} ")
    public int update(Category category);

    @Select(" select * from category_ ")
    public List<Category> list();
}

对比配置文件Category.xml,其实就是把SQL语句从XML挪到了注解上来

1.2.修改mybatis-config.xml

<mappers>
	<!--Category.xml映射可以不保留-->
	<mapper resource="pojo/Category.xml"/>
	<mapper class="mapper.CategoryMapper"/>
</mappers>
  • xml文件用/
  • Java文件·用.

1.3.编写测试类Test1.java

import mapper.CategoryMapper;
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 pojo.Category;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test
{
    /**
     * 增删查改
     * @throws IOException
     */
    @org.junit.Test1
    public void test1() 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);

//        add(mapper);
//        delete(mapper);
//        get(mapper);
//        update(mapper);
        listAll(mapper);

        session.commit();
        session.close();
    }

    private static void add(CategoryMapper mapper) {
        Category c = new Category();
        c.setName("新增加的Category");
        mapper.add(c);
        listAll(mapper);
    }

    private static void update(CategoryMapper mapper) {
        Category c= mapper.get(8);
        c.setName("修改了的新Category名称");
        mapper.update(c);
        listAll(mapper);
    }

    private static void get(CategoryMapper mapper) {
        //传入参数id
        Category c= mapper.get(8);
        System.out.println(c.getName());
    }

    private static void delete(CategoryMapper mapper) {
        //传入参数是id
        mapper.delete(2);
        listAll(mapper);
    }

    private static void listAll(CategoryMapper mapper) {
        List<Category> cs = mapper.list();
        for (Category c : cs) {
            System.out.println(c.getName());
        }
    }
}

2.一对多

2.1.Mybatis注解开发之@Results

当数据库字段名和实体类所对应的属性名字不一致的时候,通过@Results将他们对应起来

  • @Results需要与@Select配合使用
  • 已定义的@Results可以通过@ResultMap来引用,其中value可省略。下面代码list()与list2()功能相同

@Results各个属性的含义:

  • id为当前结果集声明唯一标识,为了复用
  • value值为结果集映射关系,
  • @Result代表一个字段的映射关系,
  • column指定数据库字段的名称,
  • property指定实体类属性的名称,
  • jdbcType数据库字段类型,
  • @Result里的id值为true表明主键,默认false,可以不加;

@many表示一对多关系,@one表示一对一关系,括号内是子查询的路径,不能直接写SQL语句
其实@many与@one源码相同,用哪一个都可以,只是为了增加可读性

@Select(" select * from category_ ")
@Results(id = "ProductMap",value={
	@Result(property = "id", column = "id", id = true),
	@Result(property = "products", javaType = List.class, column = "id", many = @Many(select = "mapper.ProductMapper.listByCategory") )
})
public List<Category> list();

@Select(" select * from category_ ")
@ResultMap(value="ProductMap")
public List<Category> list2();

2.2.新增接口ProductMapper

注解@Select用于根据分类id获取产品集合
@Select(" select * from product_ where cid = #{cid}")

import java.util.List;
import org.apache.ibatis.annotations.Select;
import pojo.Product;

public interface ProductMapper 
{
    @Select(" select * from product_ where cid = #{cid}")
    public List<Product> listByCategory(int cid);
}

2.3.修改CategoryMapper接口

@Select注解获取Category类本身

@Select(" select * from category_ ")

@Results 通过@Result和@Many中调用ProductMapper.listByCategory()方法相结合,来获取一对多关系

@Select(" select * from category_ ")
   @Results({
           @Result(property = "id", column = "id"),
           @Result(property = "products", javaType = List.class, column = "id", many = @Many(select = "mapper.ProductMapper.listByCategory") )
   })
   public List<Category> list();

2.4. 在mybatis-config.xml添加ProductMapper的映射

2.5.编写测试类Test2.java

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import mapper.CategoryMapper;
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 pojo.Category;
import pojo.Product;

public class Test2
{
    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);

        listAll(mapper);

        session.commit();
        session.close();
    }

    private static void listAll(CategoryMapper mapper) {
        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());
            }
        }
    }
}

2.6.输出

category1
	product a
	product b
	product c
category2
	product x
	product y
	product zz

3.多对一

3.1.CategoryMapper接口中提供get方法

@Select("select * from category_ where id= #{id} ")
public Category get(int id);

3.2.ProductMapper接口中提供list方法

//one中写子查询的路径,不能直接写SQL语句
    /*category是Product的属性,cid是数据库列名,one指向通过id得到属性category的方法,
    相当于把表Product中的每个对象product的cid赋给CategoryMapper.get方法,
    再把得到的结果给product的属性category*/
    @Select(" select * from product_ ")
    @Results({
        @Result(property="category",column="cid",one=@One(select="mapper.CategoryMapper.get"))
    })
    public List<Product> list();

3.3.编写测试类Test3.java

import mapper.ProductMapper;
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 pojo.Product;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test3 {
    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();
        ProductMapper mapper = session.getMapper(ProductMapper.class);

        List<Product> ps= mapper.list();
        for (Product p : ps) {
            System.out.println(p + "\t对应的分类是:\t" + p.getCategory().getName());
        }
        session.commit();
        session.close();
    }
}

3.4.输出

Product [id=1, name=product a, price=88.88]	对应的分类是:	category1
Product [id=2, name=product b, price=88.88]	对应的分类是:	category1
Product [id=3, name=product c, price=88.88]	对应的分类是:	category1
Product [id=4, name=product x, price=88.88]	对应的分类是:	category2
Product [id=5, name=product y, price=88.88]	对应的分类是:	category2
Product [id=6, name=product zz, price=99.99]	对应的分类是:	category2

4.多对多

4.1.ProductMapper接口中提供get方法

@Select("select * from product_ where id = #{id}")
public Product get(int id);

4.2.新增OrderItemMapper,提供listByOrder方法。

one=@One(select=“mapper.ProductMapper.get”),这里会与Product建立多对一关系。

public interface OrderItemMapper {
    @Select(" select * from order_item_ where oid = #{oid}")
    @Results({
            @Result(property="product",column="pid",one=@One(select="mapper.ProductMapper.get"))
    })
    public List<OrderItem> listByOrder(int oid);
}

4.3.新增OrderMapper,提供list方法

many = @Many(select = “mapper.OrderItemMapper.listByOrder”),这里会与OrderItem建立一对多关系。

public interface OrderMapper {
    @Select("select * from order_")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "orderItems", javaType = List.class, column = "id",
                    many = @Many(select = "mapper.OrderItemMapper.listByOrder"))
    })
    public List<Order> list();
}

4.4.修改mybatis-config.xml

新增Mapper类的映射

4.5.编写测试类Test4.java

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 mapper.OrderMapper;
import pojo.Order;
import pojo.OrderItem;
import pojo.Product;

public class Test4
{
    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();

        listOrder(session);

        session.commit();
        session.close();
    }

    private static void listOrder(SqlSession session) {
        OrderMapper mapper =session.getMapper(OrderMapper.class);
        List<Order> os = mapper.list();
        for (Order o : os) {
            System.out.println(o.getCode());
            List<OrderItem> ois= o.getOrderItems();
            if(null!=ois){
                for (OrderItem oi : ois) {
                    System.out.format("\t%s\t%f\t%d%n", oi.getProduct().getName(),oi.getProduct().getPrice(),oi.getNumber());
                }
            }

        }
    }
}

4.6.输出

code000A
	product a	88.879997	100
	product b	88.879997	100
	product c	88.879997	100
code000B
	product b	88.879997	100
	product c	88.879997	100
	product x	88.879997	100

5.动态SQL

没整明白

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值