MyBatis第二课 MyBatis映射文件的CRUD操作<方式一>

Posted 笔触狂放

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis第二课 MyBatis映射文件的CRUD操作<方式一>相关的知识,希望对你有一定的参考价值。

概念

【MyBatis】第一课 MyBatis的框架的搭建和使用_笔触狂放的博客-CSDN博客

本文在上一篇文章之后,操作数据库的增删改查。

1.查询操作

在mapper.xml映射文件中编写查询的sql语句,根据不同的条件和查询的字段进行分析和设置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--在mapper标签上添加一个属性,用于设置命名空间-->
<mapper namespace="com.book.dao">
    <!--查询有多少本图书     编写任何要执行的sql语句都要注意两点,1.是都需要传入数据,2.返回值是什么-->
    <select id="getBookNumber" resultType="int">
        SELECT COUNT(*) FROM book
    </select>

    <select id="getBookName" resultType="String" >
        select name from book where id=1
    </select>

    <!--当执行的sql语句中需要传入参数时,需要添加parameterType属性设置参数的数据类型-->
    <!--#字段名:作为参数的占位符-->
    <select id="getBookName1" resultType="String" parameterType="int">
        select name from book where id=#id
    </select>

    <!--查询作者为罗贯中,书籍的价格为98的书籍名称-->
    <!--当执行的sql中需要传入多个参数,而且参数的数据类型不同,将参数的类型设置为Map或者自定义实体类-->
    <select id="getBookName2" resultType="String" parameterType="Map">
        select name from book where author=#author and price=#price
    </select>

    <!--查询作者为罗贯中,书籍的价格为98的书籍名称-->
    <!--当执行的sql中需要传入多个参数,而且参数的数据类型不同,将参数的类型设置为Map或者自定义实体类-->
    <select id="getBookName3" resultType="String" parameterType="com.book.entity.Book">
        select name from book where author=#author and price=#price
    </select>

    <!--查询多个字段,传入单个参数-->
    <!--查询图书编号为2的,书名,作者,单价,数量-->
    <!--当查询的返回值是多个数据,返回值类型可以定义为自定义实体类或者Map-->
    <select id="getBookById" resultType="com.book.entity.Book" parameterType="int">
        SELECT name,author,price,count from book where id=#id
    </select>

    <!--查询多个字段,传入单个参数-->
    <!--查询图书编号为2的,书名,作者,单价,数量-->
    <!--当查询的返回值是多个数据,返回值类型可以定义为自定义实体类或者Map-->
    <select id="getBookById1" resultType="Map" parameterType="int">
        SELECT name,author,price,count from book where id=#id
    </select>

    <!--查询多条数据,不传参数-->
    <!--将book表中所有书籍信息查询出来-->
    <!--如果选择用Map集合存储一条数据,那么查询出来的多条数据就需要多个Map集合,格式就需要List<Map>
    但是resultType属性中不需要写为List<Map>,只需要写Map即可-->
    <select id="selectAll" resultType="Map">
        select * from book
    </select>

    <!--查询多条数据,不传参数-->
    <!--将book表中所有书籍信息查询出来-->
    <!--如果选择用Map集合存储一条数据,那么查询出来的多条数据就需要多个Map集合,格式就需要List<Map>
    但是resultType属性中不需要写为List<Map>,只需要写Map即可-->
    <select id="selectAll1" resultType="com.book.entity.Book">
        select * from book
    </select>

    <!--查询多条数据,传入参数-->
    <!--从book中搜索书名中包含“西”的所有书籍信息-->
    <select id="selectLike" parameterType="String" resultType="Map">
        select * from book where name like #name
    </select>

   

</mapper>

 在测试类中定义执行不同sql语句的测试方法,根据指定的id属性的值定位要执行的sql,并根据设置的参数类型进行传递参数和获得返回值。

package com.book.test;

import com.book.entity.Book;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/7.
 */
