MyBatis
MyBatis是一个一流的持久化框架,支持自定义SQL、存储过程和高级映射。
MyBatis几乎消除了所有的JDBC代码,手动设置参数和检索结果的步骤。
MyBatis可以使用简单的XML或注解进行配置,将基本类型、Map接口和Java POJO(普通的Java对象)映射到数据库记录。
简单介绍
MyBatis(原名为iBatis)是一款Java持久层框架,它提供了一种简单而灵活的方式来访问数据库。
MyBatis的目标是通过消除冗余的JDBC代码,使开发人员能够更专注于SQL语句和结果映射。
以下是一些关键的特点和概念,帮助你更好地理解MyBatis:
- SQL映射:MyBatis使用XML或注解方式将SQL语句与Java方法进行映射。在XML文件中,你可以编写SQL语句,并指定参数和结果的映射关系。
- 参数映射:MyBatis支持多种参数映射方式,包括位置参数、命名参数和自定义类型处理器。这使得你可以灵活地将Java对象作为参数传递给SQL语句。
- 结果映射:MyBatis可以将SQL查询的结果映射为Java对象。你可以定义映射规则,将查询结果中的列与Java对象的属性进行对应。
- 动态SQL:MyBatis提供了强大的动态SQL功能,可以根据条件来动态地生成SQL语句。你可以使用条件判断、循环和片段等功能来构建灵活的SQL语句。
- 事务支持:MyBatis可以管理数据库事务,你可以通过配置文件或编程方式来控制事务的提交和回滚。
- 插件机制:MyBatis提供了插件机制,可以通过自定义插件来扩展框架的功能。你可以在SQL语句执行前后进行拦截和修改,实现日志记录、性能监控等功能。
使用MyBatis的流程通常包括以下步骤:
- 配置数据源:在配置文件中指定数据库连接信息,包括数据库类型、URL、用户名和密码等。
- 定义SQL映射:使用XML文件或注解方式定义SQL语句和参数、结果的映射关系。
- 编写Java代码:编写Java代码,调用MyBatis提供的API来执行SQL语句。你可以使用会话(SqlSession)来执行增删改查操作。
- 执行SQL语句:通过调用相应的方法来执行SQL语句,并获取结果。
MyBatis是一款功能强大而灵活的持久层框架,它能够有效地简化数据库访问的开发工作。
它已经在许多Java项目中得到广泛应用,成为了Java开发人员的首选之一。
mybatis 与 hibernate 的对比表格
下面是MyBatis和Hibernate的对比表格,以便更好地理解它们之间的区别:
特性 | MyBatis | Hibernate |
---|---|---|
数据库支持 | 支持多种关系型数据库 | 支持多种关系型数据库 |
SQL控制 | 提供灵活的SQL控制,开发者手动编写和管理SQL语句 | 自动创建和管理SQL语句,更面向对象的方式 |
对象关系映射(ORM) | 较弱的ORM支持,需要手动处理对象和数据库表之间的映射关系 | 强大的ORM支持,自动处理对象和数据库表之间的映射关系 |
存储过程和函数支持 | 提供良好的存储过程和函数支持 | 提供有限的存储过程和函数支持 |
缓存机制 | 提供一级缓存和二级缓存 | 提供一级缓存和二级缓存 |
查询性能 | 查询性能较高,可以优化SQL语句 | 查询性能较低,Hibernate会自动生成复杂的查询语句 |
灵活性 | 更灵活,可以直接编写SQL语句 | 较少灵活,需要按照Hibernate的规范进行操作 |
学习曲线 | 相对较低,容易上手 | 相对较高,需要掌握更多的概念和API |
需要注意的是,MyBatis和Hibernate都是优秀的持久层框架,每个框架在不同的场景和需求下有其适用性。
MyBatis更适合对SQL语句的控制要求较高的项目,而Hibernate则更适合那些希望通过ORM来简化数据访问的项目。
Hello World
- mybatis.jar & mysql-connector-java.jar
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
- MyBatisUtil.java
public class MyBatisUtil {
private MyBatisUtil(){}
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(
Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
- mybatis-config.xml & jdbc.properties
<?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">
<configuration>
<!-- 引入配置信息文件 -->
<properties resource="jdbc.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/ryo/mapper/UserMapper.xml"/>
</mappers>
</configuration>
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf8
user=root
password=
- UserMapper.java & UserMapper.xml
public interface UserMapper {
User selectUser(Long id);
}
<?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">
<mapper namespace="com.ryo.mapper.UserMapper">
<!--定义所有列,方便使用,一般应该避免使用*-->
<sql id="columns"> id,username,password,createdOn</sql>
<!--id 对应方法名称-->
<select id="selectUser" parameterType="java.lang.Long" resultType="com.ryo.domain.User">
SELECT
<include refid="columns"/>
FROM User WHERE id = #{id}
</select>
</mapper>
- sql & domain
CREATE TABLE user (
id BIGINT(20) PRIMARY KEY AUTO_INCREMENT NOT NULL
COMMENT '主键, 自增',
username VARCHAR(64) NOT NULL
COMMENT '用户名',
password VARCHAR(128) NOT NULL
COMMENT '密码',
createdOn DATETIME NOT NULL
COMMENT '创建时间',
UNIQUE INDEX `username_UNIQUE` (`username`)
)
COMMENT '用户表';
INSERT INTO `user` (username, password, createdOn) VALUES (
'ryo', '123456', '2016-07-28 14:32:30'
);
public class User implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private Date createdOn;
//getter & setter
//toString()
}
- UserMapperTest.java & result
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
@Test
public void testSelectUser() throws IOException {
UserMapper userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class);
System.out.println(userMapper.selectUser(1L));
}
}
User{id=1, username='ryo', password='123456', createdOn=Thu Jul 28 14:32:30 CST 2016}
Process finished with exit code 0
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。