MyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于ava的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects (DAO)。
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久化框架
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通java对象)映射成数据库中的记录
MyBatis是一个半自动的ORM框架
(1)创建项目
a. 新建一个空项目,项目名为SSM;
b. 在项目SSM中新建一个maven模块,名为MyBatis_Demo;
c. 在该模块中,test文件夹中存放测试用代码,main文件夹中的java文件夹存放开发代码,main文件夹中的recourse文件夹存放配置文件;
d. 在MySQL数据库中创建一个数据库ssm,创建一个表t_user;表结构如下(id自增):
(2)打包方式:jar
在maven项目的pom.xml文件中添加:
(3)引入依赖
在pom.xml文件中添加如下代码:
- <dependencies>
- <!-- Mybatis核心 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.7</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.3</version>
- </dependency>
-
- <!--实体化类要用到的@Data,就不用构造函数了-->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.16.10</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
(4)创建实体类
在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.pojo.User.java(命名可根据自己情况随意起,前面的com.wsl.mybatis.pojo表示文件目录,User.java是文件名)
- import lombok.Data;
-
- @Data
- public class User {
-
- private Integer id;
-
- private String username;
-
- private String password;
-
- private Integer age;
-
- private String gender;
-
- private String email;
-
- }
(5)创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类。
在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.mapper.UserMapper.java文件。
- import com.wsl.mybatis.pojo.User;
- import java.util.List;
-
- public interface UserMapper {
-
- // 添加用户
- int insertUser();
-
- // 更新用户
- void updateUser();
-
- // 删除用户
- void delUser();
-
- // 根据id查找用户
- User getUserById();
-
- // 查找所有用户
- List
getAllUser() ; -
- }
(5)创建MyBatis的映射文件
在src/main/recourse目录下,创建com.wsl.mybatis.mapper.UserMapper.xml
注意:
1. MyBatis中可以面向接口操作数据,要保证两个一致:
mapper接口的全类名和映射文件的命名空间(namespace)保持一致
mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
2.查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系:
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
3.当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常 TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值
- "1.0" encoding="UTF-8" ?>
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.wsl.mybatis.mapper.UserMapper">
-
-
- <insert id="insertUser">
- insert into t_user values(null,'张三','123',23,'女','2436@qq.com');
- insert>
-
-
- <update id="updateUser">
- update t_user set username='李四',password='abc' where id=3;
- update>
-
-
- <delete id="delUser">
- delete from t_user where id=4;
- delete>
-
-
-
- <select id="getUserById" resultType="com.wsl.mybatis.pojo.User">
- select * from t_user where id = 3;
- select>
-
-
- <select id="getAllUser" resultType="com.wsl.mybatis.pojo.User">
- select * from t_user;
- select>
-
- mapper>
(6)创建MyBatis核心配置文件:application.xml
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下
- "1.0" encoding="UTF-8" ?>
- 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/MyBatis" />
-
- <property name="username" value="root" />
-
- <property name="password" value="password" />
- dataSource>
- environment>
- environments>
-
-
- <mapper resource="mappers/UserMapper.xml"/>
- mappers>
-
- configuration>
(7)创建测试类
在src/test/java目录下,创建com.wsl.mybatis.MyBatisTest.java文件
SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的 会话)
SqlSessionFactory:是“生产”SqlSession的“工厂”。
工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的 相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
- import com.wsl.mybatis.mapper.UserMapper;
- import com.wsl.mybatis.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 testInsert() throws IOException {
- // 获取配置文件的输入流
- InputStream is = Resources.getResourceAsStream("application.xml");
- // 获取SqlSessionFactoryBuilder对象
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- // 获取sqlSessionFactoryBuilder对象
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- // 获取SQL的会话对象,是MyBatis提供的操作数据库的对象,true表示自动提交commit
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
-
- // 方法1:
- // 获取UserMapper的代理实现类对象
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- // 调用userMapper接口中的方法,实现添加操作
- int result = userMapper.insertUser();
-
- // // 方法2:提供sql以及唯一标识找到sql并执行,唯一标识是namespace.sqlId
- // int result=sqlSession.insert("com.wsl.mybatis.Mapper.UserMapper.insertUser");
-
- System.out.println("结果是:"+result);
-
- // 关闭会话
- sqlSession.close();
- }
-
-
- // 修改
- @Test
- public void TestUpdate(){
- InputStream is = Resources.getResourceAsStream("application.xml");
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- mapper.updateUser();
- sqlSession.close();
- }
-
- // 删除
- @Test
- public void TestDel(){
- InputStream is = Resources.getResourceAsStream("application.xml");
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- mapper.delUser();
- sqlSession.close();
- }
-
- // 根据id查找User
- @Test
- public void TestFindById(){
- InputStream is = Resources.getResourceAsStream("application.xml");
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- User user = mapper.getUserById();
- System.out.println(user);
- sqlSession.close();
- }
-
- // 查询所有的User
- @Test
- public void TestGetAllUsers(){
- InputStream is = Resources.getResourceAsStream("application.xml");
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- List<User> users = mapper.getAllUser();
- // 循环输出List里面的内容
- users.forEach(System.out::println);
- sqlSession.close();
- }
-
- }
接下来就可以通过每个@Test注释来启动每个测试代码,验证是否正确。