一、相较于Hibernate,mybatis的优势在哪里?
Hibernate缺点:
1、运行效率低,内存占用比较严重
2、针对单一对象的增删改查,适合Hibernate,而Hibernate在批量操作时处于弱势
3、虽然Hibernate引入一二级缓存、lazyload、查询缓存等更多优化空间(对于那些改动 不大且经常使用的数据,可将他们放入缓存中),但Hibernate对于持久层封装过于完 整,导致开发人员无法对sql进行优化,不适用于大型项目
mybatis优点:
1、代码量大大减少,开发效率高
2、 MyBatis相当灵活,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统 一管理和优化,并可重用
3、运行效率高
下面再详细介绍一下mybatis的主要成员:
1、Configuration
MyBatis所有的配置信息都保存在Configuration对象之中,配置文件的大部分配置都会存储到该类中
2、SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
3、Executor
MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
4、ParameterHandler
负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
5、ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
6、TypeHandler
负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
7、MappedStatement
MappedStatement维护一条<select|update|delete|insert>节点的封装
8、SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
9、BoundSql
表示动态生成的SQL语句以及相应的参数信息
二、下面直接做案列,Mybatis如何与数据库(这里我们用SQL Server2012,也可用MySQL等其他数据库)连接,操作简单的查询。
1、首先创建一个简单的数据库:(如下图)
2、新建一个Java Project项目,名为MybatisStudy(这里用的开发工具是MyEclipse2015,也可用Eclipse或者其他):
(1)、下载一个Mybatis的jar包引入项目中,这里我用的是3.4.6版本;下载地址:链接:https://pan.baidu.com/s/19YHzR78fKLWSqkHBfDE49A;提取码:kp2z
(2)、连接SQL Server2012还需在项目中引用JDBC驱动,这里我用的是4.1版本;下载地址:链接:https://pan.baidu.com/s/1ETzeXwbmEHVmtI5EwOyg8g;提取码:qyn9
这样必要的jar也就引用好了,项目建好如下图:
3、在org.lanqiao.entity包下创建Person实体类,代码如下:
package org.lanqiao.entity;
public class Person {
private int studentid;
private String name;
private int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int studentid, String name, int age) {
super();
this.studentid = studentid;
this.name = name;
this.age = age;
}
public int getStudentid() {
return studentid;
}
public void setStudentid(int studentid) {
this.studentid = studentid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.studentid + "," + this.name + "," + this.age;
}
}
4、创建实体Person实体的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="org.lanqiao.entity.personMapper"><!-- 放映射文件路径 -->
<select id="queryPersonById" resultType="org.lanqiao.entity.Person" parameterType="int">
select * from T_Person where studentid = #{studentid}
</select>
</mapper>
注:org.lanqiao.entity.personMapper,映射文件的存放路径;org.lanqiao.entity.Person,映射的实体类路径;parameterType="int"传入参数的类型为int类型,studentid是下面sql语句的参数,int类型;
5、创建连接数据库的xml配置文件(这里名为conf.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.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://localhost:1433;DatabaseName=db_MybatisStudy"/>
<property name="username" value="sa"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件 -->
<mapper resource="org/lanqiao/entity/personMapper.xml"/>
</mappers>
</configuration>
6、创建一个测试类,代码如下:
package org.lanqiao.entity;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class TestMybatis {
public static void main(String[] args) throws IOException{
// 加载Mybatis配置文件(为访问数据库)
Reader reader = Resources.getResourceAsReader("conf.xml");
// 创建SqlSessionFactory对象,相当于JDBC的connection对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//session相当于connection
SqlSession session = sessionFactory.openSession();
//相当于SQL语句
String statement = "org.lanqiao.entity.personMapper.queryPersonById";
Person person = session.selectOne(statement,1);
System.out.println(person);
session.close();
}
}
通过以上详细操作即可通过Mybatis技术对数据库数据进行持久化操作