mybatis是一个非常好的持久层框架,有字段映射,有sql缓存,还能很好的和spring做集成,用的人真是非常非常多,尤其是互联网公司,基本上不用hibernate的都在用mybatis。
我也用过很长时间的mybatis,总的来说mybatis的优点主要体现在以下几个方面:
- java实体和数据库字段做映射,简化jdbc操作,不用写各种各样的set get字段操作。
- 可以利用第三方的工具,根据model对象,自动生成xml mapper配置文件,基本不用写sql
- sql集中存储,上线后如果sql有问题,可以直接改配置,不用编译java,重启就能运行(这一点是别人提的,我不是很赞同,集中存储其实意义也不大,生产中直接改sql,然后上线运行估计没有哪个领导同意这个干的。)
- mybatis的缓存,这个意义也不是很大,如果真到了靠这点缓存来提高性能的地步了,估计就不单单是mybatis的原因了。
当然缺点也有不少,我简单列几点:
- mybatis里面的特殊字符,比如<>等,很容易造成错误,且mybatis的错误提示不是很具体。
- mybatis更新比较缓慢,其实这几年都没什么更新,而且也没什么要更新的了。确实是这样,mybatis后来新加的基于注解的操作,替代xml,意义不是很大,基本很少人用,mybatis的核心在于mapper映射文件,改为注解后,映射文件不存在了。
- 调试比较麻烦,主要是因为如果改mapper配置文件,工程需要重启,不知道现在的jrebel能不能动态加载mapper文件。
个人建议不用mapper,因为spring的JDBCTempalte出来了,mybatis有的,JDBCTemplate全都有,而且更容易调错。当然这仅是建议,下面还是得写个例子的。
pom.xml依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
Mybatis配置文件Configuration.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/StaffMapper.xml"/>
</mappers>
</configuration>
这里面主要是配置连接数据库的,没什么复杂的。
StaffMapper.xml映射文件
<?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">
<mapper namespace="com.critc.dao.StaffDao">
<select id="list" resultType="com.critc.model.Staff">
select * from staff
</select>
<insert id="add" parameterType="com.critc.model.Staff">
insert into staff(name)
values(#{name})
</insert>
<update id="update" parameterType="com.critc.model.Staff">
update staff set
name=#{name}
where
id=#{id}
</update>
<delete id="delete" parameterType="int">
delete from staff where
id=#{id}
</delete>
</mapper>
这里面写了增删改查的四个例子,参数类型可以是一个Model,也可以是普通java类型,返回值是放在List容器中的实体类型
StaffDao.java接口映射
public interface StaffDao {
public int add(Staff staff);
public int update(Staff staff);
public int delete(int id);
public List<Staff> list();
}
**接口映射要完全和mapper配置文件一致,如果不一致,启动会报错
**
Staff.java java实体,很简单
public class Staff {
private int id;
private String name;//
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
调用例子
public static void main(String[] args) throws Exception {
String resource = "configuration.xml";//读取Mybatis的数据库连接配置及mapper配置,
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);//建立数据库连接
SqlSession session = factory.openSession();//打开连接
StaffDao staffDao = session.getMapper(StaffDao.class);//加载映射文件
Staff staff = new Staff();
staff.setName("Mybatis");
staffDao.add(staff);//新增
List<Staff> list = staffDao.list();
for (Staff staff2 : list) {
System.out.println(staff2.getName());//查询
}
session.commit();//数据提交
session.close();//连接关闭
}
**这一块和hibernate基本一致,先读取配置,打开数据库连接,然后新建实体,执行新增,查询,数据库提交,关闭连接等
**