小言_互联网的博客

MyBatis3框架详解(一)

474人阅读  评论(0)

 一、MyBatis发展历程

1.JDBC

  • SQL语句编写在Java代码里面,耦合度高导致硬编码内伤
  • 维护不易且实际开发需求中SQL是有变化的,频繁修改的情况多见

2.Hibernate(全自动全映射的ORM框架,旨在消除SQL)

  • 长难复杂SQL,对于Hibernate而言处理不容易
  • 内部自动生产的SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量字段的JavaBean进行部分映射时比较困难,导致数据库性能下降(例如:100个字段的JavaBean对应100列数据库字段,当只查询一个字段的时,Hibernate也会查询100个字段,因为全映射)

3.MyBatis(半自动化的持久化层框架)-----------该部分使用MyBatis3.4.1版本

  • SQL与Java编码分开
  • SQL语句由开发人员编写

 

二、使用案例(通过xml配置文件实现mybatis)

案例步骤:

  1. 创建全局配置文件(mybatis-config.xml),文件中包括mybatis运行时的一些参数
  2. 创建sql映射文件(EmployeeMapper.xml),配置了每一个sql,以及sql的封装规则
  3. 将sql映射文件注册到全局配置文件中
  4. 根据全局配置文件得到SqlSessionFactory
  5. 使用SqlSessionFactory,获得到SqlSession对象,并用其执行增删改查(一个SqlSession就是代表和数据库的一次会话,使用SQL唯一标志来告诉MyBatis执行哪个SQL,其中SQL都保存在SQL映射文件中)
  6. 关闭资源

项目目录结构:

数据表:

