mybits入门及增删改查学习 |
您所在的位置:网站首页 › 导出查询到的sql数据 › mybits入门及增删改查学习 |
一.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 注意:在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用于命名。 在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 |