Mybatis学习【2】

1. 用Mybatis实现对user表的增删改查操作(XML配置):

接口名:

public interface IUserDao

①:查询所有findAll()

——XML配置信息:

    <select id="findAll" resultType="cn.xupt.domain.User">
        select * from user
    </select>

——执行方式:

    @Test
    public void findAllTest() throws IOException {
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
    }

②:添加用户操作addUser(User user)

——XML配置信息:

    <insert id="addUser" parameterType="cn.xupt.domain.User">
        <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
            select last_insert_id()
        </selectKey>
        insert into user (username,birthday,sex,address)values (#{username},#{birthday},#{sex},#{address})
    </insert>

——执行方式:

    public void addUserTest() throws IOException {
        User userDemo = new User();
        userDemo.setUsername("孙悟空");
        userDemo.setBirthday(new Date());
        userDemo.setSex("男");
        userDemo.setAddress("水帘洞");
        System.out.println("执行前:"+userDemo);
        userDao.addUser(userDemo);
        session.commit();
        System.out.println("执行后:"+userDemo);
    }

③:根据id更新用户updateUser(User user)

——XML配置:

    <update id="updateUser" parameterType="cn.xupt.domain.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>

——执行方式:

    @Test
    public void updateUserTest(){
        User userDemo = new User();
        userDemo.setId(50);
        userDemo.setUsername("猪八戒");
        userDemo.setBirthday(new Date());
        userDemo.setSex("男");
        userDemo.setAddress("水帘洞");
        userDao.updateUser(userDemo);
        session.commit();
    }

④:根据id删除用户deleteUser(int id)

——XML配置:

    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{uid}
    </delete>

——执行方式:

    @Test
    public void deleteUserTest(){
        userDao.deleteUser(50);
        session.commit();
    }

⑤:根据id查询用户findById(int id)

——XML配置:

    <select id="findById" parameterType="int" resultType="cn.xupt.domain.User">
        select * from user where id=#{uid}
    </select>

——执行方式:

    @Test
    public void findByIdTest(){
        User user = userDao.findById(48);
        System.out.println(user);
        session.commit();
    }

⑥:根据username模糊查询用户findByUsername(String username)

——XML配置:

    <select id="findByUsername" parameterType="String" resultType="cn.xupt.domain.User">
        select * from user where username like #{username}
    </select>

——执行方式:

    @Test
    public void findByUsernameTest(){
        List<User> users = userDao.findByUsername("%王%");
        for (User user : users){
            System.out.println(user);
        }
        session.commit();
    }

2. 参数深入(传值不仅仅为一个):

组合查询,将查询条件组装成一个查询对象作为parameterType的值传入findByQueryVo(QueryVo vo)

——XML配置:

    <select id="findByQueryVo" parameterType="cn.xupt.domain.QueryVo" resultType="cn.xupt.domain.User">
        select * from user where username like #{user.username}
    </select>

——执行方式:

    @Test
    public void findByQueryVoTest(){
        User user = new User();
        user.setUsername("%王%");
        QueryVo vo = new QueryVo();
        vo.setUser(user);
        List<User> users = userDao.findByQueryVo(vo);
        for (User u : users){
            System.out.println(u);
        }
        session.commit();
    }

3. 设置实体类和数据库里的类一一对应:

    <resultMap id="userMap" type="cn.xupt.domain.User">
        <!--对应列名-->
        <id property="id" column="id"></id>
        <result property="usernaem" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
    </resultMap>

4. 使用dao实现类实现查询所有的分析过程:

实现类UserDaoImpl:

    public List<User> findAll() {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");//参数就是能获取配置信息的key
        //3.释放资源
        session.close();
        return users;
    }

①:执行后进入DefaultSqlSession执行selectList();

②:selectList()方法会执行executor.query()方法,CachingExecutor是executor接口对象的实现类,它里面有query()方法;

③:CacheExecutor的query()方法中返回delegate执行doquery()方法后的对象,delegate接口对象是BaseExecutor类的对象,BaseExecutor中的doquery()方法是一个抽象方法,它的子类SimpleExecutor类重载了这个方法,所以delegate对象是SimpleExecutor类的实例化;

④:doquery()方法中有handler接口对象,其实现类是RoutingStatementHandler,它又执行了query()方法,query()方法又执行了delegate接口对象另一个实现类PrepareStatementHandler中的query()方法(此处执行了execute()方法);

⑤:实现结果集的封装;

5. 使用代理dao实现查询所有:

①:DefaultSqlSession实现的sqlSession接口对象执行getMapper()方法,这个方法调用Configuration类中的getMapper()方法;

②:Configuration类中的getMapper()方法调用MapperRegistry类中的getMapper()方法;

③:MapperRegistry类中的getMapper()方法调用MapperProxyFactory类中的newInstance()方法;

④:MapperProxyFactory类中的newInstance()方法使用动态代理,在MapperProxy类(实现InovationHandler接口)中调用invoke方法;

⑤:invoke()方法里面执行了MapperMethod类里的execute()方法,这个方法就是dao的执行,其中有个方法里面又执行了selectList()方法,也就是说又回到了dao实现类的执行方式了。

小知识点:windows里的mysql在将实体类和数据库里的列名对应时不区分大小写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值