本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
简述Mybatis
Mybatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis。Mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等复杂的过程。Mybatis通过xml方式和注解方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。该框架采用ORM(Object Relation Mapping)思想解决了实体和数据库的映射问题,对jdbc进行了封装,屏蔽了jdbc api底层访问的细节,使我们不用与jdbc api打交道就可以完成对数据库的持久化操作。
JDBC简单回顾
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?charsetEncoding=utf-8", "root", "root");
// 定义sql语句?表示占位符
String sql = "SELECT * FROM user WHERE username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "张三");
// 执行sql,并得到结果集
resultSet = preparedStatement.executeQuery();
// 遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + ":" + resultSet.getString("username"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通过上面对JDBC的简单回顾,我们可以分析一下问题:
- 数据库频繁的连接、释放会造成系统资源的浪费从而影响系统的性能,可使用数据库连接池解决此问题。
- sql语句在代码中硬编码,造成了代码的不易维护,实际应用sql的变化可能较大,sql变动需要改变java的代码。
- prepareStatement中占位符传参数存在硬编码,因为可能sql语句变化较大,导致我们须修改sql的同时还要修改代码,系统不易维护。
- result结果集解析同样存在硬编码,理由同上。
Mybatis入门案例(使用xml方式)
步骤一:创建一个maven工程,我这里使用的是idea开发工具,目录结构如下,并在pom.xml文件添加所需的坐标。
<dependencies>
<!-- 连接数据库坐标,我这里使用的mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- Mybatis坐标 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
步骤二:准备所需的数据库、表以及记录信息。
步骤三:创建entity包并创建User实体类,实体类的名称以及属性名要和数据库的表名以及字段名对应起来(也可以不对应,我们会在后面提及),这就是ORM思想,让我们可以通过操作实体类来对数据库进行操作。
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
// 自定添加get、set方法以及重写toString方法
.......
}
步骤四:创建dao包并创创建UserDao接口。
public interface UserDao {
/**
* 查询所有user对象
* @return
*/
List<User> findAll();
}
步骤五:创建映射配置文件,在创建时需要注意创建的位置和名称,具体得看主配置文件如何注册映射文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:表示映射到哪个包下的哪个接口 -->
<mapper namespace="dao.UserDao">
<!-- id:表示映射到这个接口的哪个方法,resultType:表示返回值的类型-->
<select id="findAll" resultType="entity.User">
SELECT * FROM user
</select>
</mapper>
步骤六:创建Mybatis主配置文件,文件名自己随意起。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置mybatis的环境 -->
<environments default="mysql">
<!-- 配置mysql的环境 -->
<environment id="mysql">
<!-- 配置事物类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:这里用的是数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/farmer"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 1.在注册映射文件时使用<package name="包名">标签时,需要映射文件名和接口名一样,不然会报错。-->
<!-- 2.在注册映射文件时使用<mapper class="">mapper标签的class属性时,需要映射文件名和接口名一样,不然会报错。-->
<!-- 3.在注册映射文件时使用<mapper resource="org/xx/demo/mapper/xx.xml"/>,不需要映射文件名和接口名一样 -->
<!-- 注册映射文件 -->
<mappers>
<mapper resource="dao/UserDao.xml"></mapper>
</mappers>
</configuration>
步骤七:编写测试类
public static void main(String[] args) throws IOException {
// 1.读取配置文件
InputStream in = Resources.getResourceAsStream("MapConfig.xml");
// 2.创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
// 3.使用构建者创建工厂对象SqlSessionFactory
SqlSessionFactory factory = factoryBuilder.build(in);
// 4.使用工厂对象生产session对象
SqlSession session = factory.openSession();
// 5.使用session对象创建dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
// 6.使用代理对象执行方法,并得到结果
List<User> users = userDao.findAll();
users.forEach(item -> System.out.println(item));
// 7.释放资源
session.close();
in.close();
}
控制台打印结果,第二张图片为工程目录结构。
Mybatis入门案例(使用注解方式)
只需要修改两处,一处是为接口添加注解,另一处时在主配置文件修改注册映射文件的方式,注意在使用注解方式时,请移除xml方式的映射文件,否则会出现下图错误。
public interface UserDao {
/**
* 查询所有user对象
* @return
*/
@Select("select * from user")
List<User> findAll();
}
<!-- 修改注册映射文件的方式-->
<mappers>
<mapper class="dao.UserDao"/>
</mappers>
Mybatis简单分析
通过上面的简单使用,我们可以体会到Mybatis的便利性,在这里我们简单分析下Mybatis,来了解下它在底层究竟为我们做了什么,如图所示,我们可以从中总结出来,这里使用了三种设计模式,分别为构建者模式,工厂模式以及代理模式,而这三种模式的好处,我们也简单叙述了下。