MyBatis是一个用在持久层的框架,也就是操作数据库的。
在前面的学习中,我们通过原生jdbc操作数据库。以及spring框架中封装的JdbcTemplate框架来操作数据库。
(1)数据库的连接关闭操作复杂,效率慢
(2)sql语句的编写和preparedStatement执行sql语句中注入参数都是在java语句中,是硬编码
(3)从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护
硬编码是指将可变变量用一个固定值来代替的方法,用这种方法编译后,如果以后需要更改此变量就非常困难了
可以在配置文件中,配置了c3p0数据连接池,这方面改善了,但是还是存在硬编码问题
(1)全局配置文件SqlMapConfig.xml,里面配置数据源,事务,运行环境
(2)sqlSessionFactory会话工厂,根据配置文件来创建工厂,它的作用就是产生sqlSeesion
(3)sqlSeesion会话,是一个接口,用来执行sql语句,调用Executor(执行器)来执行
(4)在mybatis中sql语句不再写到java程序代码中,而是写在mapper.xml的配置文件中,这叫做表的映射文件。比如在我们的项目中对应的表有很多。有user表,item表,对这些表都会有增删改查的操作,我们就会为这些表都创建映射文件然后在文件中配置相应的sql语句,然后通过sqlSession来执行。但是前面说SqlMapConfig.xml是全局配置文件,所以要把所有的映射文件加载到全局配置文件
(4)mapped stattement底层封装对象,对数据库存储封装,包括sql语句,输入参数,输出参数类型等
总结:mybatis主要放在sql语句中,实现了输入映射和输出映射
首先创建po类
创建user的映射文件,主要配置sql语句,查询时select标签,主要是paramterTyper传入参数类型和resultType获取结果对象的类型,其中#{}就是占位符的概念
#{}通过ognl表达式,调用属性的get方法来获得传入参数,如果传入的参数是简单类型。括号中的变量名可以是任意名字
把映射文件加载到全局映射文件中,利用mappers标签,把映射文件的路径传给source属性
然后开始写程序,在程序中执行配置好的sql语句,按照上面的流程,先创建sqlSessionFactory工厂,把全局配置文件传进去,然后打开sqlsession开始执行映射文件配置好的sql,因为根据id查询时返回一条记录,所有使用selectOne()方法。方法的第一个参数就是我们映射文件配置sql语句的id,一般是映射文件中namespace.id名(这里我使用id也可以,因为只是简单测试,namespace主要是对sql进行分化管理,后面会游泳重要作用),根据这个id,sqlsession找到要执行的sql语句,然后输入参数,参数类型和占位符信息也在映射文件中,并且我们也配置了输出类型是User,所以返回值就是user对象
那这个方法与上面方法类似,只是name属性不是User表的主键,不能唯一确定一条数据,所以返回的结果应该是一个List集合,
首先还是在user的映射文件中,配置这个需求的sql,虽然我们结果返回的是list,但是list中的元素都是user对象,所以resulyType类型还是user,这里我们采用模糊查询,使用${},意思是会把value的值不做任何处理拼接在sql语句中,这样的问题就是会有sql注入,下面的结果展示我们可以看到查询的sql语句
编写程序执行配置好的sql语句,这次调用的方法是slectList()方法,参数意义与selectOne()一样
映射文件的配置
在程序代码中增删改都需要手动提交事务
一般在实际应用中,对于刚插入的新数据,我们可能会要获得它的id号,在配置文件中修改如下
如果不加selectkey,输出的id就是0
那么非自增主键用的是select uuid()方法,由于是费自增,这个方法配置是order属性应该是BEGORE