创建实体类,用于装载数据库数据到程序中
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private Integer id;
private String name;
private double price;
}
//使用lombok实现代码简化
创建数据层接口,用以调用方法执行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);
}
在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>
注意事项:
MyBatis的输入映射,使用parameterType属性完成映射
MyBatis的输出映射,使用resultType属性完成映射【使用resultType映射,要保证数据库字段名与实体对象属性名一致】
在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不仅可以作为返回值结果,也可以对数据库字段名和实体对象属性名之间进行映射,解决数据库字段名与实体属性名不一致的问题。
MyBatis中在使用方法时,需要向方法传递所需要的参数,mapper配置文件会根据方法的参数进行解析,将所需要的参数配置到SQL语句中。MyBatis传递参数的方式一共有五种:
<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的数值,是方法的参数顺序,必须严格按照参数顺序传参,在参数较多的情况下不够灵活
List<Book> findAll(@Param("name") String name,@Param("price") double price);
在mapper配置文件中SQL语句参数变量名称要和@Param注解中定义的参数名称一样。
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参数类型指定为对应的实体对象类型
<insert id="insertBook" parameterType="map" keyProperty="id" useGeneratedKeys="true" >
insert into book(name,price) values (#{name},#{price})
insert>
使用map集合来传递多个参数进行操作,可以直接在SQL语句中使用参数名称【map中的键】进行引用。
<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>
mapper在传递参数时,可以通过#{}和${}两种方式接收参数,两种方式的区别在于
使用#{}接收参数
使用${}接收参数
//通过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();