Mybatis入门笔记(2)——基于代理Dao实现CRUD

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

目录结构:

XML方式

创建步骤:

  1. 创建maven工程,什么都不选就ok,并导入坐标;

  2. 编写User实体类和dao接口。

    java目录下创建com.ben.domain包,创建User实体类

    创建com.ben.dao包,创建IUserDao接口(也可以写成UserDao或UserMapper)

    public interface IUserDao {
        // 通过ID查询一个用户
        User findUserById(Integer id);
        // 根据用户名模糊查询用户列表
        List<User> findUserByUsername(String userName);
        // 添加用户
        int insertUser(User user);
        // 更新用户
        void updateUserById(User user);
        // 删除用户
        void deleteUserById(Integer id);
    }
    
  3. 在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml;

  4. 在resources文件夹中导入log4j.properties文件

  5. 在resources里创建包com->ben->dao,创建映射配置文件IUserDao.xml;

    要求:

    创建位置:必须和持久层接口在相同的包中;

    名称:必须以持久层接口名称命名文件名,扩展名是.xml

    举例:
    注意:配置文件的namespace必须是持久层接口的全类名

  6. 在java下创建测试类com.ben.test.MybatisTest,6步;

1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
3.创建SqlSession工厂对象
SqlSessionFactory factory = builder.build(in);
4.使用工厂生产SqlSession对象
session = factory.openSession();
5.创建Dao接口的代理对象
userdao = session.getMapper(IUserDao.class);
6.执行操作:增删改查等操作
7.释放资源
session.commit();
session.close();
in.close();
/**
 * @ClassName: MybatisTest
 * @author: benjamin
 * @version: 1.0
 * @description: TODO
 * @createTime: 2019/07/07/21:54
 */

public class MybatisTest {

    private SqlSessionFactory factory;
    private IUserDao userdao;
    private InputStream in;
    private SqlSession session;

    // 作用:在测试方法前执行这个方法
    @Before
    public void setUp() throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.创建SqlSession工厂对象
        SqlSessionFactory factory = builder.build(in);
        //4.使用工厂生产SqlSession对象
        session = factory.openSession();
        //5.创建Dao接口的代理对象
        userdao = session.getMapper(IUserDao.class);
    }

    @After//在测试方法执行完成之后执行
    public void destroy() throws IOException {
        session.commit();
        session.close();
        in.close();
    }


    //通过Id查询一个用户
    @Test
    public void testFindUserById() {
        //5.使用代理对象执行方法
        User user = userdao.findUserById(1);
        System.out.println(user);
    }

    //根据用户名模糊查询用户列表
    @Test
    public void testFindUserByUserName() {
        List<User> list = userdao.findUserByUsername("王");
        for (User user : list) {
            System.out.println(user);
        }
    }

    //添加用户
    @Test
    public void testInsertUser() throws IOException {
        User user = new User();
        user.setUsername("大王");
        user.setBirthday(new Date());
        user.setAddress("sadfsafsafs");
        user.setSex("2");
        int i = userdao.insertUser(user);
        System.out.println("插入id:" + user.getId());//插入id:35
    }

    //更新用户
    @Test
    public void testUpdateUserById() throws IOException {
        User user = new User();
        user.setId(35);
        user.setUsername("一一");
        user.setBirthday(new Date());
        user.setAddress("西安市");
        user.setSex("1");
        userdao.updateUserById(user);

        System.out.println(user.getId());
    }

    //删除用户
    @Test
    public void testDeleteUserById() throws IOException {
        userdao.deleteUserById(29);
    }
}

注意事项:

  1. 在Mybatis中它把持久层的操作接口名称也叫做:Mapper。所以:IUserDao 和 IUserMapper是一样的。

  2. 在idea中创建目录的时候,它和包是不一样的。package包在创建时:com.ben.dao它是三级结构;directory目录在创建时:com.ben.dao是一级目录。

  3. 映射配置文件IUserDao.xml的mapper标签配置:

    namespace:dao接口的全限定类名。比如com.ben.dao.IUserDao

    id:Mapper接口(IUserDao)的接口方法名;

    parameterType:接口方法的传入参数类型;

    resultType:接口方法的返回值类型;

遵从了第3点,在开发中就无须再写dao的实现类。mybatis 为我们实现,即为动态代理dao实现。

注解方式

  1. IUserDao.xml移除;

  2. dao接口(IUserDao)的方法上使用@Select注解,并且指定SQL语句;

    public interface IUserDao {
        //用户的持久层操作,查询所有操作。
        @Select("select * from user")
        List<User> findAll();
    }
    
  3. SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。

<mappers>
  <mapper class="com.ben.dao.IUserDao"/>
</mappers>

编写测试类

/**
 * @ClassName: MybatisTest
 * @author: benjamin
 * @version: 1.0
 * @description: TODO
 * @createTime: 2019/07/07/21:54
 */

public class MybatisTest {

    private SqlSessionFactory factory;
    private IUserDao userdao;
    private InputStream in;
    private SqlSession session;

    // 作用:在测试方法前执行这个方法
    @Before
    public void setUp() throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.创建SqlSession工厂对象
        SqlSessionFactory factory = builder.build(in);
        //4.使用工厂生产SqlSession对象
        session = factory.openSession();
        //5.创建Dao接口的代理对象
        userdao = session.getMapper(IUserDao.class);
    }

    @After//在测试方法执行完成之后执行
    public void destroy() throws IOException {
        session.commit();
        session.close();
        in.close();
    }

    //查询所有用户
    @Test
    public void findAll(){
        List<User> list = userdao.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
}
posted @ 2019-07-17 22:35  伊万夫斯基  阅读(668)  评论(0编辑  收藏  举报