mybits入门及增删改查学习

您所在的位置:网站首页 导出查询到的sql数据 mybits入门及增删改查学习

mybits入门及增删改查学习

2023-01-23 02:47| 来源: 网络整理| 查看: 265

一.Mybatis概述 1.1Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github官网:https://mybatis.org/mybatis-3/zh/index.html 持久层: 负责将数据到保存到数据库的那一层代码。以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。JavaEE三层架构:表现层、业务层、持久层 .框架: 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型在框架的基础之上构建软件编写更加高效、规范、通用、可扩展 1.2 JDBC的缺点: 硬编码 注册驱动、获取连接注册驱动获取connection连接时有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。定义sql语句时,如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。 操作繁琐 手动设置参数手动封装结果集对查询到的数据进行封装时需要大量的编码,而这部分代码是没有什么技术含量,而且特别耗费时间的。

 1.3 mybits优化

硬编码可以配置到配置文件操作繁琐的地方mybatis都自动完成 二.mybits入门  2.1 在mysql库中创建dog表,数据随意添加 CREATE TABLE `dog` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '宠物名', `health` int DEFAULT NULL COMMENT '健康值', `love` int DEFAULT NULL COMMENT '亲密度', `strain` varchar(32) DEFAULT NULL COMMENT '品种', `lytm` datetime DEFAULT NULL COMMENT '领养时间', PRIMARY KEY (`id`) )

再创建master表,数据就随意添加 。

CREATE TABLE `master` ( `pid` int NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '主人名字', `age` int DEFAULT NULL COMMENT '主人年龄', `gender` varchar(32) DEFAULT NULL COMMENT '主人性别', `yearnum` int DEFAULT NULL COMMENT '经验值', `did` int DEFAULT NULL COMMENT '宠物id,此id受dog表id约束', PRIMARY KEY (`pid`) )

 最后创建straininfo表,后面两个表在多表查询时会使用到。数据随意添加

create table straininfo(id int(32) primary key auto_increment,name varchar(32),`describe` varchar(255)); 2.2 创建模块,导入坐标 2.2.1在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标 mysql mysql-connector-java 8.0.29 com.oracle.database.jdbc ojdbc6 11.2.0.4 org.mybatis mybatis 3.2.2

