转载自:https://dingjn-coder.github.io/2020/03/16/%E6%A1%86%E6%9E%B6/Mybatis%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8/#toc-heading-41
Mybatis介绍
Mybatis是一个java持久层框架,内部封装了JDBC,并且做了很多的优化,开发者只需要关注如何写sql语句,不需要处理注册驱动、获取数据库连接等繁杂的过程,使用ORM思想实现对结果集的封装
ORM:对象关系映射,将数据库表的字段与Java实体类的属性对应起来,就可以操作实体类来实现数据库表,需要数据库表的字段与Java实体类的属性保持一致
Mybatis做了哪些优化:
1.数据库连接优化:帮我们优化了数据库的连接以及释放
2.SQL存放优化:SQL统一存取,之前的sql语句散落在各个Java类,可读性很差
3.SQL参数优化:之前的占位符需要一一对应,有一定的局限性,对于不确定的参数无法好的处理,Mybatis引入了EL表达式
4.SQL结果映射:JDBC对于结果处理是很麻烦的,需要一个个获取值然后再给实体对象赋值,Mybatis使用ORM思想实现了对结果集的封装,省略了一大堆代码
5.SQL语句重复优化:对于重复性的部分sql可以单独提取出来,然后进行引用
6.提供了xml标签,支持动态sql
二.快速入门
1.环境搭建
1)创建Maven工程并且导入坐标
2)创建实体类以及dao接口
3)创建Mybatis主配置文件
4)创建dao的映射配置文件
5)开始调用
2.注意事项⚠️:
1)Mybatis中接口名称和映射文件也叫做Mapper
2)映射配置文件mapper的namespace必须是dao接口的全限定类名
3)映射配置文件的操作配置,id必须是dao接口中的方法名
做到了以上3点我们以后无需再写接口的实现类
1.创建实体类以及dao接口
//实体类 属性和表字段一一对应
public class Student implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
//省略getter setter toString...
}
//dao接口
public interface IStudentDao {
/**
* 查询所有学生信息
*/
//使用注解
@Select("select * from student")
List<Student> findAll();
}
2.创建Mybatis主配置文件
<?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>
<!-- shuju -->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源 连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/localtest"></property>
<property name="username" value="root"></property>
<property name="password" value="mysql04141015"></property>
</dataSource>
</environment>
</environments>
<!--指定映射文件的位置,映射文件指的是每个dao对应的独立的配置文件
如果是注解开发,用class
-->
<mappers>
<!--<mapper resource="mapper/IStudentMapper.xml"></mapper>-->
<mapper class="com.djn.demo01.dao.IStudentDao"></mapper>
</mappers>
</configuration>
3.创建dao的映射配置文件
namespace
命名空间:这个是至关重要的,一是利用更长的全限定名将不同的语句隔离开来,而是为了实现接口绑定
<?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">
<!--namespace:Dao的全限定类名 实现绑定接口-->
<mapper namespace="com.djn.demo01.dao.IStudentDao">
<!-- SQL语句
id:dao的对应的方法名称
resultType:sql语句的返回值类型
-->
<select id="findAll" resultType="com.djn.demo01.pojo.Student">
SELECT * FROM student
</select>
</mapper>
4.开始调用方法
1.通过SqlSessionFactoryBuilder创建SqlSessionFactory工厂
2.通过SqlSessionFactory工厂创建SqlSession对象,sqlsession对象包含了执行sql命令所需的方法
3.执行sql语句
4.处理结果
5.关闭sqlsession(重要!!!)
//加载配置文件
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("config.xml");
//创建sqlsessionfactory工厂
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = sfb.build(inputStream);
//通过工厂创建sqlsession对象
SqlSession sqlSession = factory.openSession();
//通过sqlsession创建dao接口的代理对象
IStudentDao mapper = sqlSession.getMapper(IStudentDao.class);
//调用方法执行sql并返回结果
List<Student> list = mapper.findAll();
//第二种方式:不建议使用,因为看起来不清晰而且还需要担心字符串有没有写错以及类型的转换
//List<Student> list = sqlSession.selectList("com.djn.demo01.dao.IStudentDao.findAll");
for(Student student:list){
System.out.println(student);
}
//释放资源
sqlSession.close();
三.CRUD
如果底层使用JDBC(在mybatis主配置文件中配置的transactionManager标签的type设为jdbc的话)Mybatis是自动开启事务的,也就是对于DML操作需要手动commit;方式一,sqlSession.commit();方式二:SqlsessionFactory.opensession(true)
Mybatis写sql语句有xml和注解两种方式,注解方式写起来方便,但是对于处理一对多和多对一的关系蛋疼!
属性:
xml中:
1.parameterType:参数类型
如果只有一个基本类型参数,可以直接取出,如果有多个参数需要用到实体类或者Map,或者@Param注解
如果是实体类,直接取出属性即可
如果是Map类型,直接取出key即可
2.resultType:返回值类型,增删改不需要
对应接口的返回值,如果是集合,那么要写集合内容的类型,而不是集合本身的类型
3.resultMap:结果映射,解决数据库表的字段名与属性名不一致问题
注解中:
1.@Param:当有多个参数时可以使用该注解,在sql语句中取的是@Param中定义的值
1.使用XML
1.定义接口
/**
* 查询所有
*/
List<Student> findAll();
/**
* 根据id查询学生
*/
Student findById(int id);
/**
* 添加学生
*/
int addStudent(Student student);
/**
* 更新学生信息
*/
int updateStudent(Student student);
/**
* 删除学生
*/
int deleteByName(String name);
2.定义Mapper.xml映射文件
<!--
parameterType:参数类型
resultType:返回值类型,增删改不需要
-->
<!--根据id查询学生-->
<select id="findById" parameterType="int" resultType="com.djn.demo02.pojo.Student">
SELECT * FROM student WHERE id = #{id}
</select>
<!--添加学生-->
<insert id="addStudent" parameterType="com.djn.demo02.pojo.Student">
INSERT INTO student VALUES(NULL,#{username},#{birthday},#{sex},#{address})
</insert>
<!--更改学生消息-->
<update id="updateStudent" parameterType="com.djn.demo02.pojo.Student">
UPDATE student SET username = #{username} , address =#{address} WHERE id = #{id}
</update>
<delete id=&#