MyBatis入门
1、MyBatis是什么
在学习一门技术时,我们首先要知道这门技术是什么以及可以干什么和为什么选择这门技术而不选择其他技术。我们引用官方给的解释来看看什么是MyBatis:
MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
MyBatis是一个优秀的持久性框架,支持自定义SQL,存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置和结果的检索。MyBatis可以使用简单的XML或注释来配置和映射原语,Map接口和Java POJO(Plain Old Java Objects)到数据库记录。
2、为什么选择MyBatis
2.1 消除了大量的 JDBC 冗余代码
Java是通过Java数据库连接API来操作关系型数据库的,但JDBC是很底层的,我们想对数据库进行操作就需要书写大量的代码。废话不说,看代码
Student.java
1 import java.util.Date; 2 3 import lombok.Data; 4 5 @Data 6 public class Student { 7 8 private Integer studId; 9 private String name; 10 private String email; 11 private Date dob; 12 13 }
StudentService.java
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 7 import com.hz.mybatis.HzMyBatis.bean.Student; 8 9 /** 10 * 通过JDBC操作Student的SELECT和INSERT 11 * @author DONG 12 * 13 */ 14 public class StudentService { 15 16 public static void main(String[] args) { 17 System.out.println(new StudentService().findStudentById(1)); 18 } 19 20 /** 21 * 通过学生ID查找学生信息 22 * @param studId 23 * @return 24 */ 25 public Student findStudentById(int studId) { 26 Student student = null; 27 Connection connection = null; 28 29 try { 30 //获取数据库连接 31 connection = getDatabaseConnection(); 32 String sql = "SELECT * FROM students WHERE stud_id = ?;"; 33 34 //创建PreparedStatement 35 PreparedStatement preparedStatement = connection.prepareStatement(sql); 36 37 //设置输入参数 38 preparedStatement.setInt(1, studId); 39 40 //执行sql 41 ResultSet resultSet = preparedStatement.executeQuery(); 42 43 //从数据取出结果,并生成Java Bean对象 44 while (resultSet.next()) { 45 student = new Student(); 46 student.setStudId(resultSet.getInt("stud_id")); 47 student.setName(resultSet.getString("stud_name")); 48 student.setEmail(resultSet.getString("stud_email")); 49 student.setDob(resultSet.getDate("stud_dob")); 50 } 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } finally { 54 //关闭数据库连接 55 if (connection != null) { 56 try { 57 connection.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 } 63 return student; 64 } 65 66 /** 67 * 插入学生信息 68 * @param student 69 */ 70 public void createStudent(Student student){ 71 Connection conn = null; 72 try { 73 conn = getDatabaseConnection(); 74 String sql = "INSERT INTO students(stud_id, stud_name, stud_email, stud_dob) " 75 + "VALUES (?, ?, ?, ?)"; 76 77 PreparedStatement pstmt = conn.prepareStatement(sql); 78 79 pstmt.setInt(1, student.getStudId()); 80 pstmt.setString(2, student.getName()); 81 pstmt.setString(3, student.getEmail()); 82 pstmt.setDate(4, new java.sql.Date(student.getDob().getTime())); 83 84 pstmt.executeUpdate(); 85 } catch(Exception e) { 86 e.printStackTrace(); 87 } finally { 88 if (conn != null) { 89 try { 90 conn.close(); 91 } catch (SQLException e) { 92 e.printStackTrace(); 93 } 94 } 95 } 96 } 97 98 /** 99 * 获取数据库连接对象 100 * @return 101 */ 102 private Connection getDatabaseConnection() { 103 try { 104 Class.forName("com.mysql.jdbc.Driver"); 105 return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hadoop", "root", "root"); 106 } catch (Exception e) { 107 e.printStackTrace(); 108 } 109 return null; 110 } 111 }
以上两个方法含有大量重复的代码:创建连接、创建Statement对象、设置参数、关闭连接
就算把重复代码抽象出来,每次也还是需要调用一次的,运行流程并没有变化。
后续会与MyBatis进行对比。
2.2 学习成本低
涉及的知识面只有Java和SQL
2.3 可以很好地与传统数据库协同工作
MyBatis是将查询结果与Java对象进行映射,不会像Hibernate一样将Java对象静态地映射到表上,虽然也可以实现但过于繁琐了
2.4 自定义SQL语句
用过Hibernate的将会感觉,灵活性上比它好太多了。
2.5 与 Spring 和 Guice 框架的集成支持
2.6 与第三方缓存类库的集成支持
MyBatis内建的SqlSession级别缓存机制,可以很好的与多种第三方缓存类库集成。EHCache,OSCache等
2.7 更好的性能
MyBatis支持数据库连接池、内建的缓存机制,这些特点都会获取更好的性能。
3、说明
在软件开发中,并没有通用的的解决方案,每一个应用会有不同的一系列的要求,而我们应该根据应用的需要来选择我们的工具和框架。上面我们主要讲的是使用 MyBatis 的优点。然而也有一些情况,MyBatis 并不是理想的或者是最好的解决方案。
如果你的应用是以面向对象模型,并且向动态生成 SQL 语句,那么 MyBatis可能就不符合你的要求。另外,如果你想让你的应用有一个传递性的缓存机制的话(保存父对象时也应该保存关联的子对象),Hibernate 会更适合你。