1.Mybatis简介
1、MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
2、MyBatis工作原理:对JDBC进行了封装
- 1、SQLSessionFactoryBuilder(构造器):它会根据配置信息或者代码生成SqlSessionFactory。
- 2、SqlSessionFactory(工厂接口):依靠工厂生成SqlSession。
- 3、SqlSession(会话):是一个既可以发送SQL去执行并且返回结果,也可以获取Mapper接口。
- 4、SQL Mapper:是由一个JAVA接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。SQL是由Mapper发送出去,并且返回结果。
3.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis是对JDBC的封装。
2.创建Springboot工程
1.在idea中,SpringBoot项目可以使用框架直接生成,但目前只能创建3.26及以上版本,只支持JDK17及以上版本。用框架建立能够通过勾选直接帮我们导入所需的依赖,但只能创建3.26及以上版本的项目,目前jdk8仍然是主流,所以企业开发中springboot3.0以上使用也较少。如果是建立低版本的spring boot项目可以先建立maven工程,然后再手动导入相应的依赖,并手动编写启动类。
2.1.导入相关依赖
<!-- 数据库-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2.编写配置文件application.yml
配置文件有三种格式,yml,yaml,properties
spring:
thymeleaf:
prefix: classpath:/templates/
security:
user:
name: admin
password: 123456
roles: admin
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: 123456
freemarker:
cache: false
server:
port: 8091
servlet:
context-path: /
3.代码
1.创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private int id;
private String name;
private String author;
private String publisher;
private int type_id;
private BookType type;
private String price;
}
2.编写mapper
@Mapper
public interface BookMapper {
public List<Book> find();
public Book findById(Integer id, String name);
public Integer delete(Integer id);
public Integer deleteByIds(@Param("ids") Integer[] ids);
public Integer insert(Book book);
public Integer update(Book book);
public Integer insertBatch(@Param("books") List<Book> books);
}
//如果是单表,可以使用注解编写sql(或者直接使用mybatis-plus),但如果涉及多表,使用xml配置较为方便,
// @Select("select * from booklist")
// public List<Book> find();
3.xml配置
tips:如果是单表,且类中的属性为驼峰命名(bookName),数据库中是下划线(book_name),可以不编写resultMap映射
<?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 namespace="com.xuxi.springboot01.mapper.BookMapper">
<resultMap id="BookMap" type="com.xuxi.springboot01.pojo.Book">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="author" column="author"/>
<result property="publisher" column="publisher"/>
<result property="type_id" column="type_id"/>
<result property="price" column="price"/>
<association property="type" javaType="com.xuxi.springboot01.pojo.BookType">
<id property="id" column="type_id"/>
<result property="type" column="type_name"/>
</association>
</resultMap>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into booklist (name, author, publisher, type_id,price)
values (#{name},#{author},#{publisher},#{type_id},#{price});
</insert>
<insert id="insertBatch">
insert into booklist (name, author, publisher, type_id,price)
values
<foreach collection="books" item="book" separator=",">
(#{book.name},#{book.author},#{book.publisher},#{book.type_id},#{book.price})
</foreach>
</insert>
<update id="update">
update booklist
<set>
<if test="name != null and name !=''">name = #{name},</if>
<if test="author != null and author !=''">author = #{author},</if>
<if test="publisher != null and publisher !=''">publisher = #{publisher},</if>
<if test="type_id != null and type_id !=''">type_id = #{type_id},</if>
<if test="price != null and price !=''">price=#{price}</if>
</set>
where id=#{id};
</update>
<delete id="delete">
delete from booklist where id=#{id};
</delete>
<delete id="deleteByIds">
delete from booklist where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="find" parameterType="List" resultMap="BookMap">
select * from booklist inner join booktype on booklist.type_id=booktype.type_id;
</select>
<select id="findById" parameterType="list" resultMap="BookMap">
select * from booklist inner join booktype b on booklist.type_id = b.type_id
<where>
<if test="id != null">and id=#{id}</if>
<if test="name !=null and name !=''">and booklist.name like #{name}</if>
</where>
</select>
</mapper>
3.service
@Service
public class BookService {
@Autowired
private BookMapper bookMapper;
public List<Book> find(){
return bookMapper.find();
}
public Book findById(Integer id,String name){
return bookMapper.findById(id,name);
}
public boolean delete(Integer id){
return bookMapper.delete(id)>0;
}
public boolean update(Book book){
return bookMapper.update(book)>0;
}
public boolean insert(Book book){
return bookMapper.insert(book)>0;
}
}
4.controller
tip:如果是返回数据,需要加入@ResponseBody注解,如果不加该注解,会认为是返回视图,就会解析出错,浏览器报错(500)
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/findAll")
@ResponseBody
public List<Book> findAll()
{
return bookService.find();
}
@RequestMapping("/delete")
@ResponseBody
public boolean delete(Integer id){
return bookService.delete(id);
}
@RequestMapping("/findById")
@ResponseBody
public Book findById(Integer id,String name)
{
return bookService.findById(id,name);
}
}
4.测试
运行启动类,在浏览器输入http://localhost:8091/book/findAll