mybatis入门
自我感觉
MyBatis
是一个半自动的ORM
框架,因为完整的ORM
框架是已经对JDBC
进行了封装,很少会让你写sql
语句,一般会推荐你写HQL
,但是MyBatis
框架是必须要求开发者编写SQL
语句的。
吐槽
Q:竟然是半自动ORM
框架,还要自己写sql
语句,为什么还要用他,还不如用hibernate
完整的ORM
框架呢。
A:其实MyBatis
和Hibernate
他们直接的相同点实在太多,比如二级缓存
、Session
的生命周期都是一致的。唯一的不同点是MyBatis
可以进行详细的SQL
设计,有比较成熟的逻辑判断,可以动态的执行SQL
,并且上手难度比Hibernate
低。
百度百科
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
特点
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管-理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
入门例子
第一步: 新建一个Maven项目
我这里新建了一个Web
的Maven项目,你们新建一个普通的Maven
项目就可以了,如果不会创建项目的,可以去百度一下,这里就不多描述了。
第二步: 添加依赖包
mybatis没有像Spring
一样有很多jar包,如果你只用到基础,那么就导入MyBatis
包就可以了。当然数据库驱动包也必须要,不然怎么连接数据库
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
第三步:创建MyBatis所需要的配置文件
首先先新建一个连接数据库的配置文件:
jdbc.properties文件
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///db_test
jdbc.username=root
jdbc.password=root
文件根据自己的数据库做修改
配置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>
<!-- 引入JDBC配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 批量设置别名 -->
<typeAliases>
<package name="cn.wenhaha.entiy"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 需要映射文件 -->
<mappers>
<package name="cn.wenhaha.mappers"/>
</mappers>
</configuration>
创建实体类
Student.java
package cn.wenhaha.entiy;
public class Student {
private int id;
private String name;
private int age;
public Student() {
super();
}
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
定义一个接口
StudentMapper.java
package cn.wenhaha.mappers;
import java.util.List;
import cn.wenhaha.entiy.Student;
public interface StudentMapper {
/**
* 添加
* @param studnet
* @return
*/
public int add(Student studnet);
/**
* 删除
* @param id
*/
public void delete(int id);
/**
* 更新
* @param student
*/
public void updata(Student student);
public List<Student> getAll();
}
为接口写配置文件
在这里不需要写实现该接口的实体类,我们只需要写
MyBatis
的配置文件,就可以让MyBatis
自动实现。所以用了MyBatis
后,我们是面向接口编程
StudentMapper.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="cn.wenhaha.mappers.StudentMapper">
<!-- 设置自定义结果集 -->
<resultMap type="Student" id="StudentResult">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<!-- 插入就用insert标签 id对应接口的方法名 parmeterType 是参数的类型 -->
<insert id="add" parameterType="student" >
insert into t_student values(#{id},#{name},#{age})
</insert>
<delete id="delete" parameterType="Integer">
delete from t_student where id=#{id}
</delete>
<update id="updata" parameterType="Student">
update t_student set name=#{name},age=#{age} where id=#{id}
</update>
<select id="getAll" resultMap="StudentResult">
select * from t_student
</select>
</mapper>
最后一步:测试
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("configuration.xml");
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
SqlSession openSession = sqlSessionFactory.openSession();
StudentMapper mapper = openSession.getMapper(StudentMapper.class);
List<Student> all = mapper.getAll();
System.out.println(all);
}
输出结果: