本文在上篇文章的学习之上,展开新的学习。【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语句的方式与上篇文章中类似
select count(*) from book
那么所有要执行的sql语句都需要与接口文件中对应不同的方法
package com.book.dao;
import java.util.List;
import java.util.Map;
public interface IBookDao {
//接口中定义的方法一定好和映射文件中要执行的sql语句的id保持一致
int getCount();
String getNameById(int id);
Map getBookById(int id);
Map getBookInfo(Map map);
//查询多条数据的时候,接口中定义的方法的返回值类型一定是使用List里面套Map或者自定义实体类
List
建立测试类,在测试类中,只需要通过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;
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 book = dao.getBookById(1);
System.out.println(book);
}
@Test
public void four(){
init();
Map map=new HashMap<>();
map.put("author","罗贯中");
map.put("price",98);
Map bookInfo = dao.getBookInfo(map);
System.out.println(bookInfo);
}
@Test
public void five(){
init();
List> books = dao.selectAll();
books.forEach(map-> System.out.println(map));
}
@Test
public void six(){
init();
List> books = dao.selectOrder();
books.forEach(map-> System.out.println(map));
}
}
3.添加操作
mapper.xml映射文件中
insert into book values(#{id},#{name},#{author},#{price},#{count})
接口文件中加入方法
int addBook(Mapmap);
测试类中进行输入数据进行执行操作
@Test
public void seven(){
init();
Map 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映射文件中
!--修改数据-->
update book set price=#{price},count=#{count} where id=#{id}
接口文件中加入方法
int updateBook(Mapmap);
测试类中进行输入数据进行执行操作
@Test
public void eight(){
init();
Map 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映射文件中
delete from book where id BETWEEN #{id1} and #{id2}
接口文件中加入方法
int delBook(Mapmap);
测试类中进行输入数据进行执行操作
@Test
public void nine(){
init();
Map 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框架是一款比较优秀的持久层框架。



