博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis使用-helloword(一)
阅读量:4683 次
发布时间:2019-06-09

本文共 5278 字,大约阅读时间需要 17 分钟。

前言

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

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

使用SqlSession完成CRUD

1.引入mybatis相关依赖

org.mybatis
mybatis
3.4.0
mysql
mysql-connector-java
5.1.34
com.mchange
c3p0
0.9.5-pre8

2.创建测试相关的表

CREATE TABLE classes(  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '班级id',  `name` VARCHAR(50) NOT NULL COMMENT '班级名称')

3.创建对应的实体类

public class Classes implements Serializable{    private int id;    private String name;        public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }        public void setName(String name) {        this.name = name;    }    }

4.创建mybatis配置文件

mybatis.xml

 

 

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

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

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

insert INTO classes(name) VALUES (#{name});
UPDATE classes set name=#{name} where id=#{id};
delete from classes where id=#{id};
parameterType为传入参数类型
useGeneratedKeys 为是否使用JDB3KeyGenerated(可以理解成自增情况下插入会回填id) keyProperty为回填自增id的属性名字 6.测试
public static void main(String[] args) throws FileNotFoundException {        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder                .build(ClassLoader.getSystemResourceAsStream("mybatis.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        //新增        Classes classes=new Classes();        classes.setName("一年级");        sqlSession.insert("classes.insert",classes);        sqlSession.commit();        //查询        List
list=sqlSession.selectList("classes.selectAll"); list.forEach(c->{ System.out.println(c.getName()); }); //修改 classes.setName("二年级"); sqlSession.update("classes.update",classes); sqlSession.commit(); list=sqlSession.selectList("classes.selectAll"); list.forEach(c->{ System.out.println(c.getName()); }); //删除 sqlSession.delete("classes.delete",list.get(0).getId()); sqlSession.commit();

暂时理解:

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

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

使用代理完成CRUD

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

public interface ClassesMapper {     public List
select(); public void update(Classes classes); public void insert(Classes classes); public void delete(int id);}

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

...

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

理解:

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

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

4.测试

public static void main(String[] args) throws FileNotFoundException {        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder                .build(ClassLoader.getSystemResourceAsStream("mybatis.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        ClassesMapper classesMapper=sqlSession.getMapper(ClassesMapper.class);        //新增        Classes classes=new Classes();        classes.setName("一年级");        classesMapper.insert(classes);        sqlSession.commit();        //查询        List
list=sqlSession.selectList("classes.selectAll"); list.forEach(c->{ System.out.println(c.getName()); }); //修改 classes.setName("二年级"); classesMapper.update(classes); sqlSession.commit(); list=classesMapper.select(); list.forEach(c->{ System.out.println(c.getName()); }); //删除 classesMapper.delete(list.get(0).getId()); sqlSession.commit();}

理解:

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

 

转载于:https://www.cnblogs.com/LQBlog/p/9276981.html

你可能感兴趣的文章
全排列 -- next_permutation()
查看>>
JavaScript的DOM操作(1)
查看>>
Panorama控件和Pivot控件【WP7学习札记之十四】
查看>>
C#控制台打印简单【倒三角形】的图形
查看>>
记: 一次惊心动魄的解决 服务器 无解问题的心路历程
查看>>
超级迷宫站立会议2015/5/15
查看>>
92. Reverse Linked List II
查看>>
磁盘结构原理
查看>>
随笔1
查看>>
Android开发命名规范
查看>>
MySQL 源代码scr.rpm安装的一点注意事项
查看>>
毕业之后,人在职场
查看>>
在win下启动memcached
查看>>
170403、java 版cookie操作工具类
查看>>
处理类型(typedef,uisng,auto,decltype)
查看>>
添加删除区别
查看>>
一个华为人辞职创业后的几个反思
查看>>
razor 语法
查看>>
CODEVS_2144 砝码称重 2 折半搜索+二分查找+哈希
查看>>
引入CSS
查看>>