Mybatis
起始名ibatis。已迁移至github。
mybatis官网地址:http://mybatis.org/
mybatis的Github地址:https://github.com/mybatis/mybatis-3
点击mybatis-x.x.x.zip,下载全部资源。
Mybatis特性
- mybatis支持定制化SQL,存储过程以及高级映射
- mybatis避免了几乎所有的JDBC代码和手动设置参数以及结果集解析操作
- mybatis可以使用简单的XML或注解实现配置和原始映射;将接口和java的POJO映射成数据库中的记录
- mybatis是一个半自动的ORM(object relation mapping)框架
和其他持久化层比较
hibernate和JPA
- 操作简单,开发效率高
- 程序中长难复杂SQL与需要绕过框架
- 内部自动生成的SQL,不容易做特殊优化
- 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难
- 反射操作太多导致数据库性能下降
注:个人感觉开发效率比mybatis高,在开发过程中,涉及到表字段的新增,mybatis需要进行大量修改,JPA需要修改的数量较少。但这只是肤浅的认识,深入肯定各有优劣。
根据IDEA中插件,连接数据库,并自动生成实体类。
1.点击Database。
2.点击+号
3.选择Mysql数据库。
4.输入IP、用户名、密码,测试连接,应用即可,即可。
之后可以通过,右键表,生成对应的实例类
注意:生成的实体类的属性,字段类型需要进行手动的修改。并且没有构造方法,需要自己创建。
mybatis相关jar包引入
<!-- Mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- Junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Mysql驱动,连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 数据源,此次没有用到-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
准备配置文件(Mybatis全局配置文件、Mybatis映射文件)
Mybatis全局配置文件
总的配置文件。习惯性命名为mybatis-config.xml,将来整合Spring之后,这个配置文件可以省略。
<?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>
<!-- 配置环境 -->
<!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境,default
属性的取值是environment标签中id的取值-->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型,Mybatis的内置的事务管理器,Spring中会配置,指定-->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<!-- 驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/itoah"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- Mapper的注册,指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径 -->
<!--不以/开头就是相对路径,以/开头就是绝对路径 -->
<!-- Web应用部署到服务器上运行时,类路径其实是:WEB-INF目录下的classes目录,classes目录下放编译好的字节码文件 -->
<mapper resource="mappers/ACicpTest1.xml"/>
</mappers>
</configuration>
之后再创建对应表的xml文件。
在resources目录下创建mappers目录,并在该目录下创建ACicpTest1.xml,有多个,和实体类一一对应。
<?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">
<!--Mybatis的映射文件-->
<!--mapper是根标签,namespace属性:在Mybatis全局范围内找到一个具体的Mapper配置文件-->
<!--引入接口后,为了方便通过接口全类名来找到mapper配置文件,所以通常将namespace属性设置为接口全类名-->
<mapper namespace="dao.ACicpTest1Dao">
<!--配置查询一个值-->
<!--resultType:Mybatis负责解析结果集,将解析得到的数据封装到JAVA类型中,resultType属性就是指定这个JAVA类-->
<select id="findOneById" resultType="POJO.ACicpTest1" parameterType="String">
<!--#{requestNo}这里是为了方便接受Java程序传过来的参数数据-->
<!--将转换为“?”占位符-->
select * from a_cicp_test_1 where requestNo = #{requestNo};
</select>
</mapper>
测试类:
@Test
public void testHelloWorld() throws IOException {
// 1.使用Mybatis的Resources类读取Mybatis全局配置文件
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.使用InputStream创建sqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3.调用builder对象的build方法创建SqlSessionFactory对象
SqlSessionFactory build = builder.build(stream);
// 4.通过SqlSessionFactory对象开启一个从Java程序到数据库的会话,与httpsession类似,HttpSession是浏览器到Java程序的会话。SqlSession是java程序servlet到数据库的会话
SqlSession sqlSession = build.openSession();
//5.在通过SqlSession对象找到Mapper配置文件中可以执行的sql语句
//两个参数,分别是statement、parameter
// statement参数格式:Mapper配置文件namespace属性.SQL标签的id属性
//parameter参数;给SQL语句传入的参数
//此时执行的查找操作已经不是到XML配置文件中取找了,因为XML配置文件中的信息已经被读取到内存中封装成对象
Object one = sqlSession.selectOne("dao.ACicpTest1Dao.findOneById","978");
//6.直接打印查询结果
System.out.println(one);
//7.提交事务
sqlSession.commit();
//8.关闭sqlsession
sqlSession.close();
}
}
配置文件都是在应用启动时就读取的。所以多个mapper文件IO也不影响性能。
build对象创建 Configuration对象。
Configuration对象 包含 MapperRegistry对象
查找SQL语句就 通过 MapperRegistry对象,在Java对象中查找而不是转到XML去执行。