概述
Mybatis是一个优秀的基于Java的持久层框架,内部封装了Jdbc,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中SQL的动态参数进行映射生成最终执行的SQL,最后由mybatis框架执行SQL并将结果映射为Java对象并返回。
采用ORM思想解决了实体和数据库映射的问题,对Jdbc进行了封装,屏蔽了Jdbc api底层访问细节,使我们不用与Jdbc api打交道,就可以完成对数据库的持久化操作。
ORM:对象关系型映射。它的实现思想就是讲关系型数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作,因此他的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
1、JDBC编程的分析
1.1 Jdbc程序的回顾
1 public class Clazz { 2 public static void main(String[] args) { 3 Connection connection = null; 4 PreparedStatement preparedStatement = null; 5 ResultSet resultSet = null; 6 try { 7 // 加载数据库驱动 8 Class.forName("com.mysql.jdbc.Driver"); 9 // 获取数据库连接 10 connection = DriverManager 11 .getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root"); 12 // 定义SQL语句 13 String sql = "select * from user where username = ?"; 14 // 获取预处理对象 15 preparedStatement = connection.prepareStatement(sql); 16 // 设置参数 17 preparedStatement.setString(1,"不为"); 18 // 执行查询,获取结果集 19 resultSet = preparedStatement.executeQuery(); 20 // 遍历查询结果集 21 while (resultSet.next()){ 22 System.out.println(resultSet.getString("id")+ 23 resultSet.getString("username")); 24 } 25 } catch (ClassNotFoundException e) { 26 e.printStackTrace(); 27 } catch (SQLException e) { 28 e.printStackTrace(); 29 } finally { 30 // 释放资源 31 if (resultSet!=null){ 32 try { 33 resultSet.close(); 34 } catch (SQLException e) { 35 e.printStackTrace(); 36 } 37 } 38 if(preparedStatement!=null){ 39 try { 40 preparedStatement.close(); 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 } 45 if(connection!=null){ 46 try { 47 connection.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 } 53 } 54 }
以上使用Jdbc的原始方法实现了查询数据库表记录的操作。
1.2 Jdbc问题分析
1、数据库在连接创建、释放频繁造成系统资源浪费而影响系统性能,如果使用数据库连接池可以解决此问题。
2、SQL语句在代码中硬编码,造成代码不易维护,实际应用SQL变化的可能较大,SQL变动需要改变Java代码。
3、使用preparedstatement向占位符传递参数存在硬编码,因此SQL语句的where条件不一定,有可能多也可能少,修改SQL还药修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,系统不易维护,如果能够将数据库记录封装成pojo对象解析比较方便。
2、Mybatis框架快速入门 -- 入门案例
2.1 开发准备
官网下载MyBadis框架
2.2 搭建Mybatis开发环境
创建Maven工程
添加Mybatis的坐标
1 <dependencies> 2 <dependency> 3 <groupId>org.mybatis</groupId> 4 <artifactId>mybatis</artifactId> 5 <version>3.4.5</version> 6 </dependency> 7 <dependency> 8 <groupId>junit</groupId> 9 <artifactId>junit</artifactId> 10 <version>4.10</version> 11 <scope>test</scope> 12 </dependency> 13 <dependency> 14 <groupId>mysql</groupId> 15 <artifactId>mysql-connector-java</artifactId> 16 <version>5.1.6</version> 17 <scope>runtime</scope> 18 </dependency> 19 <dependency> 20 <groupId>log4j</groupId> 21 <artifactId>log4j</artifactId> 22 <version>1.2.12</version> 23 </dependency> 24 </dependencies>
编写User实体类
1 public class User { 2 private int id; 3 private String name; 4 private String address; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) { 11 this.id = id; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public String getAddress() { 23 return address; 24 } 25 26 public void setAddress(String address) { 27 this.address = address; 28 } 29 }
编写持久层接口UserDao
public interface UserDao { /** * 查询所有用于 * @return */ List<User> findAll(); }
持久层映射文件UserDao.xml
要求:创建位置必须和持久层在相同的包中,名称必须以持久层接口命名文件名,扩展名为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.example.dao.IUserDao"> 6 <!-- 配置查询所有操作 --> 7 <select id="findAll" resultType="com.example.domain.User"> 8 select * from user 9 </select> 10 </mapper>
编写sqlMapConfig.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 <!-- 配置 mybatis 的环境 --> 7 <environments default="mysql"> 8 <!-- 配置 mysql 的环境 --> 9 <environment id="mysql"> 10 <!-- 配置事务的类型 --> 11 <transactionManager type="JDBC"></transactionManager> 12 <!-- 配置连接数据库的信息:用的是数据源(连接池) --> 13 <dataSource type="POOLED"> 14 <property name="driver" value="com.mysql.jdbc.Driver"/> 15 <property name="url" value="jdbc:mysql://localhost:3306/ee50"/> 16 <property name="username" value="root"/> 17 <property name="password" value="root"/> 18 </dataSource> 19 </environment> 20 </environments> 21 <!-- 告知 mybatis 映射配置的位置 --> 22 <mappers> 23 <mapper resource="com/example/dao/UserDao.xml"/> 24 </mappers> 25 </configuration>
编写测试类
1 public class MyBadisTest { 2 public static void main(String[] args) { 3 // 1.读取配置文件 4 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); 5 // 2.创建 SqlSessionFactory 的构建者对象 6 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 7 // 3.使用构建者创建工厂对象 SqlSessionFactory 8 SqlSessionFactory factory = builder.build(in); 9 // 4.使用 SqlSessionFactory 生产 SqlSession 对象 10 SqlSession session = factory.openSession(); 11 // 5.使用 SqlSession 创建 dao 接口的代理对象 12 UserDao userDao = session.getMapper(UserDao.class); 13 // 6.使用代理对象执行查询所有方法 14 List<User> users = userDao.findAll(); 15 for (User user : users) { 16 System.out.println(user); 17 } 18 // 7.释放资源 19 session.close(); 20 in.close(); 21 } 22 }
2.3 小结
通过上面的案例,我们可以发现使用mybatis还是一件比较容易的事情的,只需要编写Dao接口并且按照mybatis要求编写两个配置文件,就可以实现功能,远比我们之前的Jdbc方便多了。
2.4 补充(基于注解的开发)
1 public interface UserDao { 2 /** 3 * 查询所有用于 4 * @return 5 */ 6 @Select("select * from user") 7 List<User> findAll(); 8 }
修改SqlMapConfig.xml
1 <!-- 告知 mybatis 映射配置的位置 --> 2 <mappers> 3 <mapper class="com.example.dao.UserDao"/> 4 </mappers>
注意事项:在使用基于注解的Mybatis配置时,需要移除 xml 的映射配置(UserDao.xml)。