2.3创建具体类和配置文件 2.3.1在 nj.zb.kb21.pojo 包下创建 Dog类  public class Dog { private Integer id; private String name; private Integer health; private Integer love; private String strain; private Date lytm; private List masters; 2.3.2 在 nj.zb.kb21.Dao包下创建 DogDao接口  public interface DogDao { // 单个添加 int save(Dog dog); // 单个修改 int update(Dog dog); // 单个删除 int delete(Integer dogid); /* *批量删除 *@return */ int batchDelete(List dogIds); // 批量添加 int batchAdd(List dogs); // 批量修改 int batchUpdate(List dogs); } 2.3.3编写 MyBatis 核心配置文件 -- > 替换连接信息 解决硬编码问题 在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml ,内容如下:

 

 2.3.4resoucre目录所在处(需要将resource目录标记为资源根目录):

 2.3.5资源根目录标记位置:

 2.3.6编写 SQL 映射文件 --> 统一管理sql语句,解决硬编码问题 在模块的 resources 目录下创建映射配置文件 DogDaor.xml ,内容如下:

 注意:在resource目录下创建nj.zb.kb21.dao.DogDao时,需要输入nj/zb/kb21/dao.DogDao,这样创建的是和前面DogDao接口创在一个目录下,当配置文件扫描时,只会扫描当前目录,不放在该目录便会报错显示找不到DogDao配置文件。

2.3.7 在test目录下撰写DogTest测试类: public class DogTest { //调用工厂模式 SqlSessionFactory sqlSessionFactory=null; //定义会话 SqlSession sqlSession=null; //定义DogDao对象 DogDao dogDao=null; //初始化 @Before public void init(){ System.out.println("Start"); //加载mybits-config.xml配置文件 InputStream inputStream = DogTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml"); //获取builder建造工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //通过建造工厂建造SqlSessionFactory sqlSessionFactory= builder.build(inputStream); //创建Session会话 sqlSession = sqlSessionFactory.openSession(); //获取Session会话的执行者 dogDao = sqlSession.getMapper(DogDao.class); } //关闭,释放资源 @After public void down(){ sqlSession.commit(); sqlSession.close(); System.out.println("Over"); }

 showinfo一下看一下写的是否有错误:

@Test public void showInfo(){ System.out.println(sqlSessionFactory); System.out.println(sqlSession); System.out.println(dogDao); } 2.4 新增 修改 删除操作

 确认代码执行无错,开始执行上方DogDao里面我写好的SQL语句,创建测试类来执行:

2.4.1首先是单个添加:

DogDao.xml文件中语句(放在mapper中):

注意:以下所有的接口方法全都已经创建好,在前面DogDao接口中已经写好。

insert into dog(name, health, love, strain, lytm) values (#{name}, #{health}, #{love}, #{strain}, now())

 测试类语句:

insert into dog(name, health, love, strain, lytm) values (#{name}, #{health}, #{love}, #{strain}, now()) 2.4.2其次是单个修改:

DogDao.xml文件中语句:

update dog set name=#{name}, health=#{health} where id = #{id}

  测试类语句:

@Test public void testUpdateDog(){ Dog dog = new Dog(); dog.setId(47); dog.setName("冰糖葫芦"); dog.setHealth(99); dogDao.update(dog); }

2.4.3之后是单个删除:

DogDao.xml文件中语句:

delete from dog where id = #{id}

  测试类语句:

@Test public void testdeleteDog(){ Integer dogid=48; dogDao.delete(dogid); } 2.4.4接下来便是多个删除:

 DogDao.xml文件中语句:

delete from dog where id in #{id}

测试类语句: 

@Test public void testBatchDeleteDog(){ List dogs=new ArrayList(); dogs.add(21); dogs.add(22); dogs.add(23); dogs.add(24); dogs.add(25); dogs.add(26); dogDao.batchDelete(dogs); } 2.4.5接下来便是多个添加:

 DogDao.xml文件中语句:

dog insert into values (null,#{dog.name},#{dog.health},#{dog.love},#{dog.strain},now())

 测试类语句:

@Test public void testBatchAdd(){ List dogs=new ArrayList(); Dog dog1 = new Dog("康师傅", 98, 100, "萨摩耶"); Dog dog2 = new Dog("同盟", 90, 88, "拉布拉多"); Dog dog3 = new Dog("统一", 91, 90, "约克夏"); Dog dog4 = new Dog("西泉", 96, 98, "五金犬"); dogs.add(dog1); dogs.add(dog2); dogs.add(dog3); dogs.add(dog4); dogDao.batchAdd(dogs); for (Dog dog : dogs) { System.out.println(dog); } }  2.4.6最后是多个修改:

 DogDao.xml文件中语句:

update name=#{dog.name}, health=#{dog.health}, strain=#{dog.strain}, where id=#{dog.id}

 测试类语句:

@Test public void testUpdateDogs(){ List dogs=new ArrayList(); Dog dog1 = new Dog(36,"康师傅"); Dog dog2 = new Dog(37, 90, "拉布拉多"); Dog dog3 = new Dog(38,"统一", "约克夏"); Dog dog4 = new Dog(39,"西泉", "五金犬"); dogs.add(dog1); dogs.add(dog2); dogs.add(dog3); dogs.add(dog4); dogDao.batchUpdate(dogs); }

编写xml文件中注意符号问题。 

2.5 查询

DogDao接口中所有的查询方法

// 查询所有 List findAllDog(); // 根据狗狗id找出狗狗的详细信息以及所有领养此狗狗的所有主人信息(集合)一对一 Dog getDogAndMastersByDogId(Integer dogId); // 根据狗狗品种找出狗狗的详细信息以及所有领养此品种狗狗的所有主人信息(集合) List getDogAndMastersByDogStrain(String dogstrain); List getDogAndMastersByDoghealth(Integer health); // 根据狗狗的名字(模糊查询)和亲密度查询狗狗信息,可以自由选择降序和升序(1.升序 2.降序) List getDogByNameAndLove(@Param("dogname") String dogName, @Param("doglove") Integer love, @Param("ordervalue") Integer orderValue); List getDogByStrainAndLove(@Param("dogstrain") String Strain, @Param("doglove") Integer love, @Param("ordervalue") Integer orderValue); // Dog list StrainInfo Dog getDogAndMastersAndStrainInfoByDogId(Integer dogId);

 @Param用于命名。

2.5.1 查询所有 

 在resource文件的nj.zb.kb21路径下的DogDao.xml文件下撰写查询所有的方法

select id, name, health, love, strain, lytm from dog

  测试类语句:

@Test public void testFindAllDog() { List dogs = dogDao.findAllDog(); for (Dog dog : dogs ) { System.out.println(dog); } } 2.5.2 根据狗狗id找出狗狗的详细信息以及所有领养此狗狗的所有主人信息(集合)一对多

DogDao.xml文件中语句:

select d.id, d.name, d.health, d.love, d.strain, d.lytm, m.pid, m.name uname, m.age, m.gender, m.yearnum, m.did from dog d left join master m on d.id = m.did where d.id = #{dogid};

这里我借助resultMap来解决列名不匹配,因为调用了两表里面的表属性有的相同,所有借用resultMap。

  测试类语句:

@Test public void testDogAndMastersByDogId() { Dog dog = dogDao.getDogAndMastersByDogId(7); System.out.println("打印狗狗信息"); System.out.println(dog.toString()); System.out.println("打印主人信息"); List masters = dog.getMasters(); for (Master master : masters) { System.out.println(master); } }

 2.5.3 根据狗狗品种找出狗狗的详细信息以及所有领养此品种狗狗的所有主人信息(集合)

 DogDao.xml文件中语句:

select d.id, d.name, d.health, d.love, d.strain, d.lytm, m.pid, m.name uname, m.age, m.gender, m.yearnum, m.did from dog d left join master m on d.id = m.did where d.strain = #{dogstrain};

测试类语句:

@Test public void testDogAndMastersByDogStrain() { List dogs = dogDao.getDogAndMastersByDogStrain("中华田园犬"); System.out.println("打印狗狗信息"); for (Dog dog : dogs) { System.out.println(dog.toString()); System.out.println("打印主人信息"); List masters = dog.getMasters(); for (Master master : masters) { System.out.println(master.toString()); } } }

 2.5.4 根据狗狗的名字(模糊查询)和亲密度查询狗狗信息,可以自由选择降序和升序(1.升序 2.降序)

DogDao.xml文件中语句:

select id, name, health, love, strain, lytm from dog name like concat('%',#{dogname},'%') and love=#{doglove} order by lytm asc order by lytm desc order by id desc

测试类语句: 

@Test public void TestgetDogByNameAndLove(){ List dogs=dogDao.getDogByNameAndLove("d",100,1); // List dogs=dogDao.getDogByNameAndLove("雪",100,1); for (Dog dog : dogs) { System.out.println(dog.toString()); } }

2.5.5 关联三个表再用id来查询所有信息

创建类straintype.

public class StrainType { private Integer id; private String name; private String describe; @Override public String toString() { return "StrainType{" + "id=" + id + ", name='" + name + '\'' + ", describe='" + describe + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } public StrainType(Integer id, String name, String describe) { this.id = id; this.name = name; this.describe = describe; } public StrainType() { } }

 

需要在Dog类中插入一个属性:

再getset方法 

 DogDao.xml文件中语句:

select d.id, d.name, d.health, d.love, d.strain, d.lytm, s.id sid, s.name sname, s.describe, m.pid, m.name uname, m.age, m.gender, m.yearnum, m.did from dog d left join straininfo s on d.strain = s.name left join master m on d.id = m.did where d.id = #{dogId};

 测试类语句:

@Test public void testDogAndMastersByDogStrainInfoByDogId() { Dog dog = dogDao.getDogAndMastersAndStrainInfoByDogId(7); System.out.println("狗狗信息"); System.out.println(dog.toString()); System.out.println("主人信息"); List masters = dog.getMasters(); for (Master master : masters) { System.out.println(master.toString()); } System.out.println("狗狗品种信息"); System.out.println(dog.getStrainType().toString()); }

 需要注意strainType方法里面需要加上无参构造方法。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3