文章目录
1. 快速入门
MyBatis
官网地址:http://www.mybatis.org/mybatis-3/
1.1. 开发步骤
- 添加
MyBatis
的坐标 - 创建
user
数据表 - 编写
User
实体类 - 编写映射文件
UserMapper.xml
- 编写核心文件
SqlMapConfig.xml
- 编写测试类
1.2. 环境搭建
- 导入
MyBatis
的坐标和其他相关坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Mybatis</artifactId>
<groupId>com.study</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-quick-stater</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--引入依赖-->
<dependencies>
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
<scope>runtime</scope>
</dependency>
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--⽇志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
- 创建
user
数据表
- 编写
User
实体
package com.study.pojo;
public class User {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
- 编写
UserMapper
映射文件
<?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">
<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
<!--resultType :表明返回值类型-->
<select id="findAll" resultType="com.study.pojo.User">
select * from User
</select>
</mapper>
- 编写
MyBatis
核心文件
<?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 运行环境-->
<environments default="development">
<environment id="development">
<!--当前事务交由JDBC进行管理-->
<transactionManager type="JDBC"/>
<!--当前使用 mybatis 提供的连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
- 编写测试代码
package com.study.test;
import com.study.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test1() throws IOException {
//加载核心配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印结果
System.out.println(userList);
//释放资源
sqlSession.close();
}
}
1.3. MyBatis 的增删改查操作
1.3.1. MyBatis 的插入数据操作
- 编写
UserMapper
映射文件
<?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">
<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
<!--添加用户 parameterType:参数类型-->
<insert id="saveUser" parameterType="com.study.pojo.User">
INSERT INTO user VALUES (#{id},#{username})
</insert>
</mapper>
- 编写插入实体
User
的代码
package com.study.test;
import com.study.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test2() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(2);
user.setUsername("Jack");
sqlSession.insert("userMapper.saveUser",user);
// 提交事务
sqlSession.commit();
sqlSession.close();
}
}
插入操作注意问题:
- 插入语句使用
insert
标签 - 在映射文件中使用
parameterType
属性指定要插入的数据类型 Sql
语句中使用 #{实体属性名} 方式引用实体中的属性值- 插入操作使用的
API
是sqlSession.insert(“命名空间.id”,实体对象)
- 插入操作涉及数据库数据变化,所以要使用
sqlSession
对象显示的提交事务,即sqlSession.commit()
1.3.2. MyBatis 的修改数据操作
- 编写
UserMapper
映射文件
<?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">
<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
<!--修改-->
<update id="updateUser" parameterType="com.study.pojo.User">
UPDATE user SET username = #{username} WHERE id = #{id}
</update>
</mapper>
- 编写修改实体
User
的代码
package com.study.test;
import com.study.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test3() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(2);
user.setUsername("Eric");
sqlSession.insert("userMapper.updateUser",user);
// 提交事务
sqlSession.commit();
sqlSession.close();
}
}
修改操作注意问题:
- 修改语句使用
update
标签 - 修改操作使用的
API
是sqlSession.update(“命名空间.id”,实体对象)
1.3.3. MyBatis 的删除数据操作
- 编写
UserMapper
映射文件
<?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">
<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
<!--删除-->
<delete id="deleteUser" parameterType="int">
DELETE FROM user where id = #{id}
</delete>
</mapper>
- 编写删除数据的代码
package com.study.test;
import com.study.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test4() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("userMapper.deleteUser",2);
// 提交事务
sqlSession.commit();
sqlSession.close();
}
}
除操作注意问题:
- 删除语句使用
delete
标签 Sql
语句中使用 #{任意字符串} 方式引用传递的单个参数- 删除操作使用的
API
是sqlSession.delete(“命名空间.id”,Object)
1.4. MyBatis 的映射文件概述
1.5. Mybatis 相应 API 介绍
SqlSession
工厂构建器 SqlSessionFactoryBuilder
SqlSessionFactory build(InputStream inputStream)
通过加载 mybatis
的核心文件的输入流的形式构建一个 SqlSessionFactory
对象
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources
工具类,这个类在 org.apache.ibatis.io
包中。Resources
类帮助你从类路径下、文件系统或一个 web URL
中加载资源文件。
SqlSession
工厂对象 SqlSessionFactory
SqlSessionFactory
有多个个方法创建 SqlSession
实例。常用的有如下两个:
SqlSession
会话对象
SqlSession
实例在 MyBatis
中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
执行语句的方法主要有:
<T> T selectOne(String statement, Object parameter) <E> List<E> selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
操作事务的方法主要有:
void commit()
void rollback()
2. Mybatis 的 Dao 层实现
2.1. 传统开发方式
- 编写
UserDAO
接口
package com.study.dao;
import com.study.pojo.User;
import java.io.IOException;
import java.util.List;
public interface UserDAO {
List<User> findAll() throws IOException;
}
- 编写
UserDAOImpl
实现
package com.study.dao.impl;
import com.study.dao.UserDAO;
import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserDAOImpl implements UserDAO {
@Override
public List<User> findAll() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("userMapper.findAll");
sqlSession.close();
return userList;
}
}
- 测试传统方式
package com.study.test;
import com.study.dao.UserDAO;
import com.study.dao.impl.UserDAOImpl;
import com.study.pojo.User;
import java.util.List;
public class MybatisTest {
@Test
public void test5() throws IOException {
UserDAO userDAO = new UserDAOImpl();
List<User> userList = userDAO.findAll();
System.out.println(userList);
}
}
2.2. 代理开发方式
代理开发方式介绍
采用 Mybatis
的代理开发方式实现 DAO
层的开发,这种方式是我们后面进入企业的主流。
Mapper
接口开发方法只需要程序员编写 Mapper
接口(相当于 Dao
接口),由 Mybatis
框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边 Dao
接口实现类方法。
Mapper
接口开发需要遵循以下规范:
Mapper.xml
文件中的namespace
与mapper
接口的全限定名相同Mapper
接口方法名和Mapper.xml
中定义的每个statement
的id
相同Mapper
接口方法的输入参数类型和mapper.xml
中定义的每个sql
的parameterType
的类型相同Mapper
接口方法的输出参数类型和mapper.xml
中定义的每个sql
的resultType
的类型相同
- 编写
UserMapper
接口
package com.study.dao;
import com.study.pojo.User;
public interface UserMapper {
User findById(int id);
}
- 测试代理方式
package com.study.test;
import com.study.dao.UserMapper;
import com.study.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void test6() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findById(1);
System.out.println(user);
}
}