范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Mybatis介绍与入门

  1.官方文档
  Mybatis中文手册:mybatis – MyBatis 3 或者 MyBatis中文网
  Maven仓库:Maven Repository: org.mybatis » mybatis » 3.5.7 (mvnrepository.com)  2.概述2.1传统Java程序操作DB
  传统方式操作数据库的问题:  需要自己去连接数据库,这段代码由程序员编写(不一定标准)  程序不是OOP的方式来操作DB(我们希望在代码层面上是以对象的形式来操作,如insert(Object))  SQL语句写在程序中,属于硬编码,没有解耦  2.2Mybatis基本介绍Mybatis 是一个持久层框架  前身是 ibatis,在ibatis3.x 时,更名为Mybatis  Mybatis 在 Java 和 sql 之间提供更加灵活的映射方案  mybatis 可以对数据库表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦  mybatis 通过 SQL 操作 DB,建库建表的操作仍需要程序员完成  2.3Mybatis工作原理
  相对于传统方式,Mybatis的优势:  数据库的连接/连接池,只需要配置即可,标准可以统一  程序以OOP的方式来操作数据库  sql语句可以写在xml文件中,实现了解耦  Mybatis可以对DB操作进行优化,提高效率,比如配置缓存  3.Mybatis快速入门3.1需求说明
  要求:开发一个Mybatis项目,通过Mybatis的方式可以对monster表进行crud操作。  3.2环境搭建
  (1)创建maven父项目,方便项目的jar包管理
  <?xml version="1.0" encoding="UTF-8"?>    4.0.0     com.li    mybatis    1.0-SNAPSHOT             8        8                                         mysql            mysql-connector-java            5.1.49                                    org.mybatis            mybatis            3.5.7                                    junit            junit            4.12                        test            
  (2)创建maven父项目的Module,视为子项目
  此时父项目的pom.xml文件如下:  <?xml version="1.0" encoding="UTF-8"?>    4.0.0         com.li    mybatis    pom    1.0-SNAPSHOT            mybatis_quickstart                 8        8                                            
  子模块的pom.xml文件:  <?xml version="1.0" encoding="UTF-8"?>                 mybatis        com.li        1.0-SNAPSHOT        4.0.0         mybatis_quickstart             8        8     3.2代码实现
  (1)创建数据库和表  -- 创建数据库CREATE DATABASE `mybatis`;USE `mybatis`;-- 创建monster表CREATE TABLE `monster`(`id` INT NOT NULL AUTO_INCREMENT,`age` INT NOT NULL,`birthday` DATE DEFAULT NULL,`email` VARCHAR(255) NOT NULL,`gender` TINYINT NOT NULL,-- 1 male, 0 female`name` VARCHAR(255) NOT NULL,`salary` DOUBLE NOT NULL,PRIMARY KEY(`id`))CHARSET=utf8
  (2)在子模块 mybatis_quickstart 的 resources 目录创建配置文件 mybatis-config.xml(名称随意)
  mybatis配置文件模板 <?xml version="1.0" encoding="UTF-8" ?>                                                                                                                                                                                                                                        
  (3)创建实体类 Monster.java  package com.li.entity; import java.util.Date; /** * @author 李 * @version 1.0 * 1.Monster和 monster表有对应关系 * 2.原生的sql语句查询结果还是要封装成对象 * 3.因此要求这里的实体类属性名和表的字段名保持相同 */public class Monster {    //属性和表的字段对应    private Integer id;    private Integer age;    private String name;    private String email;    private Date birthday;    private double salary;    private Integer gender;     public Monster() {    }     public Monster(Integer id, Integer age, String name, String email,                   Date birthday, double salary, Integer gender) {        this.id = id;        this.age = age;        this.name = name;        this.email = email;        this.birthday = birthday;        this.salary = salary;        this.gender = gender;    }     public Integer getId() {        return id;    }     public void setId(Integer id) {        this.id = id;    }     public Integer getAge() {        return age;    }     public void setAge(Integer age) {        this.age = age;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public String getEmail() {        return email;    }     public void setEmail(String email) {        this.email = email;    }     public Date getBirthday() {        return birthday;    }     public void setBirthday(Date birthday) {        this.birthday = birthday;    }     public double getSalary() {        return salary;    }     public void setSalary(double salary) {        this.salary = salary;    }     public Integer getGender() {        return gender;    }     public void setGender(Integer gender) {        this.gender = gender;    }     @Override    public String toString() {        return "Monster{" +                "id=" + id +                ", age=" + age +                ", name="" + name + """ +                ", email="" + email + """ +                ", birthday=" + birthday +                ", salary=" + salary +                ", gender=" + gender +                "}";    }}
  (4)创建MonsterMapper接口  package com.li.mapper; import com.li.entity.Monster; /** * @author 李 * @version 1.0 * 1.MonsterMapper接口用于声明操作monster表的方法 * 2.这些方法可以通过注解或者xml文件来实现 */public interface MonsterMapper {    //添加monster    public void addMonster(Monster monster);}
  (5)创建接口对应的映射文件,实现方法
  mybatis – MyBatis 3 | XML 映射器 <?xml version="1.0" encoding="UTF-8" ?>                INSERT INTO `monster`        (`age`,`birthday`,`email`,`gender`,`name`,`salary`)        VALUES (#{age},#{birthday},#{email},#{gender},#{name},#{salary})    
  (6)工具类MybatisUtils,用于获取连接  package com.li.util; import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;import java.io.InputStream; /** * @author 李 * @version 1.0 * MybatisUtils工具类可以得到 SqlSession */public class MybatisUtils {    private static SqlSessionFactory sqlSessionFactory;     //静态代码块中初始化 SqlSessionFactory-会话工厂    static {        try {            //指定资源文件(配置文件)            String resource = "mybatis-config.xml";            //获取配置文件对应的inputStream            //说明:加载文件时,默认到resource目录对应的==>运行后的工作目录target/classes找            InputStream resourceAsStream = Resources.getResourceAsStream(resource);            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);            System.out.println("sqlSessionFactory=" + sqlSessionFactory.getClass());        } catch (IOException e) {            e.printStackTrace();        }    }     //编写方法,返回一个SqlSession对象-会话    public static SqlSession getSqlSession() {        return sqlSessionFactory.openSession();    }}3.3测试3.3.1添加
  test 目录中创建测试类 MonsterMapperTest.java  package com.li.mapper; import com.li.entity.Monster;import com.li.util.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Before;import org.junit.Test; import java.util.Date; /** * @author 李 * @version 1.0 */public class MonsterMapperTest {    //属性    private SqlSession sqlSession;    private MonsterMapper monsterMapper;     /**     * 编写方法,完成初始化     * 当一个A方法标注了注解 @Before时,表示在执行你的目标测试方法前会先执行A方法     */    @Before    public void init() {        sqlSession = MybatisUtils.getSqlSession();        //获取到 monsterMapper对象 =class com.sun.proxy.$Proxy7代理对象)        //底层使用了动态代理机制,返回一个代理对象,通过这个对象去执行你的方法        monsterMapper = sqlSession.getMapper(MonsterMapper.class);        System.out.println("monsterMapper的类型=" + monsterMapper.getClass());    }     @Test    public void addMonster() {        for (int i = 0; i < 2; i++) {            Monster monster = new Monster();            monster.setAge(10 + i);            monster.setBirthday(new Date());            monster.setEmail("kate@qq.com");            monster.setGender(1);            monster.setName("松鼠精" + i + "号");            monster.setSalary(1000 + i * 10);            monsterMapper.addMonster(monster);            System.out.println("添加对象--" + monster);        }        //如果是增删改,需要提交事务,因为它默认不提交        if (sqlSession != null) {            sqlSession.commit();            //将连接释放回连接池            sqlSession.close();        }        System.out.println("保存成功....");    }}
  上面的代码一般会出现找不到xxxmapper.xml错误,原因是加载的资源文件时是到target目录下加载的,当maven项目运行时,源工程的MonsterMapper.xml并没有被拷贝到target目录下。
  解决方法:在父工程的pom.xml加入build配置,作用是配置resource,防止资源导出失败                          src/main/java                            **/*.xml                                        src/main/resources                            **/*.xml                **/*.properties                        
  然后选择build project
  如果不行,可能是maven版本冲突,在setting中切换maven版本,然后点击父工程的maven的clean重新构建。
  测试结果:
  数据库monster表增加了两条记录:
  3.3.2返回自增长
  有时候我们需要获取数据库中自动生成(AUTO_INCREMENT)的主键,这时候可以使用Mybatis的  useGeneratedKeys  (开启新增主键返回功能)和 keyProperty  (实体的主键属性)来配合获取。
  (1)修改映射文件MonsterMapper.xml,在该文件中的方法映射中添加 useGenerateKeys 和 keyProperty              INSERT INTO `monster`        (`age`,`birthday`,`email`,`gender`,`name`,`salary`)        VALUES (#{age},#{birthday},#{email},#{gender},#{name},#{salary})    
  (2)修改测试类,输出主键
  (3)测试结果:
  数据库表格:
  3.3.3删除
  (1)修改 MonsterMapper.java 接口,声明 delMonster() 方法  //根据id删除一个Monsterpublic void delMonster(Integer id);
  (2)在映射文件 MonsterMapper.xml 中实现 delMonster() 方法      DELETE FROM `monster` WHERE `id`=#{id};
  (3)修改测试类,添加测试方法  package com.li.mapper; import com.li.entity.Monster;import com.li.util.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Before;import org.junit.Test; import java.util.Date; /** * @author 李 * @version 1.0 */public class MonsterMapperTest {    //属性    private SqlSession sqlSession;    private MonsterMapper monsterMapper;     @Before    public void init() {        sqlSession = MybatisUtils.getSqlSession();        monsterMapper = sqlSession.getMapper(MonsterMapper.class);        System.out.println("monsterMapper的类型=" + monsterMapper.getClass());    }     @Test    public void delMonster() {        //删除id=2的记录        monsterMapper.delMonster(2);        //如果是增删改操作,需要提交事务,因为它默认不提交        if (sqlSession != null) {            sqlSession.commit();            //将连接释放回连接池            sqlSession.close();        }        System.out.println("删除成功....");    }}
  测试结果:
  数据库id=2的记录成功被删除:
  3.3.4修改&查询
  (1)修改 MonsterMapper.java 接口,声明修改和查询的方法  //修改Monsterpublic void updateMonster(Monster monster);//查询-根据idpublic Monster getMonsterById(Integer id);//查询所有的Monsterpublic List findAllMonster();
  (2) 映射文件 MonsterMapper.xml 中实现方法      UPDATE `monster`    SET `age`=#{age},`birthday`=#{birthday},`email`=#{email},    `gender`=#{gender},`name`=#{name},`salary`=#{salary}    WHERE `id`=#{id};  
  (3)配置别名
  (4)修改测试类,添加测试方法  package com.li.mapper; import com.li.entity.Monster;import com.li.util.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Before;import org.junit.Test; import java.util.Date;import java.util.List; /** * @author 李 * @version 1.0 */public class MonsterMapperTest {    //属性    private SqlSession sqlSession;    private MonsterMapper monsterMapper;     @Before    public void init() {        sqlSession = MybatisUtils.getSqlSession();        monsterMapper = sqlSession.getMapper(MonsterMapper.class);        System.out.println("monsterMapper的类型=" + monsterMapper.getClass());    }        @Test    public void updateMonster() {        Monster monster = new Monster();        monster.setAge(50);        monster.setBirthday(new Date());        monster.setEmail("king@qq.com");        monster.setGender(0);        monster.setName("白骨精");        monster.setSalary(20000);        monster.setId(3);        monsterMapper.updateMonster(monster);        if (sqlSession != null) {            sqlSession.commit();            sqlSession.close();        }        System.out.println("修改成功..");    }     @Test    public void getMonsterById() {        Monster monster = monsterMapper.getMonsterById(3);        System.out.println("monster=" + monster);        if (sqlSession != null) {            sqlSession.close();        }    }     @Test    public void findAllMonster() {        List monsters = monsterMapper.findAllMonster();        for (Monster monster : monsters) {            System.out.println("monster="+monster);        }        if (sqlSession != null) {            sqlSession.close();        }    }}
  测试updateMonster()方法:
  测试getMonsterById()方法:
  测试findAllMonster()方法:
  4.日志输出-查看SQL
  在开发Mybatis程序时,比如执行测试方法,程序员往往需要查看底层发给MySql的SQL语句到底长什么样,这时应该如何查看?
  解决方案:日志输出。
  (1)修改Mybatis-config.xml文件,加入日志输出配置,方便分析SQL语句
  (2)比如测试updateMonster() 方法时,输出的结果为:  Logging initialized using "class org.apache.ibatis.logging.stdout.StdOutImpl" adapter.PooledDataSource forcefully closed/removed all connections.PooledDataSource forcefully closed/removed all connections.PooledDataSource forcefully closed/removed all connections.PooledDataSource forcefully closed/removed all connections.sqlSessionFactory=class org.apache.ibatis.session.defaults.DefaultSqlSessionFactorymonsterMapper的类型=class com.sun.proxy.$Proxy7Opening JDBC ConnectionWed Feb 22 19:09:14 CST 2023 WARN: Establishing SSL connection without server"s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn"t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to "false". You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.Created connection 1475491159.Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@57f23557]==>  Preparing: UPDATE `monster` SET `age`=?,`birthday`=?,`email`=?, `gender`=?,`name`=?,`salary`=? WHERE `id`=?;==> Parameters: 50(Integer), 2023-02-22 19:09:14.079(Timestamp), king333@qq.com(String), 0(Integer), 白骨精(String), 20000.0(Double), 3(Integer)<==    Updates: 1Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@57f23557]Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@57f23557]Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@57f23557]Returned connection 1475491159 to pool.修改成功.. Process finished with exit code 0
  当进行多表联查的时候,日志输出对我们的调试很有帮助。  5.练习

莫卡耶夫抨击帕迪这家伙实在是太过分了莫卡耶夫英国当地时间7月23日晚举行的UFC本年度第2次伦敦站赛事中,尽管头条主赛中汤姆阿斯皮纳尔意外受伤输掉比赛,总体来说英国本土选手表现不错,有6人取得了胜利,其中包括穆罕默德受杜兰特影响!4名值得关注仍未签约的自由球员NBA世界还在继续等待杜兰特和米切尔的交易达成,他们两人没有确定落脚点的话,NBA的许多自由球员就暂时没有最终的归宿。尽管已经临近8月份了,但是仍有几个很好的球员还没有完成签约。大趣味2022卡塔尔世界杯的焦点之战欢迎来到天圣时代世界体坛资讯速递GOALSPORTS足球世界资讯卡塔尔世界杯是继2002年日韩联合主办世界杯后,第二次在亚洲举办世界杯。2022年世界杯的首场比赛将于11月21日开蔡斌恐派原班人马出战世锦赛!主攻自由人不换人,老将难回归女排主帅蔡斌在回到宁波北仑前曾说出过,会对主攻线进行调整的话,所以球迷都在期待有哪些球员会在新一期备战集训中被征召入队。综合各方球迷的意见,有4位老将被呼吁归队,分别是朱婷张常宁刘连夺3个冠军,失格的黄磊,会让多少男明星感到脸红?网上有一则新闻,55岁外公接孙子放学,画面却胜似父子。长这样大叔青年化。是近年我们社会审美的一个潮流趋势。尤其是在看脸的娱乐圈,可谓愈演愈烈。你瞧45岁的靳东,53岁的黄志忠,60明明没犯错,却惨背锅,这6位明星,有人被毁掉一生谈起娱乐圈被污蔑造谣的明星可以说不在少数,明明犯错的不是她们,但真相却往往被舆论所覆盖,等大家回过神来,可能这位明星的事业已经被毁掉了,今天就让小8带着大家看一下,曾经惨遭背锅的明莫卡耶夫抨击帕迪这家伙实在是太过分了莫卡耶夫英国当地时间7月23日晚举行的UFC本年度第2次伦敦站赛事中,尽管头条主赛中汤姆阿斯皮纳尔意外受伤输掉比赛,总体来说英国本土选手表现不错,有6人取得了胜利,其中包括穆罕默德受杜兰特影响!4名值得关注仍未签约的自由球员NBA世界还在继续等待杜兰特和米切尔的交易达成,他们两人没有确定落脚点的话,NBA的许多自由球员就暂时没有最终的归宿。尽管已经临近8月份了,但是仍有几个很好的球员还没有完成签约。大趣味2022卡塔尔世界杯的焦点之战欢迎来到天圣时代世界体坛资讯速递GOALSPORTS足球世界资讯卡塔尔世界杯是继2002年日韩联合主办世界杯后,第二次在亚洲举办世界杯。2022年世界杯的首场比赛将于11月21日开蔡斌恐派原班人马出战世锦赛!主攻自由人不换人,老将难回归女排主帅蔡斌在回到宁波北仑前曾说出过,会对主攻线进行调整的话,所以球迷都在期待有哪些球员会在新一期备战集训中被征召入队。综合各方球迷的意见,有4位老将被呼吁归队,分别是朱婷张常宁刘连夺3个冠军,失格的黄磊,会让多少男明星感到脸红?网上有一则新闻,55岁外公接孙子放学,画面却胜似父子。长这样大叔青年化。是近年我们社会审美的一个潮流趋势。尤其是在看脸的娱乐圈,可谓愈演愈烈。你瞧45岁的靳东,53岁的黄志忠,60
前置影像再次升级,开学季购机选华为nova10系列准没错相信很多的学生党们已经陆续拿到了自己的录取通知书,作为新晋的大学生,要给自己一个焕然一新的面貌,准备一部超高性价比的手机是不可或缺的。今天我们就来聊聊前不久开售的华为nova10系国际关注!北京教授团队获石墨烯研究新成果,2天公开发表2篇硬核论文!近日,北京师范大学物理学系何林研究组在小转角双层石墨烯中实现可调控的大面积电子态Kagome晶格,相关成果于8月11日以TunableSampleWideElectronicKag华为Mate50或与iPhone14同期发布苹果有望年底推出台积电3nm芯片2022年8月18星期四闪回每日资讯1新浪科技消息,华为Mate50系列将9月上旬发布,预计日期是9月7日,与此同时彭博社透露,iPhone14系列也将美国时间9月7日发布,9月1千方科技上半年净利润下降118。28,原华为空降总经理潘璠已离职从加入到离开,潘璠在千方科技待了不到两年。作者秀松编辑余快日前,智慧交通企业千方科技发布半年报,报告期内营收31。16亿元,同比下降24。44净利润0。93亿元,同比下降118。2画质为先万元价位内值得入手的拍照手机微单和单反有哪些?如果以画质为优先考虑因素,那么万元价位内最值得入手的拍照手机微单和单反有哪几款呢?这是很多喜欢摄影的小伙伴非常关心的问题。首先我们来看万元之内拍照性能最强悍,画质最好的手机。如果要台积电创始人台积电创始人张忠谋提到台积电赴美建厂是在美国政府的敦促下这样做的。尽管美国政府提出了数百亿美元的补贴,但还是远低于提振本土芯片制造所需金额。而美国想重新在本土建立完整的半导体供应链很现实的生活经典文案,送给不清醒的人1。其实心给出去的时候,就该明白不可能毫发无损地收回来。如果坚强的人落泪了,一定是撑不住了,如果执着的心放弃了,一定是伤得彻底了。2。你知道吗?其实你人再好,也有人讨厌你,你人再真向内求向外生向内求就能建立起守护本心的精神家园吗?朋友推荐瓦尔登湖一个人最高级的修行,是向内走一文,感触颇深。梭罗所处的环境与我们当今时代有些类似,物欲横流,内心浮躁,一切向钱看,守护内心的精特别惊艳的文案1。hr世人慌慌张张,不过是图碎银几两,可区区几两银子却能压断世人,世间熙熙攘攘,皆为利来利往,我也一样,无一例外。2。hr再来一万次,我也愿意去捧水中的岁月,一切都是虚的,但是没三星新品折叠屏GalaxyZFold4手机,真的值得购入么?三星作为折叠屏领域的佼佼者,已经先后推出多款折叠屏手机,全都是各有各的优点,对于喜欢折叠屏手机的用户,应该格外关注这次三星全新升级的两款手机吧。据说这两款手机都是在原有的系列机型上从2498跌至1650元,骁龙870后置四摄,屏下摄像头手机加速退场目前市面上在售的全面屏手机,主要有两种主流的设计方式,一种是以安卓为主的挖孔屏,一种则是以苹果为主的刘海屏设计。无论是挖孔还是刘海屏都是不好看的,会影响屏幕的一体性,所以手机厂商们