前言

首先感谢https://my.oschina.net/zudajun/blog/665956(jd上也出书了貌似)  这位作者。让自己能系统的看完和理解第一个框架的源码(其实我反复看了4遍以上,一遍实际操作 一边打断点一边看)。我现在发现学习一个框架首先会简单的应用,然后才是阅读源码进阶,不然直接抱着源码肯,会很晕。所以首先记录mybatis的各种用法开始。

写博客的主要原因是方便后面自己快速查阅。

使用SqlSession完成CRUD

1.引入mybatis相关依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.4.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>5.1.34</version>
  11. </dependency>
  12. <!-- 数据源 c3p0 -->
  13. <dependency>
  14. <groupId>com.mchange</groupId>
  15. <artifactId>c3p0</artifactId>
  16. <version>0.9.5-pre8</version>
  17. </dependency>
  18. </dependencies>

2.创建测试相关的表

  1. CREATE TABLE classes
  2. (
  3. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '班级id',
  4. `name` VARCHAR(50) NOT NULL COMMENT '班级名称'
  5. )

3.创建对应的实体类

  1. public class Classes implements Serializable{
  2. private int id;
  3. private String name;
  4.  
  5. public int getId() {
  6. return id;
  7. }
  8.  
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12.  
  13. public String getName() {
  14. return name;
  15. }
  16.  
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. }

4.创建mybatis配置文件

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 对事务的管理和连接池的配置 -->
  7. <environments default="development">
  8. <environment id="development">
  9. <transactionManager type="JDBC" />
  10. <!--UNPOOLED 非连接池 POOLED mybatis提供的POOLED连接池 JNDI mybtais提供的JNDIfacotory获取数据源
  11. 根据配置找到对应的工厂 创建对应的数据源 可以直接配置工厂 需要实现UnpooledDataSourceFactory
  12. -->
  13. <dataSource type="com.liqiang.core.C3P0DataSourceFactory">
  14. <property name="driverClass" value="com.mysql.jdbc.Driver" />
  15. <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/DTest?characterEncoding=UTF-8" />
  16. <property name="user" value="root" />
  17. <property name="password" value="root" />
  18. </dataSource>
  19. </environment>
  20. </environments>
  21. <!-- mapping 支持是三种方式 类全明称 包扫描 mapperXml路径 -->
  22. <mappers>
  23. <mapper resource="ClassesMapper.xml"></mapper>
  24. <!-- <mapper class=""></mapper>
  25. <package name="com.liqiang.mapper"/>-->
  26. </mappers>
  27.  
  28. </configuration>

上面dataSource Type 因为mybatis不支持c3p0所以通过他提供的结构自定义连接池创建工厂

  1. public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
  2. public C3P0DataSourceFactory () {
  3. this . dataSource = new ComboPooledDataSource () ;
  4. }
  5. }
  1. UnpooledDataSourceFactory 继承这个 然后构造函数 初始化 初始化c3p0的数据源对象