public class BookTest 
    public SqlSession ss=null;
    public void init()
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建执行sql语句的工厂生成器    工厂模式,策略模式
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //创建SqlSessionFactory对象
            SqlSessionFactory factory = builder.build(is);
            //获得sqlsession对象
            ss=factory.openSession();
         catch (Exception e) 
            e.printStackTrace();
        
    

    @Test
    public void One()
        init();
        int i= ss.selectOne("com.book.dao.getBookNumber");
        System.out.println("查询到的书籍的数量为:"+i+"本");
    

    @Test
    public void Two()
        init();
        String name=ss.selectOne("com.book.dao.getBookName");
        System.out.println("获得图书的名称为:"+name);
    

    @Test
    public void Two1()
        init();
        //将参数作为占位符的形式传入sql语句
        String name=ss.selectOne("com.book.dao.getBookName1",3);
        System.out.println("获得图书的名称为:"+name);
    

    @Test
    public void three()
        init();
        //先将需要传入的数据进行封装成Map集合
        //对象关系型映射
        Map<String,Object> map=new HashMap<>();
        map.put("author","罗贯中");
        map.put("price",98);
        //查询的是单条数据
        String name=ss.selectOne("com.book.dao.getBookName2",map);
        System.out.println("获得图书的名称为:"+name);
    

    @Test
    public void four()
        init();
        //将要传入的参数数据封装到实体类中
        Book book=new Book();
        book.setAuthor("罗贯中");
        book.setPrice(98);
        //查询的是单条数据
        String name=ss.selectOne("com.book.dao.getBookName3",book);
        System.out.println("获得图书的名称为:"+name);
    

    @Test
    public void five()
        init();
        //查询的还是单条数据
        Book book=ss.selectOne("com.book.dao.getBookById",2);
        System.out.println(book);
    

    @Test
    public void five1()
        init();
        Map<String,Object> map=ss.selectOne("com.book.dao.getBookById1",2);
        System.out.println(map);
    

    @Test
    public void six()
        init();
        //查询多条数据
        List<Map<String,Object>> books=ss.selectList("com.book.dao.selectAll");
        books.forEach(map-> System.out.println(map));
    

    @Test
    public void six1()
        init();
        List<Book> books=ss.selectList("com.book.dao.selectAll1");
        books.forEach(book -> System.out.println(book));
    

    @Test
    public void seven()
        init();
        List<Map<String,Object>> books=ss.selectList("com.book.dao.selectLike","%西%");
        books.forEach(map -> System.out.println(map) );
    

  

   

2.添加操作

