Mybatis(二)深入参数,返回值,Dao实现的底层

一.参数的深入(传递 pojo 包装对象)

开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅是包括一个类对象查询条件还包括其它的查
询条件(比如将用户类,用户部门类,同时作为查询条件),这时可以使用包装对象传递输入参数。

用一句话说就是:将所有查询的条件封装到一个poji对象中
在这里插入图片描述

将查询条件封装到QueryVo类中

public class QueryVo {
    private User user;
    
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为poji属性名称 OGNL表达式:
Object Graphic Navigation Language
对象	  图	   导航	       语言
它是通过对象的取值方法来获取数据。在写法上把get给省略了。
比如:我们获取用户的名称
	类中的写法:user.getUsername();
	OGNL表达式写法:user.username
mybatis中为什么能直接写username,而不用user.呢:
	因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名

在这里插入图片描述
测试:

/**
     * 测试QueryVo作为查询条件
     *
     * @throws IOException
     */
    @Test
    public void testFindUserByVo() throws IOException {
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUname("%李%");
        vo.setUser(user);
        List<User> users = userDao.findUserByVo(vo);
        for (User u : users) {
            System.out.println(u);
        }
    }

查询结果:
在这里插入图片描述

二.返回值的深入(Mysql数据库在windows系统下不区分大小写,Lunix严格区分)

1.实体类属性和数据库字段名尽量一致

字段名和实体类属性对应的才能封装进去,不同的全是null

2.当实体类属性和数据库字段名不一致时

方法一(最简单):

sql语句中给字段名取别名(与实体类属性名对应)

方法二 :

配置 :查询结果的列名和实体类的属性名的对应关系(resultMap:)
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">
        <!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
        select * from user;
    </select>

三.编写Dao实现类的及其底层实现

public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory;

    public UserDaoImpl(SqlSessionFactory factory){
        this.factory = factory;
    }

    @Override
    public List<User> findAll() {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.javasm.dao.IUserDao.findAll");//参数就是能获取配置信息的key
        //3.释放资源
        session.close();
        return users;
    }
    @Override
    public void updateUser(User user) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现更新
        session.update("com.javasm.dao.IUserDao.updateUser",user);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }
 }

在这里插入图片描述

四.使用代理Dao的底层执行过程

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值