MyBatis入门
什么是 MyBatis
MyBatis原本是apache的一个开源项目iBatis, 2010年这个项目由Apache软件基金会迁移到了google code,并且改名为MyBatis,实质上MyBatis对ibatis进行一些改进。
MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的 XML 或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis快速入门
准备开发环境
Jar包:
mysql-connector-java-5.1.40.jar //MYSQL驱动包
mybatis-3.2.7.jar //MyBatis jar文件
两jar包放在WebRoot\WEB-INF\lib中
数据库:
drop table if exists `student`;
create table `student` (
`id` int(11) not null auto_increment,
`username` varchar(20) collate utf8_bin default null,
`age` int(11) default null,
primary key (`id`)
);
insert into student(username,age) values ('张三', '27');
insert into student(username,age) values ('李四', '27');
使用MyBatis查询表中的数据
定义表所对应的实体类:
package com.luhui.mybatis.bean;
public class Student {
private int id;
private String username;
private int age;
public Student() {
}
public Student(int id, String username, int age) {
this.id = id;
this.username = username;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", username=" + username + ", age=" + age + "]";
}
}
添加MyBatis的配置文件conf.xml(在src目录下创建一个conf.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">
<transactionManager type="JDBC" />
<dataSource type="POOLED"> <!-- 配置数据库连接信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value= "jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册userMapper.xml文件,
studentMapper.xml位于com.luhui.mybatis.mapping这个包下,所以
resource写成com/luhui/mybatis/mapping/studentMapper.xml-->
<mappers>
<mapper resource="com/luhui/mybatis/mapping/studentMapper.xml"/>
</mappers>
</configuration>
定义操作users表的sql映射文件userMapper.xml(需要在conf.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">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+ sql映射文件名(或dao层接口),这样就能够保证namespace的值是唯一的。
例如namespace="com.luhui.mybatis.mapping.studentMapper"就是com.luhui.mybatis.mapping(包名)+studentMapper(studentMapper.xml文件去除后缀)
-->
<mapper namespace="com.luhui.mybatis.mapping.studentMapper">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getStu,id属性值必须是唯一的,不能够重复。
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 resultType="com.luhui.mybatis.bean.Student"就表示将查询结果封装成 Student类的对象返回, Student类就是student表所对应的实体类
-->
<select id="getStu" parameterType="int" resultType="com.luhui.mybatis.bean.Student">
select * from student where id = #{id}
</select>
</mapper>
编写测试类进行测试
package com.luhui.mybatis.util;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.luhui.mybatis.bean.Student;
public class Test {
public static void main(String[] args) throws Exception {
String resource = "conf.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
Student student = sqlSession.selectOne("com.luhui.mybatis.mapping.studentMapper.getStu",1);
System.out.println(student);
}
}
框架图
如图所示:需要注意几个内容(SqlMapConfig.xml、mapper.xml、SqlSesssionFactory、qlSession)
- MyBatis配置文件,包括Mybatis全局配置文件(SqlMapConfig.xml)和MyBatis映射文件(mapper.xml),其中SqlMapConfig.xml配置了数据源、事务等信息;mapper.xml配置了SQL执行(sql语句)及对象关系(类与类的关系)等相关的信息,简单说mapper.xml就是处理sql语句及查询结果。
- MyBatis通过读取配置文件信息(SqlMapConfig.xml),构造出SqlSessionFactory,即会话工厂。
- 通过SqlSessionFactory,可以创建SqlSession即会话。MyBatis是通过SqlSession来操作数据库,进行CRUD(新增Create,读取查询Retrieve,更新Update和删除Delete)操作。
- SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
- Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。
注意:重点理解前3部分。后2部分是MyBatis已经做好的,暂时不需要关心。即MyBatis中需要有基本的三个文件:
(1)全局配置文件:SqlMapConfig.xml
(2)映射文件:Mapper.xml
(3)通过以上两个文件获取SqlSessionFactory---->SqlSeesion—>增删改查
MyBatis的安装
要使用 MyBatis,只需将 mybatis-x.x.x.jar文件置于classpath中即可。如果使用Maven来构建项目,则需将下面的dependency代码置于pom.xml文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
Jar下载:https://github.com/mybatis/mybatis-3/releases
Maven依赖:https://mvnrepository.com/