简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
入门
添加依赖
在使用 Mybatis 的时候,需要添加数据库驱动包和 Mybatis 包,以 MySQL 为例,Maven 依赖:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
</dependencies>
MyBatis 配置文件
使用 MyBatis 的时候需要一个 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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 基于XML配置文件 -->
<mapper resource="edu/wzm/mybatis/mapping/PersonMapper.xml"/>
</mappers>
</configuration>
Mapping 映射文件
在上一节 MyBatis 的配置文件中,看到了一个 mapper 标签,而它会指向一个映射文件:
<?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映射文件名,这样就能够保证namespace的值是唯一的
例如:namespace="edu.wzm.mybatis.mapping.PersonMapper"(userMapper.xml文件去除后缀)
-->
<mapper namespace="edu.wzm.mybatis.mapping.PersonMapper">
<!--
在select、insert、update、delete标签中编写查询的SQL语句, 设置标签的id属性值必须是唯一的,不能够重复。使用parameterType属性
指明查询时,使用的参数类型。resultType属性指明查询返回的结果集类型,resultType="edu.wzm.mybatis.domain.Person"就表示将查询
结果封装成一个Person类的对象返回,Person类就是person表所对应的实体类。
-->
<insert id="insert" parameterType="edu.wzm.mybatis.domain.Person">
insert into person(name, age) values(#{name}, #{age})
</insert>
<select id="getById" resultType="edu.wzm.mybatis.domain.Person">
select *
from person
where id = #{id}
</select>
<select id="getAll" resultType="edu.wzm.mybatis.domain.Person">
select * from person;
</select>
<update id="update" parameterType="edu.wzm.mybatis.domain.Person">
update person set age = #{age} where id = #{id}
</update>
<delete id="delete" parameterType="int">
delete from person where id = #{id}
</delete>
</mapper>
使用到的数据库表:
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) DEFAULT '-1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
示例
在 Mapping 映射文件中,可以看到引入了一个实体类 Person:
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person: [name=" + name + ", age=" + age + "]";
}
}
在上述工作都完成的情况下,我们就可以编写访问数据库的 CRUD 代码:
public class PersonServices {
public void add(){
Person person = new Person("Alice", 30);
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
/**
* 映射sql的标识字符串。
* edu.wzm.mybatis.mapping.PersonMapper是PersonMapper.xml中mapper标签的namespace属性的值,
* insert是insert标签的id属性值,通过update标签的id属性值就可以找到要执行的SQL。
*/
int result = sqlSession.insert("edu.wzm.mybatis.mapping.PersonMapper.insert", person);
System.out.println(result);
sqlSession.close();
}
public void getAll(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Person> persons = sqlSession.selectList("edu.wzm.mybatis.mapping.PersonMapper.getAll");
System.out.println(persons);
sqlSession.close();
}
public void getById(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
Person person = sqlSession.selectOne("edu.wzm.mybatis.mapping.PersonMapper.getById", 1);
System.out.println(person);
sqlSession.close();
}
public void update(){
Person person = new Person();
person.setId(7);
person.setAge(27);
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.update", person);
System.out.println(result);
sqlSession.close();
}
public void delete(){
SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.delete", 6);
System.out.println(result);
sqlSession.close();
}
}
之后,还要启动 MyBatis 的 SQLSession 才能真正使用 MyBatis,下面是 MyBatis 的工具类:
public class MyBatisUtils {
public static SqlSessionFactory getSqlSessionFactory(){
InputStream is = MyBatisUtils.class.getClassLoader().getResourceAsStream(Const.MYBATIS_CONFIG_FILE);
return new SqlSessionFactoryBuilder().build(is);
}
/**
* @param autoCommit
* true: 表示创建的SqlSession对象在执行完SQL之后会自动提交事务
* false: 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
* @return
*/
public static SqlSession getSqlSession(boolean autoCommit){
return getSqlSessionFactory().openSession(autoCommit);
}
public static SqlSession getSqlSession(){
return getSqlSessionFactory().openSession();
}
}
测试代码:
public class Driver {
public static void main(String[] args)throws Exception{
PersonServices services = new PersonServices();
services.getById();
services.add();
services.update();
services.delete();
services.getAll();
}
}