它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系
开发实例
1.导入依赖的jar包
mysql mysql-connector-java 5.1.10 org.mybatis mybatis 3.4.6 org.projectlombok lombok 1.18.12 provided junit junit 4.10 test
2.创建一个类
package com.yogurt.po;import lombok.*;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {private Integer id;private String name;private Integer score;private Integer age;private Integer gender;}
3.编写映射文件
INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender}); DELETE FROM student WHERE id = #{id};
4.编写数据源
db.url=jdbc:mysql://192.168.183.129:3306/yogurt?characterEncoding=utf8
db.user=root
db.password=root
db.driver=com.mysql.jdbc.Driver
5.全局配置文件
6.编写业务
package com.yogurt.dao;import com.yogurt.po.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class StudentDao {private SqlSessionFactory sqlSessionFactory;public StudentDao(String configPath) throws IOException {InputStream inputStream = Resources.getResourceAsStream(configPath);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public List findAll() {SqlSession sqlSession = sqlSessionFactory.openSession();List studentList = sqlSession.selectList("findAll");sqlSession.close();return studentList;}public int addStudent(Student student) {SqlSession sqlSession = sqlSessionFactory.openSession();int rowsAffected = sqlSession.insert("insert", student);sqlSession.commit();sqlSession.close();return rowsAffected;}public int deleteStudent(int id) {SqlSession sqlSession = sqlSessionFactory.openSession();int rowsAffected = sqlSession.delete("delete",id);sqlSession.commit();sqlSession.close();return rowsAffected;}
}
7.测试
public class SimpleTest {private StudentDao studentDao;@Beforepublic void init() throws IOException {studentDao = new StudentDao("mybatis-config.xml");}@Testpublic void insertTest() {Student student = new Student();student.setName("yogurt");student.setAge(24);student.setGender(1);student.setScore(100);studentDao.addStudent(student);}@Testpublic void findAllTest() {List all = studentDao.findAll();all.forEach(System.out::println);}
}
总结:
在配置文件中各个子标签说明如下
一般将数据源的信息单独放在一个properties文件中,然后用这个标签引入,在下面environment标签中,就可以用${}
占位符快速获取数据源的信息
用来开启或关闭mybatis的一些特性,比如可以用
在mapper.xml中需要使用parameterType和resultType属性来配置SQL语句的输入参数类型和输出参数类型,类必须要写上全限定名,比如一个SQL的返回值映射为Student类,则resultType属性要写com.yogurt.po.Student,这太长了,所以可以用别名来简化书写,比如
用来配置数据源
用来配置mapper.xml映射文件,这些xml文件里都是SQL语句
${}
和#{}
一般会采用#{}
,#{}
在mybatis中,最后会被解析为?
,其实就是Jdbc的PreparedStatement中的?
占位符,它有预编译的过程,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入
而${}
,一般会用在模糊查询的情景,比如SELECT * FROM student WHERE name like '%${name}%';
package com.yogurt.mapper;import com.yogurt.po.Student;import java.util.List;public interface StudentMapper {List findAll();int insert(Student student);int delete(Integer id);List findByName(String value);
}
我们的mapper.xml文件如下
INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender}); DELETE FROM student WHERE id = #{id};
mapper接口和mapper.xml之间需要遵循一定规则,才能成功的让mybatis将mapper接口和mapper.xml绑定起来
加载普通的xml文件,传入xml的相对路径(相对于类路径)
使用mapper接口的全限定名来加载,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一个目录
扫描指定包下的所有mapper,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一目录
通常我们会将数据库表的主键id设为自增。在插入一条记录时,我们不设置其主键id,而让数据库自动生成该条记录的主键id,那么在插入一条记录后,如何得到数据库自动生成的这条记录的主键id呢?
使用useGeneratedKeys
和keyProperty
属性
INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});
默认开启,同一个SqlSesion级别共享的缓存,在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库,当然,若第一次和第二次相同的SQL查询之间,执行了DML(INSERT/UPDATE/DELETE),则一级缓存会被清空,第二次查询相同SQL仍然会走数据库
一级缓存在下面情况会被清除
默认关闭,可通过全局配置文件中的
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。