Mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Mybatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给mybatis去完成。
Mybatis解决JDBC的问题
- 频繁创建和打开、关闭数据连接,太消耗资源
- Sql语句存在硬编码,不利于维护
- Sql参数设置硬编码,不利于维护
- 结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象
入门案例开发流程
1、导入jar包
2、编写核心配置文件
<?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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<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="root" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml"/>
</mappers>
</configuration>
3、映射文件和sql
<?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:命名空间,用于隔离sql语句 -->
<mapper namespace="user">
<!-- id:sql语句的id
parameterType:入参的数据类型
resultType:sql语句返回结果的数据类型
-->
<select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select * from user where id = #{id1}
</select>
<!-- 返回结果为集合时,只需设置其中一个元素的数据类型 -->
<select id="getUsersByName" parameterType="string" resultType="com.mybatis.pojo.User">
<!-- select * from user where username like #{username} -->
select * from user where username like '%${value}%'
</select>
</mapper>
4、生产sqlSessionFactory的工具类和测试代码
package com.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 创建SqlSessionFactoryBuilder对象,用于加载Mybatis的配置文件
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// ibatis的工具类,用于获取配置文件的输入流
InputStream inputStream;
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = ssfb.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
// 通过输入流创建SqlSessionFactory对象
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
测试查询
package com.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 com.mybatis.pojo.User;
import com.mybatis.utils.SqlSessionFactoryUtils;
public class MybatisTest {
@Test
public void testGetUserById() throws IOException{
//创建SqlSessionFactoryBuilder对象,用于加载Mybatis的配置文件
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//ibatis的工具类,用于获取配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream);
//获取session对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//参数1:配置文件中sql语句的id 参数2:配置文件中的参数
User user = sqlSession.selectOne("user.getUserById", 1);
System.out.println(user);
//释放资源
sqlSession.close();
}
@Test
public void testGetUsersByName(){
//用工具类获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//获取session对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//参数1:配置文件中sql语句的id 参数2:配置文件中的参数
List<User> list = sqlSession.selectList("getUsersByName","张");
for(User user:list){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
}
测试插入
<!-- 插入语句标签 -->
<insert id="insertUser" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!-- 将插入到数据库中的user的主键返回给user对象 -->
<!-- <selectKey keyProperty="id " resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> -->
insert into user values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
@Test
public void testInsertUser(){
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("张飞");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("中国");
sqlSession.insert("insertUser", user);
//Mybatis中,事务默认不提交,需要手动设置
sqlSession.commit();
sqlSession.close();
}
除了使用sqlSession.commit()方法设置提交事务以外,还可以在创建sqlSession时设置自动提交事务
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
Mybatis架构图
Mybatis DAO开发
Mybatis动态代理开发
1、Mapper.xml 文件中的namespace与mapper接口的类路径相同。
2、Mapper 接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper 接口方法的输入参数类型和mapperxml 中定义的每个sql的
parameterType的类型相同道道道
4、Mapper接口方法的输出参数类型和mapper.xml 中定义的每个sql的
resultType的类型相同
UserMapper
package com.mybatis.mapper;
import java.util.List;
import com.mybatis.pojo.User;
/**
* 用户信息持久化接口
* @author 58351
*
*/
public interface UserMapper {
/**
* 根据用户id查询用户
* @param id
* @return
*/
User getUserById(Integer id);
/**
* 根据用户名查找用户列表
* @param userName
* @return
*/
List<User> getUserByUsername(String userName);
/**
* 添加用户
* @param user
*/
void insertUser(User user);
}
测试类获取UserMapper的代理实现类然后调用方法
@Test
public void testGetUserById() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
//获取接口的代理实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(29);
System.out.println(user);
sqlSession.close();
}
UserMapper.xml也要在Mybatis的核心配置文件中配置
<mappers>
<mapper resource="mybatis/user.xml"/>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
核心配置文件中别名的使用
<!-- 自定义别名 -->
<typeAliases>
<!-- 单个别名配置,别名使用的时候不区分大小写 -->
<typeAlias type="com.mybatis.pojo.User" alias="user"/>
<!-- 别名包扫描器,别名是类的全称,不区分大小写 -->
<package name="com.mybatis.pojo"/>
</typeAliases>
加载映射文件使用包扫描方式
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml" />
<!-- <mapper resource="mybatis/UserMapper.xml" /> -->
<!-- 包扫描方式加载映射文件
1、接口文件必须和映射文件在同一目录下
2、接口文件必须和映射文件名称一致
-->
<package name="com.mybatis.mapper"/>
</mappers>