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
没整明白