有两种方式:
- 接口代理方式开发
- 传统方式
两种方式的区别:
可以省略我们自己定义实现类的操作,将来mybatis会帮我们去定义实现类以及创建实现类对象(换句话来说直接 UserDao.findAll()而不用 UserDaoImpl.findAll() )。
第一种方式:传统方式
1、编写dao层
public interface UserDao {
//查询所有
List<User> findAll() throws IOException;
}
2、编写dao层实现类
/*
Dao层实现类
*/
public class UserMapperImpl implement UserMapper{
/*
定义查询所有用户的方法
*/
public List<User> findAll() throws IOException {
//加载核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> list = sqlSession.selectList("userMapper.findAll");
//释放资源
sqlSession.close();
//返回结果
return list;
}
}
3、UserMapper.xml映射文件的编写
<!--namespace是命名空间,可以看成是这个文件的标识 权限定类名-->
<mapper namespace="com.hello.mapper.UserMapper">
<!--查询所有-->
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
</mapper>
4、测试传统方式(略)
第二种:代理开发方式
目前企业主流的方式就是使用接口 + 配置文件的方式进行的dao层开发
Mapper接口开发方法只需要程序员编写Mapper接口(相当于dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边dao接口实现类方法。
Mapper接口开发只需要遵循以下规范:
- Mapper.xml文件中的namespace与Mapper接口的全限定名相同 (即com.hello.mapper.UserMapper和UserMapper)
- Mapper接口方法名和Mapper.xml中定义的每个statement的id属性相同(方法名都是findById)
- Mapper接口方法的输入参数类型和Mapper.xml中定义的每个sql的parameterType的类型相同(都是传入的参数都是int类型)
- Mapper接口中方法的返回类型要和statement的resultType属性保持一致(返回值都是User对象类型)
其中:statement指的是select,insert,update,delete标签
1、编写dao层
/*
DAO层接口
定义查询所有的方法
*/
public interface UserMapper {
//定义方法,用来查询所有用户(方法名必须和statement的id保持一致)
List<User> findAll();
}
2、模拟service层
/*
模拟service层
*/
public class UserMapperTest extends BaseMapperTest{
//查询所有
@Test
public void testFindAll() {
//调用SqlSession中的getMapper方法,里面传递接口的Class,程序可以直接帮我们以动态代理的方式创建该接口的实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用findAll查询所有
List<User> list = userMapper.findAll();
for (User user : list) {
System.out.println(user);
}
}
}
3、编写xml
<!--namespace是命名空间,可以看成是这个文件的标识-->
<mapper namespace="com.hello.mapper.UserMapper">
<!--查询所有-->
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
</mapper>
Mybatis编程步骤是什么样的?
- 创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 通过SqlSession执行数据库操作
- 调用session.commit()提交事务
- 调用session.close()关闭会话
常见的数据层访问方式以及比较:
1.JDBC: java原生的关系型数据库访问方式
- 每次操作数据库都需要获取连接关闭连接,在大量访问数据库时,频繁的开关链接消耗性能。
- 需要手动编写sql语句,有学习成本。
- 查询出的结果需要手动进行封装到bean。
- 没有缓存处理机制。
- sql语句写死在程序中吗,需要修改sql必须修改源文件
2.Hibernate: 基于面向对象理念设计的Dao层框架,基本理念就是维护对象到表的映射关系,通过操作对象操作表中的数据,从而可以减少甚至杜绝sql的使用
- 相对比较沉重,效率不好
- 当涉及到比较复杂的查询时,Hibernate的操作对象的方式用起来非常麻烦,甚至无法实现,只能用sql操作
- 底层需要频繁的拼接sql,产生大量冗余的sql
3. MyBatis: 是一种半自动对象-表映射关系的Dao层框架,可以自动的进行对象的封装,但是sql仍然需要自己来写
1.SqlMapConfig.xml:
- 配置数据源
- 配置别名标签
- 缓存的设置
2.XxxMapper.xml
- 映射文件
- 主要写sql,映射关系
3.SqlSessionFactory
- 生成数据库连接
SqlSession
- 执行数据库的CRUD