MyBatis是什么?
- MyBatis是支持定制化的SQL,存储过程以及高级映射的优秀的持久层框架。
- MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
- MyBatis可以对配置和原生Map使用简单的xml和注解,将接口和Java的POJOS(plain old java Objects,普通的java对象)映射成数据库中的记录。
MyBatis的功能架构分为几点?
- Apl接口层:提供给外部使用的接口Apl,开发人员通过这些本地Apl来操纵数据库。接口层一接受到调用请求就会调用数据库处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事物处理,配置加载和缓存处理,这些都是公用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
MyBatis的优点以及缺点有哪些?
MyBatis优点:
简单易学:本身就很小且简单。没有任何第三方依赖,最简单的安装只要两个Jar文件+配置几个SQL映射文件易于学习,
易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
Sql写在XML里,便于统一管理和优化。通过SQL基本上可以实现我们不使用数据访问框架可以实现的所有功能,或者更多。
解除SQL与程序代码的耦合:通过提供DAL层,将业务逻辑和数据分离,使系统的设计更清晰,
更易维护,更易于单元测试。Sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供XML标签,支持编写动态SQL。
MyBatis缺点:
① 编写SQL语句时工作量很大,尤其是字段多,关联表多时,更是如此
② SQL语句依赖于数据库,导致数据库移植差,不能更换数据库
③ 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,
但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改
④ 二级缓存机制不佳
MyBatis有两个缓存机制:
分别是
- 一级缓存:默认打开
- 二级缓存:默认关闭
MyBatis和Mysql结合使用代码
Users.class
package bean;
public class Users {
private int id;
private char name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getName() {
return name;
}
public void setName(char name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
MyBatisMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mybatis-mapper" "mybatis-3-mapper.dtd" >
<mapper namespace="bean.UsersMapper">
<!-- namespace:代表命名空间,他的命名规则是“表对应的实体类的名字的全路径+Mapper” -->
<select id="GetUsersById" parameterType="int" resultType="Users">
<!-- parameterType:代表查询语句中参数的数据类型
resultType:代表查询的结果用指定数据类型接收-->
select * from users where id = #{id}
</select>
</mapper>
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "mybatis" "mybatis-3-config.dtd" >
<configuration>
<!-- 别名 -->
<typeAliases>
<typeAlias alias="Users" type="bean.Users"/>
</typeAliases>
<!-- 基础环境配置:包含数据源和事务管理 -->
<!-- default的值分为两种一种是开发(development)一种是生产(work) -->
<environments default="development">
<!-- id:代表自己给这条语句的名字 -->
<environment id="environmentdemo">
<!-- 事物管理里面的type="数据源类型JDBC/POJO" -->
<transactionManager type="JDBC"></transactionManager>
<!-- type="连接池(POOLED)" -->
<dataSource type="POOLED">
<!-- property 有4个,分别是加载驱动的地址,连接数据库路径地址,用户名,密码 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1.3306/frank"/>
<property name="usersname" value="root"/>
<property name="password" value="5201314"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件配置 -->
<mappers>
<!-- resource="对应自己创建的那个maper文件" -->
<mapper resource="bean/MaBatisMapper.xml"/>
</mappers>
</configuration>
Test.class
package bean;
import java.io.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;
public class Test {
public static void main(String[] args) throws IOException{
//第一步:读取资源文件,获得一个字符读入流对象
Reader is =Resources.getResourceAsReader("config.xml");
//第二步:创建一个sqlsession
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
Users user = (Users) session.selectOne("bean.UsersMapper."+"GetUsersById",1);
if(user != null){
System.out.println(user.getId()+user.getName()+user.getAge());
}else{
System.out.println("noFrankterweiked");
}
}
}
还需要配置两个dtd的文件还需要导入2个相关的jar包