本文已参与「新人创作礼」活动,一起开启掘金创作之路
Mybatis简介
Mybatis是一个支持定制化SQL、存储过程以及高级映射的持久化层框架,同时避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。由于Mybatis可以使用简单的XML用于配置和原始映射,将接口和Java的POJO类映射成数据库中的记录,使得开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis与JDBC、Hibernate的对比:
JDBC:SQL夹在Java代码块里,耦合度高导致硬编码内伤;维护不易且实际开发需求中sql是有变化的,需要频繁修改的情况多见;要自己创建connection、创建statement、手动设置参数、结果集检索等
Hibernate:Hibernate是一个全自动化的持久化层框架;长难复杂SQL,对于Hibernate而言处理也不容易;内部自动生产的SQL不容易做特殊优化。
Mybatis:对开发人员而言,核心sql需要自己优化;Mybatis是一个半自动化的持久化层框架;Mybatis支持定制化sql、存储过程以及高级映射。
Mybatis入门程序
1. 下载Mybatis核心包
官网地址:mybatis – MyBatis 3 | Getting started
国内镜像地址:mvnrepository.com/artifact/or…
2. 创建工程,引入Mybatis核心包以及工程依赖包
3. 数据库中创建customer表,并在工程中建立与表对象的ORM类
@Setter@Getter
public class Customer {
private Integer cust_id;
private String cust_name;
private String cust_profession;
private String cust_phone;
private String email;
@Override
public String toString() {
return "Customer{" +
"cust_id=" + cust_id +
", cust_name='" + cust_name + ''' +
", cust_profession='" + cust_profession + ''' +
", cust_phone='" + cust_phone + ''' +
", email='" + email + ''' +
'}';
}
}
4. 创建Mybatis核心配置文件SqlMappingConfig.xml
<?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>
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理-->
<transactionManager type="JDBC"/>
<!--配置数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/development"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
5. 创建与表对象的关系映射Mapping文件编写sql语句
<?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="myTest">
<!--根据id查找用户-->
<select id="queryCustomerById" parameterType="Integer" resultType="demo1.Customer">
SELECT * FROM customer WHERE cust_id=#{cust_id}
</select>
</mapper>
6. 在核心配置文件中引入Mapping
<?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>
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理-->
<transactionManager type="JDBC"/>
<!--配置数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/development"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="demo1/Mapping"/>
</mappers>
</configuration>
7. 创建工厂,执行sql语句
@Test
public void test() throws IOException {
// 1、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2、加载SqlMappingConfig配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig");
//3、创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
//4、创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5、执行sql查询
//第一个参数queryCustomerById为Mapping.xml的statement的id
//第二个参数1为执行sql需要的参数
Customer customer = sqlSession.selectOne("queryCustomerById", 1);
//6、打印结果
System.out.println(customer);
//7、关闭连接,释放资源
sqlSession.close();
}
运行结果
Mybatis核心Api
1. SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFactory;SqlSessionFactory一旦创建完成就不需要SqlSessionFactoryBuilder了;由于SqlSession是通过SqlSessionFactory创建的,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量
2. SqlSessionFactory
创建SqlSessionFactory的工厂,是一个接口;接口中定义了openSession的不同重载方法;SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
3. SqlSession
连接到数据库的一个会话;SqlSession中定义了数据库的操作方法;每个线程都应该有它自己的SqlSession实例;SqlSession实例不能共享使用,它也是线程不安全的。所以最佳的使用范围是请求或方法范围,注意:绝对不能将SqlSession实例的引用放到一个类的静态字段或实例字段中