目录
什么是mybatis
本文开始:
理解要点:
其他资料:
正文开始
一、mybatis框架配置文件(xml)概述
1.mybatis基础配置文件结构(xml)
2.mapper映射文件(xml)
二、参考代码(非完全代码)
1.部分xml配置
1.1.mybatis基本配置文件
1.2. mapper.xml部分配置文件
2.部分java代码
2.1 用户数据库操作接口
2.2.实体类
2.3.测试代码
[百度百科]。
我个人的理解就是:这个框架的出现减少了我们在传统持久层的注册驱动、获得数据库连接、设置SQL语句、获得SQL对象、执行SQL语句到数据库、获得结果集、处理结果集、关闭数据库连接相关对象的繁杂步骤。让我们只需要在实际开发中专注于SQL语句,从而起到了提升开发效率的作用
编程中有个概念——不要重复写一样的代码。因为编程的工作应该更加专注于对业务的实现,而那些重复性的工作应尽量减少,重复性的写代码不仅浪费时间,而且没有意义(这也就是通常程序员自黑说的搬砖,搬砖并不能提升技能,只能固化思维)。所以这些具有重复开发部分的都应该被封装成一个方法、一个类或一个框架。
所以这里mybatis框架,就是为了解决开发过程中,一些对数据操作的持久层重复性工作做了一个封装。所以,从入门角度出发,mybatis执行过程:
注:配置文件结构copy自官网
configuration(顶级标签,代表设置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
在xml中配置文件骨架(xml)
......
[http://www.mybatis.org/mybatis-3/zh/configuration.html#settings]
[http://www.mybatis.org/mybatis-3/zh/configuration.html#typeAliases]
[http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers]
......
......
......
......
......
以上只是mybatis的基本配置环境,接下来才是涉及到开发者最应该熟悉文件——mapper.xml
配置mapper映射文件,基于基础配置文件的mappers标签中地址。因为在mybatis执行过程中涉及到读取配置文件的操作,所以,构建器会根据基础配置文件的mapper resource属性,根据其值中的文件路径查找到mapper映射文件,然后读取mapper映射文件构造dao代理类。所以配置mapper文件就等于在构建代理类的功能或模样啦。因此,在mapper文件中如何配置决定了代理类如何执行,有哪些功能,返回什么等等具有重复性质的操作。根据官网描述能节省95%代码,所以,对于一个大系统来说,这是非常具有意义的框架,有效提高了开发效率。至此,简单介绍一下mapper文件的结构
注:以下mapper.xml文件结构copy自官网
- cache – 对给定命名空间的缓存配置。
- cache-ref – 对其他命名空间缓存配置的引用。
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap– 已被废弃!老式风格的参数映射。更好的办法是使用内联参数,此元素可能在将来被移除。文档中不会介绍此元素。- sql – 可被其他语句引用的可重用语句块。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
那么mapper.xml骨架就是大体结构就是:
insert into tabelname values(value1,value2........);
update tabelnaem set key1=value1 , key2=value2.............
delete tablename where key=value and .... and ....
除此之外,还有不少能减少代码的标签,这里不再一一介绍,mybatis提供的功能还是很强大的!
这里值得注意的是,在mapper.xml中如果有的方法涉及到参数,例如select 标签的属性parameterType,如果提供的参数是一个对象,那么mybatis将直接提取对象中的属性,我们在使用的时候就可以用 [#{}] 的形式直接提取对象中的属性到SQL语句中。而不需要 [对象.属性] 的形式去提取数据到SQL语句中,这样子还是升了不少代码,当然,如果对象中还嵌套A着另外的对象B,此时如果还需要使用对象A中的对象B的部分属性,就需要[B.属性],看起来很复杂,但是mybatis仍然让我们省了至少[对象.]吧。
insert into user(`username`,`birthday`,`sex`,`address`)
values
(#{username},#{birthday},#{sex},#{address})
delete from user where id =#{userid}
import com.itheima.domain.User;
import java.util.List;
/**
* 用户信息操作接口
* @Auther
*/
public interface UserDao {
/**
* 添加用户
*
* @param user
* @return
*/
int insertUser(User user);
/**
* 通过id删除用户
*
* @param userid
* @return
*/
int deleteById(int userid);
/**
*
* 查询所有方法
* @return
*/
List findAll();
/**
*
* 通过id查找用户
* @param id
* @return
*/
User findById(int id);
}
import java.io.Serializable;
import java.util.Date;
/**
* 实体类
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
/**
* 这里只是一部分测试代码,不包含配置文件
*/
SqlSessionFactory factory;
SqlSession session;
UserDao userDao;
@Before
public void createFactroy() throws IOException {
//2.加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//3~4.构建配置构建器,并给出会话工厂
factory = new SqlSessionFactoryBuilder().build(in);
//5.会话工厂给出SQL会话
session = factory.openSession();
//6.SQL会话给出代理数据库操作代理类
userDao = session.getMapper(UserDao.class);
}
@After
public void closeSession() {
//9.SQLsession会话关闭
session.close();
}
@Test
public void findUserById() {
//7.dao层执行方法
User user = userDao.findById(41);
//8.session.commit(),这里只是涉及查询,所以没有事务,略
System.out.println(user);
}