重新开始学MyBatis—02基于xml和注解分别实现的增编削查 ...

打印 上一主题 下一主题

主题 660|帖子 660|积分 1980

首先介绍此次利用的数据库布局,然后引出注意事项。
  通过基于xml和基于注解的方式分别实现了增编削查,另有获取参数值、返回值的不同类型对比,帮助大家一次性把握两种代码编写能力。
  
目次
数据库
数据库表
实体类
对应的实体类如下:
注意事项
1)两种占位符的阐明
①#{}
②${}
2)增、删、改的返回值阐明
3)查询操作
①必须指定resultType或是resultMap
4)对应关系
①数据库名与类名不一致的情况
②字段名与属性名不一致的情况
1.获取参数值的方式
1.1基于xml
1.1.1单个参数
①mapper
②xml
③test
④结果
1.1.2多个参数
①mapper
②xml
写法一
写法二
③test
④结果
1.1.3map参数
①mapper
②xml
③test
④结果
1.1.4实体类参数
①mapper
②xml
③test
④结果
1.1.5利用@Param标识参数
①mapper
写法一
写法二
错误写法
②xml
③test
④结果
1.2基于注解
1.2.1单个参数
①mapper
写法一
写法二
②test
③结果
1.2.2多个参数
①mapper
 ②test
③结果
1.2.3map参数
①mapper
②test
③结果
1.2.4实体类参数
①mapper
②test
③结果
1.2.5利用@Param标识参数
①mapper
写法一
写法二
②test
③结果
2.各种操作功能
2.1基于xml
2.1.1增
①mapper
②mapper.xml
③test
④结果
主键id自增并返回值
mapper
mapper.xml
test
结果
2.1.2删
①mapper
②mapper.xml
③test
④结果
删除前
删除后
2.1.3改
①mapper
②mapper.xml
③test
④结果
修改前
修改后
2.1.4查
①mapper
②mapper.xml
③test
④结果
2.2基于注解
2.2.1增
①mapper
②test
③结果
主键id自增并返回结果
mapper
test
结果
2.2.2删
①mapper
②test
③结果
删除前
删除后
2.2.3改
①mapper
②test
③结果
修改前
修改后
2.2.4查
①mapper
②test
③结果
3.各种返回值类型
3.1基于xml
①查询单条数据
②查询多条数据
3.2基于注解
①查询单条数据
②查询多条数据



数据库

数据库表

此次实行的数据库表布局如下,包含主键id和三个属性

实体类

对应的实体类如下:

  1. import com.baomidou.mybatisplus.annotation.TableName;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * ClassName: Book
  7. * Package: com.ykx.domain
  8. * Description: mybatis学习的数据库表tbl_book对应的实体类
  9. */
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. @TableName("tbl_book")
  14. public class Book {
  15.     private Integer id;
  16.     private String type;
  17.     private String name;
  18.     private String description;
  19. }
复制代码

注意事项

1)两种占位符的阐明

①#{}

   传入的参数当成一个字符串,会给传入的参数加单引号
  可以或许很大程度上防止sql注入
  一样平常用于更换某个值
  ②${}

   将传入的参数值直接体现天生在sql中,不会主动加引号
  预编译之前就已经被变量更换,无法防止sql注入
  一样平常用于更换表、字段名
  2)增、删、改的返回值阐明

   返回值固定位Integer,表示受影响的行数
  3)查询操作

①必须指定resultType或是resultMap

   不配置别名的时候,值为类的全类名
  返回值是聚集的时候,只需指定聚集的泛型即可,如
  1. List<Book> getAll();
  2. <select id="getAll" resultType="com.ykx.pojo.Book">
  3.     select * from tbl_book
  4. </select>
复制代码
4)对应关系

①数据库名与类名不一致的情况


②字段名与属性名不一致的情况



1.获取参数值的方式

MyBatis 提供了多种传递参数的方式到 SQL 。
理解参数传递的机制有助于提高代码的可读性、灵活性。
1.1基于xml

1.1.1单个参数


①mapper

  1. Book getById(Integer id);
复制代码
②xml

在单个字面量参数的情况下,{}内的名称可以恣意取
如下面的代码可以把#{id} 改成 #{ID}亦或是其他
  1. <select id="getById" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where id = #{id}
  3. </select>
复制代码
③test

  1. @Test
  2. public void testSelect(){
  3.     Book book = bookMapperXML.getById(1);
  4.     System.out.println(book);
  5. }
复制代码
④结果



1.1.2多个参数


