zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
    
  • 相关阅读:
    JS基础类型和引用类型
    ul的margin撑不开想要的距离的办法
    html中的列表
    BEM的命名规则
    意义模糊的函数签名……文档注释
    最基础,新手入门第一段代码
    Cookie的使用
    用servlet校验密码2
    用servlet进行用户名和密码校验
    登录页面
  • 原文地址:https://www.cnblogs.com/benjieqiang/p/11204155.html
Copyright © 2011-2022 走看看