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);