概念
本文在上篇文章的学习之上,展开新的学习。【MyBatis】第二课 MyBatis映射文件的CRUD操作<方式一>_笔触狂放的博客-CSDN博客
通过前面的学习,大家会发现框架的使用比原生java操作数据来的更简便。但在操作调用sql语句的时候还是显得有些笨拙,对于初学者在使用命名空间+id属性值的过程中出错性比较大,对于sql语句所执行的结果进行分析的能力比较差。那么本文使用创建接口的方式与映射文件进行对应,那么我们在执行的时候,只需要和接口对象进行对接即可。具体操作看一下篇幅。
1.搭建MyBatis环境
对于MyBatis的搭建过程,本文不再赘述,初学者还未掌握的,可查阅【MyBatis】第一课 MyBatis的框架的搭建和使用_笔触狂放的博客-CSDN博客
接着,我们需要在dao层中创建接口文件,选中dao--》右键--》new--》java class
输入接口名称,按照我们对MVC+三层架构的项目搭建方式中,我们对于接口的命名为I+要操作的表名+当前包的名称,例如 IBookDao 作为接口名称
?
将接口文件和映射文件放置同一个包中,并在映射文件中的mapper标签的命名空间名称需要指向于接口
?
而创建的接口中,定义的方法的返回值类型需要和映射文件中要执行的sql语句的resultType属性中的数据类型一致,方法名要和id属性中的值一致,方法中的形式参数要和parameterType属性中的值保持一致。
?
?以上是需要注意的地方。
2.查询操作
在映射文件中定义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 namespace="com.book.dao.IBookDao">
<!--查询book表总共有多少本书-->
<select id="getCount" resultType="int">
select count(*) from book
</select>
<!--查询书籍编号为1的书名-->
<select id="getNameById" resultType="String" parameterType="int" >
select name from book where id=#{id}
</select>
<!--传入单个条件,查询多个字段-->
<!--查询书籍编号为1的书名,作者,价格,数量-->
<select id="getBookById" resultType="Map" parameterType="int" >
select name,author,price,count from book where id=#{id}
</select>
<!--传入多个条件,查询多个字段-->
<!--查询作者为罗贯中,价格为98的书籍编号,书名和数量-->
<select id="getBookInfo" parameterType="Map" resultType="Map">
select id,name,count from book where author=#{author} and price=#{price}
</select>
<!--不传参数,查询多条数据-->
<!--查询所有图书信息-->
<select id="selectAll" resultType="Map">
select * from book
</select>
<!--查询所有图书信息并按书籍编号进行降序排列 降序是DESC 升序是ASC 默认为升序-->
<select id="selectOrder" resultType="Map">
select * from book ORDER BY id DESC
</select>
</mapper>
?那么所有要执行的sql语句都需要与接口文件中对应不同的方法
package com.book.dao;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2022/3/14.
*/
public interface IBookDao {
//接口中定义的方法一定好和映射文件中要执行的sql语句的id保持一致
int getCount();
String getNameById(int id);
Map<String,Object> getBookById(int id);
Map<String,Object> getBookInfo(Map<String, Object> map);
//查询多条数据的时候,接口中定义的方法的返回值类型一定是使用List里面套Map或者自定义实体类
List<Map<String,Object>> selectAll();
List<Map<String,Object>> selectOrder();
}
?建立测试类,在测试类中,只需要通过SqlSession对象调用getMapper方法传入接口类名即可,不再需要通过命名空间+id属性值进行调用执行的sql语句。
package com.book.test;
import com.book.dao.IBookDao;
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/14.
*/
public class BookTest {
public SqlSession ss=null;
public IBookDao dao=null;
public void init(){
//将主配置文件转换成输入流
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
ss= new SqlSessionFactoryBuilder().build(is).openSession();
dao=ss.getMapper(IBookDao.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void one(){
init();
//查找sql语句,进行查询书籍的总数量
//获得映射
int count = dao.getCount();
System.out.println("查询的书籍总数量为:"+count+"本");
}
@Test
public void two(){
init();
String name = dao.getNameById(1);
System.out.println("查询的书籍名称为:"+name);
}
@Test
public void three(){
init();
Map<String, Object> book = dao.getBookById(1);
System.out.println(book);
}
@Test
public void four(){
init();
Map<String,Object> map=new HashMap<>();
map.put("author","罗贯中");
map.put("price",98);
Map<String, Object> bookInfo = dao.getBookInfo(map);
System.out.println(bookInfo);
}
@Test
public void five(){
init();
List<Map<String, Object>> books = dao.selectAll();
books.forEach(map-> System.out.println(map));
}
@Test
public void six(){
init();
List<Map<String, Object>> books = dao.selectOrder();
books.forEach(map-> System.out.println(map));
}
}
3.添加操作
mapper.xml映射文件中
<!--添加数据-->
<!--添加数据的时候,表名后面的字段名可以省略,但前提是添加的数据一定是包含所有字段-->
<insert id="addBook" parameterType="Map">
insert into book values(#{id},#{name},#{author},#{price},#{count})
</insert>
接口文件中加入方法
int addBook(Map<String, Object> map);
?测试类中进行输入数据进行执行操作
@Test
public void seven(){
init();
Map<String,Object> map=new HashMap<>();
map.put("id",null);
map.put("name","水浒传");
map.put("author","施耐庵");
map.put("price",135);
map.put("count",80);
int i = dao.addBook(map);
//执行添加,修改,删除操作要进行提交
ss.commit();
if (i>0)
System.out.println("添加成功");
}
然后刷新数据库查看是否添加成功?
4.修改操作
mapper.xml映射文件中
!--修改数据-->
<!--修改书籍编号为2的图书的价格改为280,数量改为10-->
<update id="updateBook" parameterType="Map">
update book set price=#{price},count=#{count} where id=#{id}
</update>
接口文件中加入方法
int updateBook(Map<String, Object> map);
?测试类中进行输入数据进行执行操作
@Test
public void eight(){
init();
Map<String,Object> map=new HashMap<>();
map.put("id",2);
map.put("price",280);
map.put("count",10);
int i = dao.updateBook(map);
//执行添加,修改,删除操作要进行提交
ss.commit();
if (i>0)
System.out.println("修改成功");
}
然后刷新数据库查看是否修改成功?
5.删除操作
mapper.xml映射文件中
<!--删除数据-->
<!--删除书籍编号大于等于15,小于等于28的所有书籍信息-->
<delete id="delBook" parameterType="Map">
delete from book where id BETWEEN #{id1} and #{id2}
</delete>
接口文件中加入方法
int delBook(Map<String, Object> map);
?测试类中进行输入数据进行执行操作
@Test
public void nine(){
init();
Map<String,Object> map=new HashMap<>();
map.put("id1",15);
map.put("id2",28);
int i = dao.delBook(map);
//执行添加,修改,删除操作要进行提交
ss.commit();
if (i>0)
System.out.println("删除成功");
}
然后刷新数据库查看是否添加成功?
总结
在本文的学习过程中,初学者可以很清楚的体会到又回到Java代码的感觉,sql和java代码的业务逻辑进行分离,很好的做到了项目的高内聚,低耦合,这就是为什么MyBatis框架是一款比较优秀的持久层框架。
|