SpringMVC+Mybatis (动态代理)学习笔记

在demomybatis的基础上,新建dao包,持久层,其中有IUserDao接口:

package com.bit.dao;

import com.bit.po.user;

//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exception
public interface IUserDao {
    
    public int addUser(user user1) throws Exception;
    
    public int modifyUser(int id,user user2)throws Exception;
    
        public int delUser(int id)throws Exception;
        
        public user queryUser(int id)throws  Exception;
}

并写其实现类UserDaoImpl:(部分方法略,只体现查找)

package com.bit.dao;

import com.bit.po.user;
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 java.io.IOException;
import java.io.InputStream;

public class UserDaoImpl implements IUserDao {
    //需要使用sqlSessionFactory和sqlSession

    private SqlSessionFactory sqlSessionFactory=null;

    //无参构造,new UserDaoImpl时也能new SqlSessionFactory
    public UserDaoImpl()
    {
        String mybatisConfigFile="sqlMapConfig.xml";
        InputStream is=null;
        try {

            is=Resources.getResourceAsStream(mybatisConfigFile);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }



  
    @Override
    public user queryUser(int id) throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        user user1=sqlSession.selectOne("test.queryUserById",id);
        return user1;
    }
}

新建一个测试类MyBatisTest2,它相当于客户端,此时的测试类中不需要new SqlSessionFactory和SqlSession了:

package com.bit;

import com.bit.dao.IUserDao;
import com.bit.dao.UserDaoImpl;
import com.bit.po.user;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

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

public class MybatisTest2 {
    //只需要Dao
    //此时没有Spring,自行创建
   private IUserDao iUserDao=new UserDaoImpl();
   

@Test
    public void queryUser()
{try {
    user user1 = iUserDao.queryUser(2);
    System.out.println(user1);
}
catch (Exception ex)
{ex.printStackTrace();}

}

}

运行结果为:
在这里插入图片描述
要用mapper代理的方式开发Mybatis:
静态代理 动态代理 AOP???

接口修改方法如下:

package com.bit.dao;

import com.bit.po.user;

import java.util.List;

//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exception
public interface IUserDao {

   public user queryUserById(int myid)throws Exception;
   
   public List<user> queryUserByName(String name)throws Exception;
   
   public void modifyUser(user user1) throws Exception;
   
   public void delUser(int id)throws Exception;
   
   public user queryUser(int id)throws Exception;
}

如果用户有很多个订单,难道需要很多个Impl类? 利用动态代理,代理对象,像反射一样,运行期创建。因此不再需要UserDaoImpl。

那么只剩下接口,没有实现类。——通过代理Proxy,动态代理需要实现一些规则。约定优于配置。

在mapper包下新建user.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">



<!--namespace需要和接口名一致-->
<mapper namespace="com.bit.dao.IUserDao">
<!--statement 的id需要与方法名一致-->
    <!--parameterType需要与方法参数类型一致-->
    <!--resultType需要与方法返回类型一致-->

<select id="queryUserById" parameterType="int" resultType="com.bit.po.user">
    select *from user where userid=#{value};
    </select>

<select id="queryUserByName" parameterType="String" resultType="com.bit.po.user">
    select * from user where username=#{value};
</select>>

    <update id="modifyUser" parameterType="com.bit.po.user">
        update user set username=#{userName} where userid=#{userID};
    </update>

    <delete id="delUser" parameterType="int">
        delete from user where userid=#{value};
    </delete>

</mapper>


新建单元测试MybatisTest3:

package com.bit;

import com.bit.dao.IUserDao;
import com.bit.po.user;
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 org.junit.Before;
import org.junit.Test;

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

public class MybatisTest3 {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void testInit()
    {
        String mybatisConfigFile="sqlMapConfig.xml";
        InputStream is=null;
        try {

            is=Resources.getResourceAsStream(mybatisConfigFile);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //测queryById
    //使用mapper动态代理

    @Test
    public void test()
    {SqlSession sqlSession=sqlSessionFactory.openSession();
        //代理对象与被代理对象实现同一接口,所以生成的代理对象也实现了IUserDao这个接口
        try
        {
            IUserDao userDao=sqlSession.getMapper(IUserDao.class);
        user user1=userDao.queryUserById(3);
        System.out.println(user1);
        }
        catch (Exception ex)
        {ex.printStackTrace();}
        finally {
            sqlSession.close();
        }
    }
}


再把user.xml的名字改成与接口名一致,并且放在同一个包下:
在这里插入图片描述
就可以通过包扫描;


    <!--需要添加核心信息-->
    <mappers>
   <package name="com.bit.dao"/>
    </mappers>

可以将dao层改名为mapper层。(现在改名叫mapper了。)

总结:

动态代理实现Mybatis的七个规则

规则1:workspace一致,
2:方法名与id名一致
3.方法参数与ParameterType一致
4.方法返回值与ResultType一致
5.接口与xml名字一致
6.接口与xml在同一个包下
7.通过包扫描

发布了47 篇原创文章 · 获赞 1 · 访问量 1284

猜你喜欢

转载自blog.csdn.net/weixin_41750142/article/details/102081379
今日推荐