JavaBean:


  
  1. package com.csu.marden;
  2. public class Employee {
  3. private int id;
  4. private String lastName;
  5. private String email;
  6. private String gender;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getLastName() {
  14. return lastName;
  15. }
  16. public void setLastName(String lastName) {
  17. this.lastName = lastName;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public String getGender() {
  26. return gender;
  27. }
  28. public void setGender(String gender) {
  29. this.gender = gender;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
  34. }
  35. }

步骤1:创建全局配置文件(mybatis-config.xml)


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC" />
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver" />
  11. <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
  12. <property name="username" value="root" />
  13. <property name="password" value="root" />
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <!-- sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
  18. <mappers>
  19. <mapper resource="EmployeeMapper.xml" />
  20. </mappers>
  21. </configuration>

步骤2:创建sql映射文件(EmployeeMapper.xml)


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.csu.marden.EmployeeMapper">
  6. <!-- namespace:名称空间 -->
  7. <!-- id:唯一标识 -->
  8. <!-- resultType:返回值类型 -->
  9. <!-- #{id}:从传递过来的参数中取出id值 -->
  10. <!-- 字段不对应的情况,起别名!!! -->
  11. <select id="selectEmp" resultType="com.csu.marden.Employee">
  12. select id,last_name lastName,email,gender from tbl_employee where id = #{id}
  13. </select>
  14. </mapper>

步骤3:将sql映射文件注册到全局配置文件中,详见步骤1

步骤4-6:


  
  1. package com.csu.marden;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. public class Test {
  9. public static void main( String[] args) throws IOException {
  10. //1.根据xml配置文件(全局配置文件,即mybatis-config.xml)创建一个SqlSessionFactory对象
  11. String resources= "mybatis-config.xml";
  12. InputStream inputStream= Resources.getResourceAsStream(resources);
  13. SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
  14. //2.根据SqlSessionFactory创建SqlSession,每个SqlSession代表和数据库的一次会话
  15. SqlSession openSession=sqlSessionFactory.openSession();
  16. try{
  17. //第一个参数:SQL的唯一标志(namespace+id)
  18. //第二个参数:执行SQL要用的参数
  19. Employee emp=openSession.selectOne( "com.csu.marden.EmployeeMapper.selectEmp", 1);
  20. System.out. println(emp);
  21. }finally{
  22. openSession.close();
  23. }
  24. }
  25. }

注意:报错提示Could not find resource mybatis-config.xml

解决方案:

默认情况下,只有src是build path的source folder目录。此处自定义的conf文件夹只是一个普通的文件夹,需要将该文件夹Use as Source Folder

右键点击conf文件夹--->选择build path--->选择Use as Source Folder

 

三、接口式编程(通过接口式编程实现mybatis)-----推荐使用!!!

本质:将接口与sql映射文件进行动态绑定,通过在接口中定义的方法规范业务(规范sql语句的参数和返回值)

1.使用mybatis有两种实现方式:

(1)通过xml配置文件实现mybatis:通过全局配置文件和sql映射文件,创建SqlSession对象,并执行增删改查业务。

(2)通过接口式编程实现mybatis:mybatis为sql映射文件找了一个接口作为自己的代理,并告诉其他Java对象,以后访问数据库的增删改查业务不要找sql映射文件,而去找对应的代理即可。接口中通过定义的方法描述了sql语句的参数和返回值。

2.接口式编程的核心:(接口与sql映射文件的定义规范)

(1)定义接口,并在接口中定义方法(规范sql语句的参数和返回值),对应sql映射文件中的增删改查语句

(2)sql映射文件中,namespace属性指定为接口的全类名,id属性指定为接口中定义的方法名

3.注意:

  • 通过xml配置文件实现mybatis,直接调用sql映射文件。每次使用sql映射文件时,都需要写sql映射文件的namespace,id,参数,返回值,容易出错,而且书写麻烦。
  • 使用接口式编程实现mybatis,将接口与sql映射文件动态绑定,通过接口代理sql映射文件,不管是谁使用sql映射文件,都可以调用接口的实现类完成(mybatis为接口自动创建一个实现的代理对象)
  • 使用接口式编程调用接口时,使用sqlSession.getMapper()获取接口的实现类,即代理对象。其本质是通过通过Proxy.NewProxyInstance()加载代理实例,即mybatis通过反射机制自动创建接口的实现类对象

案例步骤:

  1. 创建全局配置文件(mybatis-config.xml),文件中包括mybatis运行时的一些参数
  2. 创建sql映射文件(EmployeeMapper.xml),配置了每一个sql,以及sql的封装规则
  3. 将sql映射文件注册到全局配置文件中
  4. 编写sql映射文件对应的接口(接口中通过方法的形式规范sql的参数和返回值)
  5. 根据全局配置文件得到SqlSessionFactory
  6. 使用SqlSessionFactory,获得到SqlSession对象,并根据SqlSession对象得到接口的实现类对象(mybatis为接口自动创建一个代理对象)
  7. 使用代理对象执行接口中的方法,完成增删改查业务
  8. 关闭资源

步骤1:创建全局配置文件(mybatis-config.xml)


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC" />
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver" />
  11. <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
  12. <property name="username" value="root" />
  13. <property name="password" value="root" />
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <!-- 将sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中 -->
  18. <mappers>
  19. <mapper resource="EmployeeMapper.xml" />
  20. </mappers>
  21. </configuration>

步骤2:创建sql映射文件(EmployeeMapper.xml)


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.csu.marden.EmployeeMapper">
  6. <!-- namespace:名称空间,此处用接口的全类名 -->
  7. <!-- id:唯一标识 -->
  8. <!-- resultType:返回值类型 -->
  9. <!-- #{id}:从传递过来的参数中取出id值 -->
  10. <!-- 字段不对应的情况,起别名!!! -->
  11. <select id="getEmpById" resultType="com.csu.marden.Employee">
  12. select id,last_name lastName,email,gender from tbl_employee where id = #{id}
  13. </select>
  14. </mapper>

步骤3:将sql映射文件注册到全局配置文件中,详见步骤1

步骤4:编写sql映射文件对应的接口


  
  1. package com.csu.marden;
  2. public interface EmployeeMapper {
  3. //根据id查询数据,并封装成Employee对象----对应sql映射文件中的查询操作
  4. public Employee getEmpById(Integer id);
  5. }

步骤5-8:


  
  1. package com.csu.marden;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. public class Test {
  9. public static void main( String[] args) throws IOException {
  10. //1.根据xml配置文件(全局配置文件,即mybatis-config.xml)创建一个SqlSessionFactory对象
  11. String resources= "mybatis-config.xml";
  12. InputStream inputStream= Resources.getResourceAsStream(resources);
  13. SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
  14. //2.根据SqlSessionFactory创建SqlSession,每个SqlSession代表和数据库的一次会话
  15. SqlSession openSession=sqlSessionFactory.openSession();
  16. try{
  17. //3.获取接口的实现类对象(mybatis会为接口自动创建一个代理对象,代理对象会执行增删改查)
  18. EmployeeMapper mapper=openSession.getMapper( EmployeeMapper. class);
  19. //4.通过接口的实现类对象调用接口的查询方法
  20. Employee employee=mapper.getEmpById(1);
  21. System.out. println(employee);
  22. }finally{
  23. openSession.close();
  24. }
  25. }
  26. }

 

四、总结

1.mybatis与原生数据库操作的区别:

原生数据库操作:创建Dao接口,编写DaoImpl实现类完成业务逻辑

mybatis:创建***Mapper接口,编写***Mapper.xml映射文件(该映射文件相当于接口的实现类,mybatis根据映射文件自动生成实现类)

2.SqlSession代表和数据库的一次会话。

每次执行增删改查业务,不管调用SqlSession的原生API,还是通过获取接口的实现类完成增删改查,都是通过SqlSession操作数据库。

3.SqlSession与Connection一样,都是非线程安全的。

每次使用都应该去获取新的对象,不应该放在共享的成员变量中。

4.sql映射文件对应的接口没有实现类,但是mybatis会为这个接口生成一个代理对象

EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);

5.两个重要的配置文件

mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等系统运行环境信息

sql映射文件:相当于原生数据库操作中,定义Dao接口的实现类如何工作。保存了每一条sql语句的映射信息,mybatis正是通过该映射文件将sql抽取出来。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


转载:https://blog.csdn.net/m0_37671741/article/details/116067835
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场