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

接口名:

public interface IUserDao

①:查询所有findAll()

——XML配置信息:

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

——执行方式:

    @Testpublic 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>

——执行方式:

    @Testpublic 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>

——执行方式:

    @Testpublic 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>

——执行方式:

    @Testpublic 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>

——执行方式:

    @Testpublic 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>

——执行方式:

    @Testpublic 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在将实体类和数据库里的列名对应时不区分大小写。

Mybatis学习【2】相关推荐

  1. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

  2. 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习

    第57次(mybatis) 学习主题:mybatis 学习目标: 1 掌握框架的概念 2 掌握mybatis环境搭建 对应视频: http://www.itbaizhan.cn/course/id/8 ...

  3. mybatis学习笔记(13)-延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...

  4. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  5. mybatis学习笔记(7)-输出映射

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(7)-输出映射 标签: mybatis [TOC] 本文主要讲解mybatis的输出映射. 输出映射有 ...

  6. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] arg ...

  7. mybatis学习笔记(3)-入门程序一

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(3)-入门程序一 标签: mybatis [TOC] 工程结构 在IDEA中新建了一个普通的java项 ...

  8. Mybatis学习总结二

    Mybatis学习总结二 0.不需要修改的文件(在src下面) jdbc.properties文件 log4j.properties文件 SqlMapConfig.xml文件 1.高级结果映射 1.1 ...

  9. MyBatis学习总结一

    Mybatis学习总结一 1.Mybatis介绍 2.Mybatis架构图 2.1.架构图的意义 2.1.1.JDBC编写 2.1.2.反思问题 2.2.Mybatis架构图 3.入门案例 3.1.下 ...

  10. MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三

    前面的文章介绍了MyBatis多参数传递的注解.参数默认命名等方式,今天介绍Map的方式.仍然以前面的分页查询教师信息的方法findTeacherByPage为例(示例源代码下载地址:http://d ...

最新文章

  1. sql怎么实现取当前数据以及累计7天数据_年薪60万+大佬吐血整理字节跳动大数据面试真题...
  2. python怎么安装matplotlib-如何安装Python绘图库Matplotlib?
  3. 列举java接口_Java接口特点列举说明
  4. OpenGL Cube Map立方体贴图的实例
  5. 管理与决策这属于计算机在什么方面的应用,提供参考11级<计算机应用基础>...
  6. python实现两个文件夹中同名文件转移
  7. 特征不同取值/区间下 label 的均值曲线
  8. 一步一步安装Git控件版本工具
  9. 调用mysql1045解决_MySQL 1045错误的解决方法
  10. python 的逻辑关系
  11. UCT(信心上限树算法)解四子棋问题——蒙特卡罗法模拟人机博弈
  12. p20 021 函数:我的地盘听我的
  13. 来自CSDN的精华网址
  14. iOS 在XCode中upload 成功,但是在itunes connect 一直看不到
  15. varchar varchar2异同
  16. JQUERY为元素添加样式的实现方法
  17. windows phone:WP8中的地图和导航
  18. BUG:索引字段超长-Specified key was too long; max key length is 767 bytes
  19. nsn 网站研究分析
  20. Java中当被除数比除数小时为什么计算结果都为0?

热门文章

  1. 【bug记录】Vue项目执行报错处理:You may need an appropriate loader to handle this file type.
  2. Debian10 更换软件源 配置中文环境 安装中文输入法
  3. 评估 OKRs 的最佳频率是什么?
  4. 0018 求球的表面积和体积
  5. NDIS函数大全手册
  6. 深度学习各类性能指标含义解释
  7. java将字符转换成拼音_java中将汉字转换成拼音的实现代码
  8. 基于蓝牙与Android设备的控制系统设计
  9. 西门子PLC 以太网通讯
  10. 函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因