1.什么是mybatis?
Mybatis 是⼀个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL
语句本⾝,不需要花费精⼒去处理加载驱动、创建连接、创建stamement等繁杂的过程。程序员直
接编写原⽣态 sql,可以严格控制sql执⾏性能,灵活度⾼。
·Mybatis 可以使⽤ XML 或注解来配置和映射原⽣信息,将 POJO 映射成数据库中的记录,避免
了⼏乎所有的 JDBC 代码和⼿动设置参数以及获取结果集。
2.Mybatis使用过程
MyBatis基本使⽤的过程⼤概可以分为这么⼏步:1)创建SqlSessionFactory
可以从配置或者直接编码来创建SqlSessionFactory
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new sqlSessionFactoryBuilder().build(inputStream)
2)通过SqlSessionFactory创建SqlSessionFactory(会话)可以理解为程序和数据库之间的桥梁
SqlSession session = SqlSessionFactory.openSession();
3)通过sqlsession执⾏数据库操作
可以通过 Sqlsession 实例来直接执⾏已映射的 SQL 语句:
Blog blog = (Blog)session.selectOne('org.mybatis.example.BlogMapper.selectBlog',101);
更常⽤的⽅式是先获取Mapper(映射),然后再执⾏SQL语句:
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
4)调⽤session.commit() 提交事务
如果是更新、删除语句,我们还需要提交⼀下事务。
5)调⽤session.close() 关闭会话
3.在mapper中如何传递多个参数
⽅法1:顺序传参法
public UserselectUser (String name, int deptId) ;
<selectid = "selectUser "resultMap = "UserResultMap" >
select * from user
where user_name = #{0} and dept_id = #{1}
< /select>
\ # { } ⾥⾯的数字代表传⼊参数的顺序。
这种⽅法不建议使⽤,s q l层表达不直观,且⼀旦顺序调整容易出错。
⽅法2:@Param注解传参法
public UserselectUser(@Param( "userName" ) String name, int @Param( " deptId " ) deptId ) ;
<select id = "selectUser" resultMap = "UserResultMap" >
select * from user
where user_name = # {userName} and dept_id = #{deptId}
</select>
⽅法3:Map传参法
public Userselect User (Map<String , Object > params) ;
<selectid = "selectUser" parameterType = "java.util.Map " resultMap = "UserResultMap " >
select * from user
where user_name = # {userName} and dept_id = #{deptId}
</select>
\ # { } ⾥⾯的名称对应的是Map⾥⾯的key名称。
这种⽅法适合传递多个参数,且参数易变能灵活传递的情况。
⽅法4:Java Bean传参法
public User selectUser(User user);
<select id = "selectUser " parameterType = "com.jourwon.pojo.User"
resultMap= " UserResultMap " >
select * fromuser
where user_name= # {userName} and dept_id= # {deptId}
</select>
\ # { } ⾥⾯的名称对应的是User类⾥⾯的成员属性。
这种⽅法直观,需要建⼀个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理⽅
便,推荐使⽤。