概念
mybatis是一个持久层框架,实现了对JDBC的封装,与数据库的连接为TCP连接。
其基本思想是通过动态代理接口的方法创建一个dao层的对象,该对象通过配置文件或者注解中sql语句与方法的对应实现数据库的增删改查。
基本原理:通过读取核心配置文件(配置数据库连接信息,mapper配置文件路径等)创建sqlsession对象,sqlsession对象中即封装了连接池,获得与数据库的连接;通过mapper配置文件获得接口方法的返回值及sql语句。通过sqlSession对象获取mapper的代理对象即可实现对数据库的增删改查。
2.基于配置文件实现
核心配置文件:SqlMapConfig.xml,设置别名在这里
mapper接口代码:
public interface UserMapper {
public List selectByVoif(QueryVo vo);
}
UserMapper.xml文件配置(注意文件名需与mapper接口相同)resultType为返回值类型,parameterType为传入参数类型
`
`
运行代码:
public class Demo {
private InputStream is;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private UserMapper mapper;
@Before //在test方法前执行
public void init(){
try{
//获取输入流对象
is = Resources.getResourceAsStream("mybatis.xml");
//获取factory对象
factory = new SqlSessionFactoryBuilder().build(is);
//创建sqlsession对象
sqlSession = factory.openSession();
//创建代理对象
mapper = sqlSession.getMapper(UserMapper.class);
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void testSelectByVoif(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("王");
vo.setUser(user);
List users = mapper.selectByVoif(vo);
for (User u : users) {
System.out.println(u);
}
}
@After //在test方法后执行
public void destory(){
//提交事务
sqlSession.commit();
try {
sqlSession.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.基于注解实现
核心配置文件:同上
mapper接口代码:
`public interface AccountMapper {
@Select("select * from account")
@Results(value = {
@Result(property = "user" ,column = "uid",one = @One(select = "com.mybatis.mapper.UserMapper.findById",fetchType = FetchType.LAZY))
})
List findAll();
@Select("select * from account where uid = #{uid}")
List FindByUid(Integer uid);
}`
运行代码:
private InputStream is;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private AccountMapper mapper;
@Before //在test方法前执行
public void init(){
try{
//获取输入流对象
is = Resources.getResourceAsStream("mybatis.xml");
//获取factory对象
factory = new SqlSessionFactoryBuilder().build(is);
//创建sqlsession对象
sqlSession = factory.openSession();
//创建代理对象
mapper = sqlSession.getMapper(AccountMapper.class);
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void testFindAll(){
List accounts = mapper.findAll();
for (Account account : accounts) {
System.out.println(account.getMoney());
System.out.println(account.getUser());
}
}
补充:上面的配置中已经配置了事务,默认的提交方式即为手动提交,也就是每次执行完语句后需要手动提交sqlSession.commit();也可以设置为自动提交: 方法一:factory.openSession(true)
方法二:sqlsession.setAutoCommit(true)
4.动态sql语句
mybatis提供了一系列的动态sql语句用于实现复杂sql语句的查询。
- if
- where
- set
UPDATE USER
username=#{username},
sex=#{sex},
birthday=#{birthday},
address=#{address},
WHERE id=#{id}
- foreach
collection:表示要遍历的集合元素
ids为javaBean中的元素
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素
sperator:代表分隔符
- choose
5.多表查询
- 一对一查询
- 一对多查询
findUserAccountList
当然,多表查询的前提是在实体类中建立实体类之间的对应关系。
5.延迟加载
- 所谓延迟加载就是在需要用到数据时才进行加载,不需要数据时就不加载数据,也成为懒加载。可以提高数据库的查询性能。
- 实现懒加载的前提条件查询语句为是 4)中提到的方案二,即第二次查询由第一次查询的resultMap中的或者标签中的select指定。
- 开启延迟加载策略
- 1.核心配置文件配置如下内容:
- 注解实现懒加载:见3)中注解@Results中的fetchType = FetchType.LAZY。
补充:注解说明
@Results:代替标签
>
属性介绍:
id : 标记
value : @Result[]
@Result:代替标签和:其中将属性id设为true即为id
>
属性介绍:
column:代表数据库中的查询列
property:javaBean中的属性名
one:需要使用@One注解
many:需要使用@Many注解
@ResultMap
属性
引用添加的Results
@One注解: (一对一)
代替了标签
属性:
select : 指定用来查询的sqlmapper方法
fetchType : 会覆盖全局配置参数lazyLoadingEnabled
@Many注解 : (一对多)
代替了
属性 :
select : 指定用来查询的sqlmapper方法
fetchType : 会覆盖全局配置参数lazyLoadingEnabled