①mapper

  1. Book check(String type,String name);
复制代码
②xml

写法一

  1. <select id="check" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where type = #{type} and name = #{name}
  3. </select>
复制代码
写法二

  1. <select id="check" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where type = #{param1} and name = #{param2}
  3. </select>
复制代码
③test

  1. @Test
  2. public void testCheck(){
  3.     Book book = bookMapperXML.check("java","mybatis数据");
  4.     System.out.println(book);
  5. }
复制代码
④结果



1.1.3map参数


①mapper

  1. Book checkByMap(Map<String,String> map);
复制代码
②xml

  1. <select id="checkByMap" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where type = #{type} and name = #{name}
  3. </select>
复制代码
③test

  1. @Test
  2. public void testCheckByMap(){
  3.     Map<String,String> map = new HashMap<>();
  4.     map.put("type","java");
  5.     map.put("name", "mybatis数据");
  6.     Book book = bookMapperXML.checkByMap(map);
  7.     System.out.println(book);
  8. }
复制代码
④结果



1.1.4实体类参数


①mapper

  1. Integer insert(Book book);
复制代码
②xml

  1. <insert id="insert">
  2.     insert into tbl_book (type,name,description) values(#{type},#{name},#{description})
  3. </insert>
复制代码
③test

  1. @Test
  2. public void testInsert(){
  3.     Book book = new Book(null,"计算机视觉","三维重建","基于深度学习的三维重建");
  4.     Integer ans = bookMapperXML.insert(book);
  5.     System.out.println("受影响的行数:" + ans);
  6. }
复制代码
④结果


1.1.5利用@Param标识参数


    在字段名和属性名对不上或是参数名和字段名对不上的时候很有效
  ①mapper

写法一

  1. Book check(@Param("type") String type, @Param("name") String name);
复制代码
写法二

  1. Book check(@Param("type") String type2, @Param("name") String name2);
复制代码
错误写法

  1. Book check(String type2, String name2);
复制代码
②xml

  1. <select id="check" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where type = #{type} and name = #{name}
  3. </select>
复制代码
③test

  1. @Test
  2. public void testCheck(){
  3.     Book book = bookMapperXML.check("java","mybatis数据");
  4.     System.out.println(book);
  5. }
复制代码
④结果



1.2基于注解

1.2.1单个参数

①mapper

   单个参数的情况下,接口的参数名和注解里的sql语句参数可以不一致
  写法一

  1. @Select("select * from tbl_book where id = #{id}")
  2. Book getById(Integer id);
复制代码
写法二

  1. @Select("select * from tbl_book where id = #{aa}")
  2. Book getById(Integer id);
复制代码
②test

  1. @Test
  2. public void testSelect(){
  3.     Book book = bookMapper.getById(78);
  4.     System.out.println(book);
  5. }
复制代码
③结果



1.2.2多个参数

①mapper

   注:在未利用@Param的情况下,参数名不对应或是顺序不一样会导致查询失败
  1. @Select("select * from tbl_book where type = #{type} and name = #{name}")
  2. Book getOne(String type,String name);
复制代码
 ②test

  1. @Test
  2. public void testGetOne(){
  3.     Book book = bookMapper.getOne("计算机视觉","三维重建");
  4.     System.out.println(book);
  5. }
复制代码
③结果



1.2.3map参数

①mapper

  1. @Select("select * from tbl_book where type = #{type} and name = #{name}")
  2. Book getByMap(Map<String, String> map);
复制代码
②test

   注:map里的key值要和#{}里的值对应,否则出现查询失败的情况
  1. @Test
  2. public void testByMap(){
  3.     Map<String,String> map = new HashMap<>();
  4.     map.put("type","java");
  5.     map.put("name", "mybatis数据");
  6.     Book book = bookMapper.getByMap(map);
  7.     System.out.println(book);
  8. }
复制代码
③结果



1.2.4实体类参数

①mapper

  1. @Insert("insert into tbl_book (id,type,name,description) " +
  2.         "values(#{id},#{type},#{name},#{description})")
  3. Integer insert(Book book);
复制代码
②test

  1. @Test
  2. public void testInsert(){
  3.     Book book = new Book(null,"新增数据","测试新增","不带id的新增测试");
  4.     Integer ans = bookMapper.insert(book);
  5.     System.out.println("受影响的行数:" + ans);
  6. }
复制代码
③结果



1.2.5利用@Param标识参数

   只需要#{}里的值和@Param()里的值一样就行
  ①mapper

写法一

  1. @Select("select * from tbl_book where type = #{type} and name = #{name}")
  2. Book getOne(@Param("type") String type,@Param("name") String name);
复制代码
写法二

  1. @Select("select * from tbl_book where type = #{type} and name = #{name}")
  2. Book getOne(@Param("type") String typeaa,@Param("name") String nameaa);
复制代码
②test

  1. @Test
  2. public void testGetOne(){
  3.     Book book = bookMapper.getOne("计算机视觉","三维重建");
  4.     System.out.println(book);
  5. }
复制代码
③结果



2.各种操作功能

2.1基于xml

2.1.1增

①mapper

  1. //增:实体对象新增数据
  2. Integer insert(Book book);
复制代码
②mapper.xml

  1. <insert id="insert">
  2.     insert into tbl_book (id,type,name,description) values(#{id},#{type},#{name},#{description})
  3. </insert>
复制代码
  :这里设置了id主键自增的话,可以不设置和传入id
  ③test

  1. //增:实体对象新增数据
  2. @Test
  3. public void testInsert(){
  4.     Book book = new Book(71,"计算机视觉","三维重建","基于深度学习的三维重建");
  5.     Integer ans = bookMapperXML.insert(book);
  6.     System.out.println("受影响的行数:" + ans);
  7. }
复制代码
④结果



主键id自增并返回值

   关键点:在xml里需要带上useGeneratedKeys和keyProperty
  mapper

  1. Integer autoId(Book book);
复制代码
mapper.xml

  1. <insert id="autoId" useGeneratedKeys="true" keyProperty="id">
  2.     insert into tbl_book (type,name,description) values(#{type},#{name},#{description})
  3. </insert>
复制代码
test

  1. //增:主键自增且返回值
  2. @Test
  3. public void testAutoId(){
  4.     Book book = new Book(null,"测试id自增","返回主键id","是否成功获取id的值");
  5.     Integer ans = bookMapperXML.autoId(book);
  6.     System.out.println("受影响的行数:" + ans);
  7.     System.out.println("获取主键自增的id值:" + book.getId());
  8. }
复制代码
结果




2.1.2删

①mapper

  1. //删:根据id删除数据
  2. Integer delete(Integer id);
复制代码
②mapper.xml

  1. <delete id="delete">
  2.     delete from tbl_book where id = #{id};
  3. </delete>
复制代码
③test

  1. //删:根据id删除数据
  2. @Test
  3. public void testDelete(){
  4.     Integer ans = bookMapperXML.delete(68);
  5.     System.out.println("受影响的行数:" + ans);
  6. }
复制代码
④结果


删除前


删除后



2.1.3改

①mapper

  1. //改:根据id修改数据
  2. Integer update(Book book);
复制代码
②mapper.xml

  1. <update id="update">
  2.     update tbl_book set type = #{type},name = #{name},description = #{description} where id = #{id};
  3. </update>
复制代码
③test

  1. //改:根据id修改数据
  2. @Test
  3. public void testUpdate(){
  4.     Book book = new Book(58,"测试修改","mybatis修改","基于xml的修改操作");
  5.     Integer ans = bookMapperXML.update(book);
  6.     System.out.println("受影响的行数:" + ans);
  7. }
复制代码
④结果


修改前


修改后



2.1.4查

①mapper

  1. @Mapper
  2. public interface BookMapperXML {
  3.    
  4.     //查:根据id查询数据
  5.     Book getById(Integer id);
  6.     //查:查询所有数据
  7.     List<Book> getAll();
  8.    
  9. }
复制代码
②mapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.ykx.mapper.BookMapperXML">
  6.     <select id="getById" resultType="com.ykx.domain.Book">
  7.         select * from tbl_book where id = #{id}
  8.     </select>
  9.    
  10.     <select id="getAll" resultType="com.ykx.domain.Book">
  11.         select * from tbl_book
  12.     </select>
  13. </mapper>
复制代码
③test

  1. @SpringBootTest
  2. public class XMLMybatisTest {
  3.     @Autowired
  4.     private BookMapperXML bookMapperXML;
  5.     //查:根据id查询数据
  6.     @Test
  7.     public void testSelect(){
  8.            Book book = bookMapperXML.getById(1);
  9.     }
  10.    
  11.     //查:查询所有数据
  12.     @Test
  13.     public void testGetAll(){
  14.         List<Book> books = bookMapperXML.getAll();
  15.         for(Book book : books){
  16.             System.out.println(book);
  17.         }
  18.     }
  19. }
复制代码
④结果





2.2基于注解

2.2.1增

①mapper

  1. @Insert("insert into tbl_book (id,type,name,description) " +
  2.         "values(#{id},#{type},#{name},#{description})")
  3. Integer insert(Book book);
复制代码
②test

  1. //增:实体对象新增数据
  2. @Test
  3. public void testInsert(){
  4.     Book book = new Book(11,"新增数据","测试新增","带id的新增测试");
  5.     Integer ans = bookMapper.insert(book);
  6.     System.out.println("受影响的行数:" + ans);
  7. }
复制代码
③结果



主键id自增并返回结果

   关键点:在mapper对应的方法上面加上@Options注解,并设置useGeneratedKeys和keyProperty的属性值。这个只能搭配insert语句利用!
  mapper

  1. @Options(useGeneratedKeys = true,keyProperty = "id")
  2. @Insert("insert into tbl_book (type,name,description) " +
  3.         "values(#{type},#{name},#{description})")
  4. Integer autoId(Book book);
复制代码
test

  1. //增:主键自增且返回值
  2. @Test
  3. public void testAutoId(){
  4.     Book book = new Book(null,"新增数据2","测试新增2","不带id的新增测试");
  5.     Integer ans = bookMapper.autoId(book);
  6.     System.out.println("受影响的行数:" + ans);
  7.     System.out.println("获取主键自增的id值:" + book.getId());
  8. }
复制代码
结果




2.2.2删

①mapper

  1. //删:根据id删除数据
  2. @Delete("delete from tbl_book where id = #{id}")
  3. Integer delete(Integer id);
复制代码
②test

  1. //删:根据id删除数据
  2. @Test
  3. public void testDelete(){
  4.     Integer ans = bookMapper.delete(8);
  5.     System.out.println("受影响的行数:" + ans);
  6. }
复制代码
③结果


删除前


删除后



2.2.3改

①mapper

  1. //改:根据id修改数据
  2. @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
  3. Integer update(Book book);
复制代码
②test

  1. //改:根据id修改数据
  2. @Test
  3. public void testUpdate(){
  4.     Book book = new Book(62,"测试修改","mybatis修改","基于注解的修改操作");
  5.     Integer ans = bookMapper.update(book);
  6.     System.out.println("受影响的行数:" + ans);
  7. }
复制代码
③结果

修改前



修改后



2.2.4查

①mapper

  1. //查:根据id查询数据@Select("select * from tbl_book where id = #{id}")
  2. Book getById(Integer id);//查:查询所有数据
  3. @Select("select * from tbl_book")
  4. List<Book> getAll();
复制代码
②test

  1. //查:根据id查询数据
  2. @Test
  3. public void testSelect(){
  4.     Book book = bookMapper.getById(71);
  5.     System.out.println(book);
  6. }
  7. //查:查询所有数据
  8. @Test
  9. public void testGetAll(){
  10.     List<Book> books = bookMapper.getAll();
  11.     for(Book book : books){
  12.         System.out.println(book);
  13.     }
  14. }
复制代码
③结果



3.各种返回值类型

   对于增、删、改操作一样平常返回值类型为integer,表示数据表受影响的行数。对于查询操作,一样平常返回值类型为实体类或是聚集类型。
  前面已经对增、删、改返回integer进行了测试,这里就不再赘述,下面对查询操作的返回值进行一个总结。
  3.1基于xml

①查询单条数据

   mapper层接口用对应的实体类吸取
  1. //查:根据id查询数据
  2. Book getById(Integer id);
复制代码
  xml文件设置resultType为具体的实体类类型
  1. <select id="getById" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book where id = #{id}
  3. </select>
复制代码
②查询多条数据

   mapper层接口用List聚集吸取,其泛型为对应的实体类类型
  1. //查:查询所有数据
  2. List<Book> getAll();
复制代码
  xml文件设置resultType为具体的实体类类型
  1. <select id="getAll" resultType="com.ykx.domain.Book">
  2.     select * from tbl_book
  3. </select>
复制代码

3.2基于注解

①查询单条数据

   mapper层接口的返回值类型设置为对应的实体类类型即可
  1. //查:根据id查询数据@Select("select * from tbl_book where id = #{id}")
  2. Book getById(Integer id);
复制代码
②查询多条数据

   mapper层接口的返回值类型设置为List聚集,其泛型为对应的实体类类型即可
  1. //查:查询所有数据
  2. @Select("select * from tbl_book")
  3. List<Book> getAll();
复制代码

   原创内容 未经同意克制转载 如有引用请标明出处
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表