在mapper.xml文件中编写添加的sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--在mapper标签上添加一个属性,用于设置命名空间-->
<mapper namespace="com.book.dao">


    <!--添加书籍-->
    <!--在执行添加,修改,删除操作的时候,数据库默认会返回int类型,不需要添加resultType属性-->
    <insert id="addBook" parameterType="Map">
        insert into book(name,author,price,count) values(#name,#author,#price,#count)
    </insert>

   

</mapper>

在测试类中进行测试

package com.book.test;

import com.book.entity.Book;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/7.
 */
public class BookTest 
    public SqlSession ss=null;
    public void init()
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建执行sql语句的工厂生成器    工厂模式,策略模式
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //创建SqlSessionFactory对象
            SqlSessionFactory factory = builder.build(is);
            //获得sqlsession对象
            ss=factory.openSession();
         catch (Exception e) 
            e.printStackTrace();
        
    

  

    @Test
    public void eight()
        init();
        //创建Map集合,将要添加的数据封装起来
        Map<String,Object> map=new HashMap<>();
        map.put("name","水浒传");
        map.put("author","施耐庵");
        map.put("price",198);
        map.put("count",120);
        int i=ss.insert("com.book.dao.addBook",map);
        //在执行添加,修改,删除操作的时候,涉及数据库的事务的回滚,因此,在执行这三种操作的时候
        //需要做提交的操作
        ss.commit();
        if(i>0)
            System.out.println("添加成功");
        
    


3.修改操作

在mapper.xml文件中编写修改的sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--在mapper标签上添加一个属性,用于设置命名空间-->
<mapper namespace="com.book.dao">


    <!--修改语句-->
    <!--修改书籍编号为2的图书的价格135,数量80-->
    <update id="updateBook" parameterType="com.book.entity.Book">
        update book set price=#price,count=#count where id=#id
    </update>


</mapper>

在测试类中进行测试

package com.book.test;

import com.book.entity.Book;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/7.
 */
public class BookTest 
    public SqlSession ss=null;
    public void init()
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建执行sql语句的工厂生成器    工厂模式,策略模式
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //创建SqlSessionFactory对象
            SqlSessionFactory factory = builder.build(is);
            //获得sqlsession对象
            ss=factory.openSession();
         catch (Exception e) 
            e.printStackTrace();
        
    


    @Test
    public void nine()
        init();
        //创建book实体类
        Book book=new Book();
        book.setPrice(135);
        book.setCount(80);
        book.setId(2);
        int i=ss.update("com.book.dao.updateBook",book);
        ss.commit();
        if (i>0)
            System.out.println("修改成功");
    


4.删除操作

在mapper.xml文件中编写删除的sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--在mapper标签上添加一个属性,用于设置命名空间-->
<mapper namespace="com.book.dao">


    <!--删除语句-->
    <!--删除书名为"西游记"的书籍-->
    <delete id="delBook" parameterType="String">
        delete from book where name=#name
    </delete>

</mapper>

在测试类中进行测试

package com.book.test;

import com.book.entity.Book;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2022/3/7.
 */
public class BookTest 
    public SqlSession ss=null;
    public void init()
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //创建执行sql语句的工厂生成器    工厂模式,策略模式
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //创建SqlSessionFactory对象
            SqlSessionFactory factory = builder.build(is);
            //获得sqlsession对象
            ss=factory.openSession();
         catch (Exception e) 
            e.printStackTrace();
        
    


    @Test
    public void ten()
        init();
        int i=ss.delete("com.book.dao.delBook","西游记");
        ss.commit();
        if (i>0)
            System.out.println("删除成功");
    

总结

在以上的代码中,涉及到自定义实体类的操作,一般自定义实体类的封装以数据库中要操作的表进行对应。其代码如下:

package com.book.entity;

/**
 * Created by Administrator on 2022/3/9.
 * 在定义实体类的时候,需要遵循对象关系型映射,所定义的类名需要和数据库的表的名称一致
 * 类中所定义的所有全局变量的变量名需要和对应的表中字段名保持一致
 * 所有全局变量的数据类型要和对应的表中字段的数据类型保持一致
 */
public class Book 
    private int id;
    private String name;
    private String author;
    private double price;
    private int count;

    @Override
    public String toString() 
        return "Book" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", author='" + author + '\\'' +
                ", price=" + price +
                ", count=" + count +
                '';
    

    public Book() 
    

    public Book(int id, String name, String author, double price, int count) 
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
        this.count = count;
    

    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;
    

    public String getAuthor() 
        return author;
    

    public void setAuthor(String author) 
        this.author = author;
    

    public double getPrice() 
        return price;
    

    public void setPrice(double price) 
        this.price = price;
    

    public int getCount() 
        return count;
    

    public void setCount(int count) 
        this.count = count;
    

本文的测试采用JUnit框架进行单元测试,无需运行整个项目,只需要执行单个的方法即可。即对于JUnit框架的使用并未掌握的初学者,可查阅【Jsp】第十一课 JDBC的回顾及单元测试框架的使用_笔触狂放的博客-CSDN博客

以上是关于MyBatis第二课 MyBatis映射文件的CRUD操作<方式一>的主要内容,如果未能解决你的问题,请参考以下文章

第二节:mybatis之返回值总结

Mybatis-----优化配置文件,基于注解CR

MyBatis的操作与配置文件

MyBatis框架之第二篇

Mybatis-XML-入门示例

mybatis映射文件Xml比较大小写法