5.定义一个在resources下增加 ClassesMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="classes">
  6. <select id="selectAll" resultType="com.liqiang.entity.Classes">
  7. select * from classes
  8. </select>
  9. <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.liqiang.entity.Classes">
  10. insert INTO classes(name) VALUES (#{name});
  11. </insert>
  12. <update id="update" parameterType="com.liqiang.entity.Classes">
  13. UPDATE classes set name=#{name} where id=#{id};
  14. </update>
  15. <delete id="delete" parameterType="int">
  16. delete from classes where id=#{id};
  17. </delete>
  18. </mapper>
  1. parameterType为传入参数类型
  1. useGeneratedKeys 为是否使用JDB3KeyGenerated(可以理解成自增情况下插入会回填id) keyProperty为回填自增id的属性名字
    6.测试
  1. public static void main(String[] args) throws FileNotFoundException {
  2. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  3. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder
  4. .build(ClassLoader.getSystemResourceAsStream("mybatis.xml"));
  5. SqlSession sqlSession = sqlSessionFactory.openSession();
  6. //新增
  7. Classes classes=new Classes();
  8. classes.setName("一年级");
  9. sqlSession.insert("classes.insert",classes);
  10. sqlSession.commit();
  11. //查询
  12. List<Classes> list=sqlSession.selectList("classes.selectAll");
  13. list.forEach(c->{
  14. System.out.println(c.getName());
  15. });
  16. //修改
  17. classes.setName("二年级");
  18. sqlSession.update("classes.update",classes);
  19. sqlSession.commit();
  20. list=sqlSession.selectList("classes.selectAll");
  21. list.forEach(c->{
  22. System.out.println(c.getName());
  23. });
  24.  
  25. //删除
  26. sqlSession.delete("classes.delete",list.get(0).getId());
  27. sqlSession.commit();

暂时理解:

1.解析mybatis.xml 扫描mappers下面 把对应的标签通过 namespace+id当key把各个map形式存储起来

2.通过sqlSession的CRUD方法 传入key 执行对应的sql

使用代理完成CRUD

1.创建一个mapper包,并将ClassesMapper.xml移动到里面,并创建一个mapper接口,方法名字和返回类型 参数类型要对应ClassesMapper.xml

  1. public interface ClassesMapper {
  2. public List<Classes> select();
  3. public void update(Classes classes);
  4. public void insert(Classes classes);
  5. public void delete(int id);
  6.  
  7. }

2.将ClassesMapper.xml的namespace改成对应Mapper接口的全名称(必须)

  1. <mapper namespace="com.liqiang.mapper.ClassesMapper">
  2. ...
  3. </mapper>

3.修改mybatis下的xml扫描 变为包扫描

  1. <mappers>
  2. <package name="com.liqiang.mapper"/>
  3. </mappers>

理解:

1.mybatis会扫描这个包下面所有类型为interface的class

2.然后遍历这些class通过classname+.xml 找到对应的mapper.xml(这就是为什么这种方式mapper接口和mapper.xml名字要一致的原因)

4.测试

  1. public static void main(String[] args) throws FileNotFoundException {
  2. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  3. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder
  4. .build(ClassLoader.getSystemResourceAsStream("mybatis.xml"));
  5. SqlSession sqlSession = sqlSessionFactory.openSession();
  6. ClassesMapper classesMapper=sqlSession.getMapper(ClassesMapper.class);
  7.  
  8. //新增
  9. Classes classes=new Classes();
  10. classes.setName("一年级");
  11. classesMapper.insert(classes);
  12. sqlSession.commit();
  13. //查询
  14. List<Classes> list=sqlSession.selectList("classes.selectAll");
  15. list.forEach(c->{
  16. System.out.println(c.getName());
  17. });
  18. //修改
  19. classes.setName("二年级");
  20. classesMapper.update(classes);
  21. sqlSession.commit();
  22. list=classesMapper.select();
  23. list.forEach(c->{
  24. System.out.println(c.getName());
  25. });
  26.  
  27. //删除
  28. classesMapper.delete(list.get(0).getId());
  29. sqlSession.commit();
  30. }

理解:

1.sqlSession.getMapper会获得对应接口的代理类,调用对应的方法 底层会获得代理类实现接口的全名称packagename+接口名字+当前方法名字做key找到对应的mapper标签(这就是基于代理namespace一定要跟对应mapper的全名称一致的原因)

mybatis使用-helloword(一)的更多相关文章

  1. Mybatis 入门 -- 最简单的引入和使用

    参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html 从今天开始学习官方文档. 1.项目搭建 项目结构: 首先,搭建一个maven项目 ...

  2. eclipse 使用maven 创建springmvc + mybatis

    接着eclipse 使用maven 创建纯spring mvc项目 毕竟项目都要访问数据库的, 所以加上mybatis的支持也就是网上大多时候说的 SSM框架的搭建(Spring + Spring M ...

  3. springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生

    人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...

  4. eclipse+tomcat+maven+springmvc+mybatis+mysql集成WebService插件(Axis2+CXF)

    $1 环境介绍 $1.1 Eclipse Java EE IDE for Web Developers:Neon.2 Release (4.6.2) $1.2 Maven:3.3.9 $1.3 Spr ...

  5. SpringBoot+MyBatis+Mysql 详细示例

    SpringBoot与MyBatis整合,底层数据库为mysql的使用示例  项目下载链接:https://github.com/DFX339/bootdemo.git   新建maven项目,web ...

  6. MyBatis环境配置及入门

    Mybatis 开发环境搭建,选择: MyEclipse8.5 版本,mysql 5.5, jdk 1.8, mybatis3.2.3.jar 包.这些软件工具均可以到各自的官方网站上下载. 整个过程 ...

  7. 基于Maven的Spring + Spring MVC + Mybatis的环境搭建

    基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...

  8. Mybatis资料

    1. 入门案例 https://www.cnblogs.com/xdp-gacl/p/4261895.html 2. 详细笔记 以及配套视频教程: 笔记:https://blog.csdn.net/S ...

  9. Hibernate基础-HelloWord

    1. ORM :ORM (Object /Relation Mapping ): 对象/关系映射(理解)      1) ORM 主要解决对象 -关系的映射      2) .ORM的思想:将关系数据 ...

随机推荐

  1. QT 4.53 for VS2005 编译包

    最近学QT,装了QT5,结果打开下载的项目(特别是那些书的源代码)有很多兼容性问题.于是又下载4.83,都是4版本系列的,应该会好很多吧,但居然也是这样.于是看了一下时间,觉得4.53于2009年底发 ...

  2. 将tflearn的模型保存为pb,给TensorFlow使用

    参考:https://github.com/tflearn/tflearn/issues/964 解决方法: """ Tensorflow graph freezer C ...

  3. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  4. Python 36 死锁现象和递归锁、信号量、Event事件、线程queue

    一:死锁现象和递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远 ...

  5. Vue发布过程中遇到坑,以及webpack打包优化

    前言 这段时间,本人自己做了一个vue画面部署到自己的服务器上,发现运行速度慢的的惊人,虽然服务器很渣(本人没什么钱,只能租最差的服务器,主要是给自己学习用的),但是这样开发出来的网站简直不能用,所以 ...

  6. [Luogu 2216] [HAOI2007]理想的正方形

    [Luogu 2216] [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输 ...

  7. SQL SERVER 2000 如何提高大数据筛选GROUP BY 的效率

    数据库有83W条记录,本想计算20180101之后的每天赔付情况,故写了以下SQL语句: SELECT 起保时间,sum(赔付金额) as 日赔付 FROM maindata WHERE 起保时间&g ...

  8. Maven项目pom.xml配置详解

    maven项目pom.xml文件配置详解,需要时可以用作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  9. linux ssh 经常断开 的解决方法

    1.现象 在linux ,用ssh进行远程连接时,经常会发生长时间后断线,或者是无响应,就像卡住的感觉(键盘输入不进去). 2.解决方法 在ssh客户端的linux设置 # sudo vim /etc ...

  10. Python语言之常用函数

    1.input(),raw_input() input() = eval( raw_input() ) 其中raw_input()将所有的输入当做字符串处理. eval(str [,globals [ ...