- 1 - mybatis简介
- 2 - 如何下载mybatis
- 3 - 创建mybatis全局配置文件
- 4 - 创建mybatis映射文件
- 5 - 测试mybatis
- 6 - enviroments
- 7 - properties
- 8 - settings
- 9 - typeAliases - 类型别名
1 - mybatis简介
2019年6月21日星期五下午2点钟开始,学习mybatis。
- sql maps
- data access objects(dao)
mybatis中有个东西叫做面向接口编程。
原来我们要有controller,service接口,service实现类,dao接口,dao实现类。
我们现在有了mybatis,就只需要controller,service接口,service实现类,dao接口,不需要dao实现类了。
当service直接调用dao接口中的方法,可以自动执行一个sql语句。
这种场景,就是叫做面向接口编程。
- 定制化SQL,就是你自己写SQL,你想要怎么写,你就怎么写。
- 存储过程:使用sql语句当中的逻辑、代码,实现查询过程。sql叫做标准化查询语言,可以写一段代码的,sql功能非常强大,咱们用的是皮毛,增删改查,两表联查,多表联查。最多就是这些。但是sql的功能非常非常强大。
- 高级映射:
- 跟普通映射相对。普通映射,就是,查询时候,查询出来的数据和实体类创建映射关系,这就是涉及到了如何进行映射,一般我们把字段名和属性名保持一致。
- 我们之前写jdbcTemplate,我们用了个rowmapper,直接让查询出来的数据和实体类的字段进行映射。请注意,这里我说的是,查询出来的数据和实体类的字段进行映射,我说的不是数据库中的字段名和实体类的字段进行映射。这是因为你查询的时候,可以为查询出来的字段设置别名。
- 在mybatis当中完全不用你去管了,你连rowmapper这种东西都不需要了。当然前提还是,查询出来的数据和实体类中的字段名保持一致。
- 这些都是叫做普通映射。什么叫做高级映射呢?
- 比如说多对一,一对多,多对多,都可以通过mybatis中的某些方式,实现映射。
- 员工和部门,是多对一,你只要查,就是可以自动映射。
- mybatis避免了jdbc的代码,它底层用的,就是jdbc,然后它对jdbc进行了封装。
- 手动设置参数,通过jdbc增删改查,要使用问号为通配符配置,不满足通配符赋值的时候,要字符串拼接。preparedStatement中模糊查询和批量删除不能用,因为通配符会默认加上单引号。mybatis当中有自动设置参数的方式,一种是${},一种是#{}。
- 获取结果集:ps.excuteQuery(),ps就是preparedStatement(),查询的时候这样用。增删改的时候,我们使用ps.excuteUpdate()。查询的时候,我们会获取一个结果集,叫做resultset结果集,然后我们要遍历结果集,取出结果,将字段的值赋值给相对应的属性,从而获得最终的对象和集合。
- 自动获得值,要么是单个的值,要么是个实体类对象,要么是一个list集合。
- mybatis可以使用xml和注解进行配置,我们在mybatis当中不使用注解,因为注解太方便了,所以不用,注解是加到类上的,因为写完项目之后要打包,打包之后上线,上线放在服务器上可以用,这个过程中业务需求发生了变化,我们需要改变sql语句,我们使用注解的情况下,我们修改sql不方便。xml和注解的区别就是,xml的方式是在xml中写sql语句,注解的方式是在注解当中写sql语句,注解写在类上,我们需要改的时候,注解的方式很不方便。所以我们是要使用xml的方式。
- 将接口和java中的普通对象映射成为数据库中的记录,这就是ORM。
- 半自动的ORM框架。
2 - 如何下载mybatis
这是老师的mybatis官方文档中文版。
- JDBC所有的过程,都要你写,有好处,原生jdbc不用解析什么,该实现什么功能,就实现什么功能。直接,干脆。执行效率一定是最快的,但是开发效率就低了。
- hibernate用的时候很简单,导入jar包,配置,配置文件,两个,一个是核心配置文件,连接数据库,另外一个配置文件,是一个映射文件。映射文件写的就是实体类属性和表中字段的映射关系。然后一启动项目,表都建设完了,主外键都能给你搞定,增删改查绝对不会超过两行,查询就是query,添加或修改saveOrUpdate,删除就是delete,sql语句都不需要你自己写,查询是从实体类对象当中查询的,直接from一个实体类,就完了。删除、添加、修改,都是面向实体类对象。但是这个框架最大特点,就是越学习就是越不会。如果实现多表,hibernate当中有四种表关系,每一种表关系的配置都不一样,one-to-one,one-to-many,many-to-one,many-to-many。有很多问题。配置文件标签当中的属性,就是尝试,试出来效果的。hibernate就是全自动的。hibernate就是太好了,但是咱们不用它,它的缺点很明显,比较难学。属性难懂难理解,hibernate当中的查询语句,用的是HQL语句,不是SQL,HQL语句最大的特点就是直接从实体类进行查询。hibernate在实现功能的时候可以自动为我们生成SQL语句。如果我们自己需要写SQL的时候,我们一般不会用SQL,而是会用HQL,HQL这个东西和SQL,虽然有很多地方相似,但是还是有很多地方不一样。如果你遇到一些业务逻辑复杂的查询功能,你就必须要用HQL,你不会HQL你就实现不了。那么你可以用SQL吗?可以的,没有问题,hibernate当中是支持的。但是你会感觉,你要是用了SQL,你还不如用JDBC呢,为什么呢?我用过的。hibernate当中用SQL是怎么查询的。hibernate当中执行完了SQL语句之后会返回一个list对象,list集合当中放置的不是实体类,而是object类型的数组,数组当中按顺序放置的就是你查询出来的字段,这些东西你不能直接给客户端,你需要将这个list集合,重新循环,然后拿到里面的数组,然后拿到数组当中的每个对象的值,放到实体类对象当中,然后再将这些实体类对象放置到一个新的list集合当中,然后才可以向页面展示。特别麻烦,还不如直接用jdbc简单呢。还有就是hibernate面对业务需求变化的时候,它自动生成的sql语句实现不了需求,怎么办呢?它给你写的sql语句,你看都看不见,你当然也是改动不了的。这也是一个问题,对于hibernate自动生成的sql语句,我们无法进行恰当的维护。
- mybatis,jdbc开发效率低,hibernate难维护,这些缺点,mybatis都是没有的。mybatis当中要求你们的sql语句必须自己去写。
3 - 创建mybatis全局配置文件
mybatis搭建过程
第一步:导入jar包,需要有三个jar包。
这个jar包就是一个压缩程序,我们解压就可以打开。
log4j的小说明
第一步
第二步 - 创建mybatis核心配置文件、全局配置文件
核心配置文件当中写的是如何连接数据库。一般情况下,我们是会叫做mybatis-config.xml,这个不是强制的要求,是一种约定。
我们创建一source folder,然后创建这个配置文件。
然后我们看看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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
</configuration>
xml的提示小问题
这个eclipse当中的xml,非常奇怪,有的时候有提示,有的时候没有提示,有网络的时候有提示,没有网络的时候,没有提示。有的时候有网络,也是没有提示的,纯粹有病。
第三步 - 创建mybatis的映射文件,并配置
映射文件当中写的是如何操作数据库。映射文件XxxMapper.xml,这个里面的Xxx就是实体类的名字,比如说User实体类,对应一个User表,那么映射文件就是叫做UserMapper.xml。
第四步 - 创建mapper接口
我们的mybatis当中根本就不需要有dao的实现类,我们只需要有一个dao的接口就可以了, 但是我们是需要创建mapper接口的。
我们是需要实现两个绑定的,才可以调用接口当中的方法来实现执行sql语句的。
第五步 - 获取mybatis操作数据库的会话对象SqlSession
这个视频当中没有涉及。
第六步 - 测试
这个视频当中没有涉及。
4 - 创建mybatis映射文件
下面的配置文件,就是我们的mybatis映射文件当中应该配置的东西,这是从mybatis的官网文档当中获取的:
<?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.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
核心配置文件当中定义,如何连接数据库,以及一些基本配置,映射文件当中定义的是,如何操作数据库。
5 - 测试mybatis
映射文件创建完了之后,我们要创建mapper接口。
在创建mapper接口之前,我们先创建一个实体类。
创建mapper接口之后,要实现两个绑定。
mybatis当中有面向接口编程,当我调用一个方法,就可以执行一个sql语句。sql语句应该是在mybatis映射文件当中写的。
我们应该怎么实现上面描述的效果呢?
这是都可以的。SSM整合的时候,uid肯定是从客户端获取的。但是我建议大家,能够用String的情况下,就使用String。
为什么这么说呢?
咱们的springmvc是基于servlet的。但是其实它的底层还是request.getParameter获取客户端传过来的参数的。
request.getParameter获取的数据,全都是字符串的类型,这个是没有毛病的。
所以我们在mapper接口的方法当中,我们直接使用字符串来接受,就可以了,没有什么问题的。
但是我们使用Integer的时候,也是完全可以的,但是在底层处理的时候,就会有一层转换,就是将String转换成为Integer。
所以建议大家用String。
这是一个小问题。
现在接口方法和配置文件当中的sql语句怎么关联
我们的目的是调用接口的方法的时候,就可以执行mybatis映射文件当中的sql语句,我们应该怎么将这两个东西关联起来呢?
我们要实现两个绑定。
我们的接口叫做UserMapper,我们的配置文件叫做UserMapper.xml。
我们首先应该让xml文件和我们的接口进行绑定。
绑定的方法就是将接口的全限定名,放在xml文件当中mapper标签的namespace属性当中。
这个时候映射文件和接口就完成了绑定,这就是第一个绑定。
在xml当中sql语句的id都是独一无二的,在我们的接口当中方法的名字也是独一无二的。
我们的第二个绑定就是将接口当中的方法名字,作为xml文件当中sql语句标签的id。
这样就完成了第二个绑定。
小总结
第一个绑定就是接口全限定名要和映射文件的namespace保持一致。
第二个绑定就是接口当中的方法名字和SQL语句当中的id保持一致。
xml当中的select标签就是定义查询语句,select标签的id属性就是定义sql语句的唯一标识。
select标签的resultType代表的就是结果类型,也就是实体类的全限定名,也就是接口的返回值类型。
下面就可以测试mybatis了
下面我们要说明一下创建sqlSession的过程,我们只是了解一下,sqlSession既然是一个对象,后面我们就可以交给spring来进行管理,所以下面的过程是让我们能够理解理解的意思。
我们需要用到一个类,叫做Resouces。
里面有一个方法叫做getResourceAsStream,就是作为一个字节流来获取资源。
我们应该在这个方法当中传入我们的配置文件的名称。
在这个getResourceAsStream当中传入我们的核心配置文件。返回值是一个字节输入流。
既然涉及到流了,文件万一不存在怎么办,肯定是要处理IOException。
我们需要通过SqlSessionFactory来获取SqlSession对象的。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuild().build(字节输入流)
。
sqlSessionFactory.openSession()方法就可以获取一个SqlSession对象。
SqlSession对象
我们看一下这个对象当中的方法。
通过sqlSession调用接口当中的方法
sqlSession当中有一个getMapper方法,方法需要传入一个class对象,我们可以传入接口的class对象。
然后这个getMapper方法是可以生成一个UserMapper对象。
然后我们就可以通过UserMapper对象来调用接口当中的方法了。
- mybatis-config.xml - Resources对象
- InputStream对象
- SqlSessionFactoryBuilder方法创建SqlSessionFactory对象
- SqlSessionFactory对象
- SqlSession对象
- UserMapper对象
执行结果如下:
注意#{}和${}
说明的是#{}底层为我们创建的是preparedStatement预编译对象。
${}底层为我们创建的是Statement预编译对象。
有两种情况批量删除和模糊查询是只能够用Statement预编译对象。
确实是,我们以后使用#{}的情况是比较频繁的。
getMapper()方法
6 - enviroments
我们测试的时候,发现我们的username字段是没有获取到的,这是因为在我们的数据库的表当中,我们的字段的名字是叫做user_name
,但是在我们的实体类当中我们的属性的名字是叫做userName
的,这种情况应该怎么办呢?
我们的解决方法就是给user_name
字段起一个别名,就可以解决这个问题了。
看一下小文档
我们看一下源码:
7 - properties
第一种方式
第二种方式
创建properties文件。
接下来就是将properties文件引入到mybatis的核心配置文件当中。
8 - settings
在mybatis的核心配置文件当中,configuration标签内,我们是可以设置settings的,其中有一个配置就是将下划线转换为驼峰:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
类名:大驼峰,每个单词首字母大写
方法名和变量名:首字母小写,以后每次遇到的单词首字母都大写。
我们前面有一个问题,就是我们的数据库当中的user_name
和我们实体类的userName
不能对应上,我们是通过在sql语句查询的时候起别名的方式来解决的。
其实,我们可以使用上面的配置,我们使用这个配置之后,就可以自动映射了,我们执行数据库查询的操作的时候,就可以直接查询出来结果了。
我们可以测试一下,就是将原来在sql语句当中起别名的操作去掉,然后执行一下查询操作,得到的就是下面的结果:
注意
是有这么一个配置是可以解决下划线和驼峰的映射问题的,但是我们在实际开发当中,尽量还是保证我们数据库表当中的字段名和我们的属性名完全一样就可以了。
9 - typeAliases - 类型别名
我们可以为某一个类型设置一个简单的名字。我们这里说的类型,就是java类型,就是实体类的全限定名。
自己取别名的情况
给包下所有的类起别名的情况
个人建议
关于别名这个东西,不建议大家用。因为核心配置文件和我们的映射文件是分开的,我们在核心配置文件当中配置一个奇怪的别名,我们在映射文件当中,有时候会恍惚的,不知道这破玩意是什么意思。
标签顺序问题
在mybatis-config.xml当中,configuration标签内的子标签是有标签顺序的。
具体的顺序如下所示:
Content Model : (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?,
mappers?)