- 这篇文章是我学习mybatis框架阶段整理出的知识点,代码部分截取了我在idea练习案例时觉得比较重要的部分。整片文章相对全面且通俗易懂,希望能帮助到MyBatis框架的初学者。
(1)三层架构介绍
- 界面层: 和用户打交道的, 接收用户的请求参数, 显示处理结果(jsp ,html ,servlet)
- 业务逻辑层: 接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
- 数据访问层: 就是访问数据库, 执行对数据的查询,修改,删除等等
(2)三层架构对应框架
- 界面层—servlet—springmvc(框架)
- 业务逻辑层—service类–spring(框架)
- 数据访问层—dao类–mybatis(框架)
框架是一个模块
- 框架中定义好了一些功能。这些功能是可用的。
- 可以加入项目中自己的功能, 这些功能可以利用框架中写好的功能
框架特点:
- 框架一般不是全能的, 不能做所有事情
- 框架是针对某一个领域有效。 特长在某一个方面,比如mybatis做数据库 *** 作强,但是他不能做其它的
- 框架是一个软件
(1)简介:
早期叫做ibatis,mybatis是sql映射框架
(2)Mybatis功能:
1. 提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了
2. 提供了执行sql语句的能力, 不用手动执行sql
3. 提供了循环sql, 把sql的结果转为java对象, List集合的能力
4. 提供了关闭资源的能力,不用手动关闭Connection, Statement, ResultSet
- 开发人员做的是: 提供sql语句
(3)总结:
mybatis是一个sql映射框架,提供的数据库的 *** 作能力。增强的JDBC
-
创建数据表
-
引入maven依赖
org.mybatis mybatis3.5.1 mysql mysql-connector-java8.0.27
- 编写Dao接口
public interface StudentDao { ListselectAllStudents(); int insertStudent(Student student); }
- 编写Dao映射文件
- 创建主配置文件
可选择是否添加日志
- 创建测试
session.方法(Student.xml中mapper的 namespace.id)
openSession():无参默认非自动提交,提交需加入:session.commit()
openSession(true):自动提交
public class StudentTest { private static SqlSession utils() throws IOException { InputStream stream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream); SqlSession session = factory.openSession(); return session; } @Test public void Test1() throws IOException { SqlSession session =StudentTest.utils(); ListstudentList = session.selectList("com.dao.StudentDao.selectAllStudents"); for (Student student:studentList){ System.out.println(student); } session.close(); } @Test public void Test2() throws IOException { SqlSession session = StudentTest.utils(); Student student = new Student(3, "qbl", "qbl@qq.com", 58); int insert = session.insert("com.dao.StudentDao.insertStudent",student); session.commit(); session.close(); System.out.println("插入的数据数为: "+insert); } }
- 补充:
MyBatis对象分析 1.模板的使用update student set name=#{name},email=#{email},age=#{age} where id=#{id}; delete from student where id=#{id};
- 使用模板后,创建该类型文件即可自动生成模板中代码
(1) Resources 类
Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返 回不同类型的 IO 流对象。
(2) SqlSessionFactoryBuilder 类
SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 由 于 SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将 该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。
(3) SqlSessionFactory 接口
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用 只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
-
openSession(true):创建一个有自动提交功能的 SqlSession
-
openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
-
openSession():同 openSession(false)
(4) SqlSession 接口
SqlSession 接口对象用于执行持久化 *** 作。一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。
SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将 其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。
MyBatis动态代理DAO 1.DAO动态代理实现CRUDMyBatis动态代理:可以去掉Dao接口实现类
(1)只需在接口中定义方法,并在MyBatisDao.xml配置文件中创建对应id的sql语句
public interface StudentDao { ListselectAllStudents() throws IOException; }
(2)在调用并执行sql语句时,只需调用sqlSession对象的getMapper()方法,即可获取指定接口的实现类对象。
(MyBatisUtils为获取sqlSession对象的工具类)
MyBatisUtils:
public static SqlSession createSqlSession() throws IOException { InputStream stream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream); SqlSession session = factory.openSession(true); return session; }
测试:
@Test public void Test1() throws IOException { SqlSession sqlSession = MyBatisUtils.createSqlSession(); //获取sqlSession对象 StudentDao mapper = sqlSession.getMapper(StudentDao.class); //获取接口实现类对象 List2.定义接口传入参数 (1)一个简单参数students = mapper.selectAllStudents(); //调用接口实现类中的方法 for (Student student: students){ System.out.println(student); } }
- 在接口中定义需要传入参数的方法
Student selectStudentById(int id); Student selectStudentByName(String name);
- 在xml配置文件中:(参数的数据类型可写可不写)
(2)多个简单参数@Param
- 在DAO接口中
@Param(“studentId”) int id : 表示给id属性起别名,在DAO.xml文件中,#{student}所填入的值
ListselectStudentByIdAndName(@Param("studentId") int id, @Param("studentName") String name);
- 在DAO.XML文件中
select * from student where id=#{studentId} or name=#{studentName};
- 测试
@Test public void Test2() throws IOException { SqlSession sqlSession = MyBatisUtils.createSqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); List(3)使用对象传参students = studentDao.selectStudentByIdAndName(1, "lbw"); }
- 创建传参类和属性,并生成构造方法
public class ParamType { public String paramName; //表示姓名 public Integer paramId; //表示id }
- 在Dao接口中创建方法,参数为ParamType对象
ListselectStudentByParam(ParamType paramType);
- 在Dao.xml配置文件文件中写入当前方法的sql语句
(4)通过位置传参select * from mybatis.student where name=#{paramName} or id=#{paramId};
- 在Dao中创建方法
ListselectStudentByContext(String name,int id);
- 在Dao.xml写入sql语句
(4)通过Map集合传参select * from mybatis.student where name=#{arg0} or id=#{arg1};
- 在Dao中创建方法
ListselectStudentByMap(Map map);
- 在Dao.xml写入sql语句
select * from mybatis.student where name=#{studentName} or id=#{studentId};
- 测试,传入Map集合
@Test public void Test8() throws IOException { SqlSession sqlSession = MyBatisUtils.createSqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); HashMap3.#和$map = new HashMap<>(); map.put("studentName","cxk"); map.put("studentId",4); List students = studentDao.selectStudentByMap(map); for (Student student:students){ System.out.println(student); } }
- #:占位符,告诉 mybatis 使用实际的参数值代替。并使用 PrepareStatement 对象执行 sql 语句, #{…}代替 sql 语句的“?”。这样做更安全,更迅速,通常也是首选做法
- ** ∗ ∗ : 字 符 串 替 换 , 告 诉 m y b a t i s 使 用 ** :字符串替换,告诉 mybatis 使用 ∗∗:字符串替换,告诉mybatis使用包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的 内容连接起来。主要用在替换表名,列名,不同列排序等 *** 作
执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集 合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
(2)别名在MyBatis.xml主文件中,定义别名。在dao.xml配置文件中可使用定义的别名
- 方式一:type为类型的全路径,alias为别名
使用:
select * from mybatis.student where id=#{studentId} or name=#{studentName};
- 方式二:name为包名,包下的所有类别名就为类名
使用:
5.ResultMap (1)简介select * from mybatis.student where id=#{studentId} or name=#{studentName};
结果映射:指定列明和java对象的属性对应关系
resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。 常用在列名和 java 对象属性名不一样的情况。
(2)运用- 在dao中创建方法
ListselectAllStudents();
- 在dao.xml配置文件中定义
(1)定义resultMap:指定查询出来的每个字段的值赋给哪个属性
(2)在select标签中运用resultMap属性,选择需要调用的resultMap标签(id值)
select * from mybatis.student;
**注意:**resultType和resultMap二者选其一
6.模糊查询
模糊查询
- 方式一:
传入模糊查询where条件的完整格式
dao:
ListselectStudentLike(@Param("name") String name);
dao.xml:
select * from mybatis.student where name like #{name};
测试:
Liststudents = mapper.selectStudentLike("%b%");
- 方式二:
在dao.xml的where条件已经书写好模糊查询格式,只需传入具体内容
dao:
ListselectStudentLike2(@Param("name") String name);
dao.xml:
select * from mybatis.student where name like "%" #{name} "%";
测试:
List动态sqlstudents = mapper.selectStudentLike2("b");
- 动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接 SQL 语句。
- 常用的动态sql标签有if,where,foreach,choose等
将满足if条件的语句加入到sql语句中
select * from mybatis.student where name=#{name} or id=#{id}
**注:**若前一个条件不满足,后一个条件or会导致sql语法错误
2.Where标签能更好的避免标签中语法错误问题
3.foreach标签select * from mybatis.student name=#{name} or id=#{id}
处理sql语句中传入多个值得问题
- 方式一
直接传入sql语句中所需的字符
ListselectStudentForEach(List list);
collection:遍历的集合或数组类型(list,array)
item:遍历的成员
open:开始字符
close:结束字符
separator:分隔符
select id="selectStudentForEach" resultType="com.bean.Student"> select * from mybatis.student where id in#{id}
- 方式二
传入对象
ListselectStudentForEach2(List studentList);
4.动态代码片段select * from mybatis.student where id in #{student.id}
- 可定义一段sql语句,在需要重复使用此sql语句的地方导入(复用sql语句)
MyBatis配置文件 1.主配置文件select * from mybatis.student where id>#{id}
主配置文件 之前项目中使用的 mybatis.xml 是主配置文件。
主配置文件特点:
- xml 文件,需要在头部使用约束文件
2.根元素
3.主要包含内容:
-
定义别名
-
数据源
-
mapper 文件
Mybatis 中访问数据库,可以连接池技术,但它采用的是自己的连接池技术。在 Mybatis 的 mybatis.xml 配置文件中,通过
来实现 Mybatis 中连接池的配置。
dataSource 类型:
- UNPOOLED 不使用连接池的数据源
- POOLED 使用连接池的数据源
- JNDI 使用 JNDI 实现的数据源
- 在同resources目录下创建jdbc.properties资源文件
mybatis.url=jdbc:mysql://localhost:3306/mybatis mybatis.username=root mybatis.password=502502 mybatis.driverClassName=com.mysql.cj.jdbc.Driver
- 在主配置文件中指定并使用资源文件
4.指定多个mapper文件
- 方式一:
写多行mapper resource
- 方式二:
写多个mapper文件所在的包路径
``` 4.指定多个mapper文件
- 方式一:
写多行mapper resource
- 方式二:
写多个mapper文件所在的包路径
- 关于MyBatis框架的拙作就到这里,欢迎大家补充
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)