动态代理
在开发的过程中只需要写Dao层的接口,无需写其实现类,实现类有框架自己补充。
框架是根据mapper文件自动补充的,
Mapper接口开发需要遵循以下规范:
- 接口名要和对应的映射文件的名称相同(只是后缀名不同)
- 要在同一目录下面(可以创建一个源文件夹,然后创建一个和src目录下面相同的包,已达到xml和接口分离的作用)
!!!注意!!! 在mybatis-config.xml配置映射时,如果使用
<package name="包名">
标签或者<mapper class="包名">
标签的时候,映射文件名必须和接口名一样,目录路径也要一样,否则报错。
原因如下:1.包扫描形式时。实体类+Mapper接口通过动态代理调用方法
2.调用方法时会找其相应的映射配置文件
3.当多个mapper接口和mapper.xml同时存在,如果没有相同的名称,则动态代理就不能通过其一一对应的依赖配置文件创建其相应的实现方法
使用<package resource="包名">
标签的时候,可以无视上面两个规范
-
接口的全限定名要和mapper映射文件的namespace 一致
-
接口中的方法名要和mapper映射文件中的唯一标识的id相同
-
接口的方法返回类型和mapper 映射文件返回的类型一致
-
接口的方法参数类型和mapper 映射文件输入类型要一致
使用范例
数据库表结构
Products类
public class Products {
private int pid;
private String pname;
private int price;
private int flag;
private int category_id;
getter setter省略
productsDao接口
public interface ProductsDao {
public Products findById(int i);
public void deleteById(int i);
public void insertProducts(Products products);
public void updateById(@Param("price") int price, @Param("pid") int pid);
}
productsDaoMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glc.dao.ProductsDao">
<select id="findById" parameterType="int" resultType="com.glc.bean.Products">
select * from products where pid = #{pid}
</select>
<delete id="deleteById" parameterType="int">
delete from Products where pid = #{pid}
</delete>
<insert id="insertProducts" parameterType="com.glc.bean.Products" >
insert into Products value(#{pid},#{pname},#{price},#{flag},#{category_id})
</insert>
<update id="updateById" parameterType="int" >
update Products set price = #{price} where pid = #{pid};
</update>
</mapper>
测试类
//动态代理
@Test
public void TestProducts(){
SqlSession sqlSession = SessionUtils.getSession();
ProductsDao mapper = sqlSession.getMapper(ProductsDao.class);
Products products = mapper.findById(2);
System.out.println(products);
sqlSession.close();
}
@Test
public void TestProducts2(){
SqlSession sqlSession = SessionUtils.getSession();
ProductsDao mapper = sqlSession.getMapper(ProductsDao.class);
mapper.deleteById(10001);
sqlSession.commit();
sqlSession.close();
}
@Test
public void TestProducts3(){
SqlSession sqlSession = SessionUtils.getSession();
ProductsDao mapper = sqlSession.getMapper(ProductsDao.class);
Products products = new Products(10002, "apples", 6000, 1, 1);
mapper.insertProducts(products);
sqlSession.commit();
sqlSession.close();
}
@Test
public void TestProducts4(){
SqlSession sqlSession = SessionUtils.getSession();
ProductsDao mapper = sqlSession.getMapper(ProductsDao.class);
mapper.updateById(10000,100);
sqlSession.commit();
sqlSession.close();
}