MyBatis第三讲:MyBatis实现CRUD

五、数据层实现MyBatis基本操作

5、1实体层

创建实体类,用于装载数据库数据到程序中

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private Integer id;
    private String name;
    private double price;
}
//使用lombok实现代码简化

5、2数据层

创建数据层接口,用以调用方法执行SQL操作,同时数据层接口映射Mapper。使用DAO作为接口目录,引入MyBatis后,常用Mapper作为接口名称

public interface IBookDAO {
  //查询所有方法
  List<Book> findAll();
  //根据id查询对象
  Book findBookById(int id);
  //添加信息
  int saveBook(Book book);
  //修改信息
  int updateBook(Book book);
  //删除信息
  int deleteBook(int id);
}

5、3配置Mapper

在resources文件夹中,创建mapper文件夹,用于存放mapper映射器配置文件,配置文件以Mapper为后缀,以xml格式存储内容


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.demo.DAO.IBookDAO">
  
  <select id="findAll" resultType="com.demo.entity.Book">
    select * from book
  select>
  
  <select id="findBookById" resultType="com.demo.entity.Book" parameterType="int">
    select * from book where id=#{id}
  select>
  
  <insert id="saveBook" parameterType="com.demo.entity.Book" keyProperty="id" useGeneratedKeys="true">
    insert into book(name,price) values (#{name},#{price})
  insert>
  
  <update id="updateBook" parameterType="com.demo.entity.Book">
    update book set name=#{name},price=#{price} where id=#{id}
  update>
  
  <delete id="deleteBook" parameterType="int">
    delete from book where id=#{id}
  delete>
mapper>

注意事项:

  • namespace必须与接口全路径名相同
  • id必须与方法名相同
  • 配置好mapper.xml后要在MyBatis核心配置文件中mappers中进行配置

5、4Mapper输入输出

5、4、1Mapper输入映射

MyBatis的输入映射,使用parameterType属性完成映射

  • 当接口方法参数为一个基本数据类型时,parameterType可以配置一个基本数据类型
  • 当接口方法参数为一个实体对象类型时,parameterType可以配置一个实体对象类型
  • 当接口方法参数为多个且不为同一实体对象类型的属性时,parameterType可以配置一个集合类型【如List、Map】

5、4、2Mapper输出映射

MyBatis的输出映射,使用resultType属性完成映射【使用resultType映射,要保证数据库字段名与实体对象属性名一致】

  • 当返回结果为一条数据时,resultType可以映射到一个实体类型对象
  • 当返回结果为多条数据时,resultType可以映射为集合类型,集合类型中装载的对象为resultType映射的实体对象类型
  • 当返回结果为一条数据,并且为一条数据中的一列数据时,resultType可以映射为一个基本数据类型

5、5Mapper实体映射

在MyBatis映射中,如果数据库字段名与实体对象属性名一致,可以使用resultType进行映射,如果出现数据库字段名与实体对象属性名不一致时,在mapper.xml配置文件中,使用resultMap标签进行映射

<resultMap id="bookType" type="Book">
  
  <id column="id" property="id" javaType="integer" jdbcType="INTEGER"/>
  
  <result column="name" property="name" javaType="String" jdbcType="VARCHAR"/>
  <result column="price" property="price" javaType="_double" jdbcType="DOUBLE"/>
resultMap>


<select id="findAll" resultMap="bookType">
  select * from book
select>

注意:resultMap不仅可以作为返回值结果,也可以对数据库字段名和实体对象属性名之间进行映射,解决数据库字段名与实体属性名不一致的问题。

5、6Mapper接收参数

MyBatis中在使用方法时,需要向方法传递所需要的参数,mapper配置文件会根据方法的参数进行解析,将所需要的参数配置到SQL语句中。MyBatis传递参数的方式一共有五种:

5、6、1传递具体数据类型的参数,并按照顺序使用

<select id="findAll" resultMap="bookType" useCache="true">
  select b.id,b.name,b.price,l.lid,l.userId,l.bookId from book b left join log l on b.id=l.bookId where name like #{param1} and price>#{param2}
select>

param1和param2的数值,是方法的参数顺序,必须严格按照参数顺序传参,在参数较多的情况下不够灵活

5、6、2使用注解进行参数传递

List<Book> findAll(@Param("name") String name,@Param("price") double price);

在mapper配置文件中SQL语句参数变量名称要和@Param注解中定义的参数名称一样。

5、6、3使用实体对象传递参数

int saveBook(Book book);
<insert id="saveBook" parameterType="com.demo.entity.Book" keyProperty="id" useGeneratedKeys="true">
  insert into book(name,price) values (#{name},#{price})
insert>

使用实体对象类型的方式来传递多个参数,使用时parameterType参数类型指定为对应的实体对象类型

5、6、4使用Map集合传递参数

<insert id="insertBook" parameterType="map" keyProperty="id" useGeneratedKeys="true" >
  insert into book(name,price) values (#{name},#{price})
insert>

使用map集合来传递多个参数进行操作,可以直接在SQL语句中使用参数名称【map中的键】进行引用。

5、6、5使用List集合传递参数

<insert id="insertBook2" parameterType="list" keyProperty="id" useGeneratedKeys="true" >
  insert into book(name,price) values
  
  <foreach collection="list" item="book" separator=",">
    (#{book.name},#{book.price})
  foreach>
insert>

5、6、6#{}和${}两种方式接收参数

mapper在传递参数时,可以通过#{}和${}两种方式接收参数,两种方式的区别在于

使用#{}接收参数

  • #{}实现的是像prepareStatement中的预处理语句中设计参数值,sql语句中#{}表示一个占位符即?
  • 使用占位符#{}可以有效的防止sql注入,在使用时不需要关心参数值的类型,MyBatis会自动进行java类型和jdbc类型的转换
  • #{}可以接收简单类型值或实体对象属性值,如果parameterType传输单个简单类型值,#{}括号中可以是参数顺序或参数名

使用${}接收参数

  • 通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换
  • 可以接收简单型值或实体对象属性值,如果 p a r a m e t e r T y p e 传输单个简单类型值, {}可以接收简单型值或实体对象属性值,如果parameterType传输单个简单类型值, 可以接收简单型值或实体对象属性值,如果parameterType传输单个简单类型值,{}括号中只能是参数名
  • 使用${}不能防止sql注入

5、7实现CRUD

//通过SqlSession获取对象
SqlSession sqlSession= MybatisUtil.getSqlSession();
//加载接口对象获取mapper
IBookDAO bookDAO=sqlSession.getMapper(IBookDAO.class);
//新增数据
Book b=new Book();
b.setName("水浒传");
b.setPrice(1000);
int result=bookDAO.saveBook(b);
System.out.println(result);
System.out.println("---------------");
//根据id查询数据
Book book=bookDAO.findBookById(23);
System.out.println(book);
System.out.println("---------------");
//修改数据
book.setName("红楼梦");
book.setPrice(123);
int result1=bookDAO.updateBook(book);
System.out.println(result1);
System.out.println("---------------");
//删除数据
int resukt2=bookDAO.deleteBook(26);
System.out.println(resukt2);
System.out.println("---------------");
//查询所有数据
List<Book> list=bookDAO.findAll();
list.forEach(System.out::println);
//提交事务
sqlSession.commit();
//关闭SqlSession对象
sqlSession.close();

你可能感兴趣的:(MyBatis,mybatis,java,mysql)