MyBatis(六)注解开发

基于注解的MyBatis

MyBatis不仅仅支持xml配置,还支持注解。

1.单个参数,单条记录

记住要将该Mapper文件在mybatis-config.xml中配置。

public interface ProductsMapper {

    @Select("select * from products where pid = #{pid}")
    public Products selectById(int pid);
}

测试:与基于xml书写sql语句的方式一致。

import com.dh.mapper.ProductsMapper;
import com.dh.pojos.Products;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyTest01 {

    @Test
    public void test01(){
        SqlSession session = null;
        try {
            InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
            session = new SqlSessionFactoryBuilder().build(stream).openSession();
            ProductsMapper mapper = session.getMapper(ProductsMapper.class);
            Products p = mapper.selectById(1);
            System.out.println(p);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.多个参数,多条记录

//    有多个参数时,需要指定参数是哪个,否则mybatis不知道如何映射参数
//    以及包含模糊查询的字段要用'',不要使用""
@Select("select * from products where cid = #{cid} and pname like '%${pname}%'")
public List<Products> selectProducts(@Param("cid") String cid, @Param("pname") String pname);

其实上述的本质是,mybatis会将所有的参数封装到Map集合里,Map集合的key就是参数名。

所以也可以直接传一个Map。

3.参数为Map

@Select("select * from products where cid = #{cid} and pname like '%${pname}%'")
public List<Products> selectProducts2(Map<String,Object> map);

测试:

ProductsMapper mapper = session.getMapper(ProductsMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("cid","s001");
map.put("pname","新疆");
List<Products> products = mapper.selectProducts2(map);
for (Products product : products) {
    System.out.println(product);
}

4.insert

//可以指定参数
@Insert("insert into products (pname,price,pdate,cid) values (#{pname},#{price},#{pdate},#{cid})")
public int insertProduct(@Param("pname") String pname, @Param("price")double price, @Param("pdate")Date pdate,@Param("cid")String cid);

//也可以使用map
@Insert("insert into products (pname,price,pdate,cid) values (#{pname},#{price},#{pdate},#{cid})")
public int insertProduct2(Map<String,Object> map);

//也可以直接使用对象,主键使用null
@Insert("insert into products values (null,#{pname},#{price},#{pdate},#{cid})")
public int insertProduct3(Products products);

//获取自增主键
@Insert("insert into products values (null,#{pname},#{price},#{pdate},#{cid})")
@SelectKey(statement = "select last_insert_id()",keyProperty = "id",resultType =
           Integer.class,before = false)
public int insertProduct4(Products products);

使用很简单,只需要传入指定类型的参数即可。

5.update

update也就只是参数的区别而已,可以使用@Param指定,可以使用Map,可以使用JavaBean。

6.delete

删除同。

7.动态sql

动态sql需要将sql语句放在一个标签中。

@Select("<script>+" +
            "select * from products" +
            "<where>" +
            " <if test='pid != null'>" +
            " pid = #{pid}" +
            " </if>" +
            " </where>"+
            "</script>")
public Products selectProduct(int pid);

8.数据库字段名与JavaBean属性名映射

数据库字段名为id,JavaBean属性为pid。

@Select("select * from products where id = #{id}")
@Results({  //多个字段使用{}
    //主键
    @Result(id = true, column = "id", property = "pid"),
    @Result(column = "pname", property = "pname")}
        )
public Products selectProduct2(int id);
posted @ 2021-04-01 10:32  deng-hui  阅读(69)  评论(0编辑  收藏  举报