一行代码
接口式编程(针对调用配置文件sql语句这行代码,有四处值得分析的地方)
1、namespace :方法里的namespace需要和mapper标签的namespace一致,由于两边是手写的,可能存在不一致的风险,而且也不能保证多个sql配置文件,namespace不冲突。
2、与sql关联的id :方法里的id和标签的id也是手写的,也存在不一致的风险。
3、传入的参数 :例如selectList传入的参数类型是Object,所以传入的参数不管是何种类型,它不会报错,但是如果传入的类型和parameterType类型不匹配,sql语句中引用的参数就会出错。
4、返回值:例如selectList方法,Mybatis提供了一种约束,只要是List即可,无论集合中存储何种类型,但是这样不意味执行就是对的,因为真正存入的是resultMap约束的,编译时不会报错,执行时可能就会报错。
SqlSession方法的mapper的namespace、与sql关联的id、传入的参数、返回值。
接口式编程:就是为了避免上述风险,而人为做的强制性规范和约束,Mybatis提供的这种方式,就称作接口式编程(相当于sql的配置文件有一个java接口作为代言人,这样SqlSession对象直接调用接口里的方法即可。但是该接口有一些前提:
1、namespace的统一:该接口的包名+接口名就是namespace名。
2、sql标签id的统一:代言人代言一条sql语句提供给外面,代言哪条sql语句,就提供和该sql的id相同名称方法。该接口可以代言sql配置文件的sql语句,通过提供方法,方法名为id名。
3、方法参数的统一:接口方法参数类型为parameterType类型。
4、方法返回值的统一:接口方法返回值类型为resultMap类型。
注意:如上该接口就可以代言sql语句了。该接口不用人为手动编写实现类,通过Mybatis获取该接口,就可以调用,Mybatis已经实现了该接口(它就会知道该方法是调用配置文件中的哪条sql语句)。因为当前该接口没有实现类,这里通过SqlSession对象的getMapper(接口的类类型)就可以获得该接口实现类的代理对象,这样就可以直接调用接口里的方法,而不用传入namespace+id,而是按照接口的约束进行调用)。
这样就避免了上述的问题:namespace不可能相同,因为不可能有多个相同名全路径的接口,调用方法时也不需要传入namespace。同一个接口里也不肯有多个相同名称的方法。传入的参数已经被限制,如果不符合编译会报错。返回的接口也被限定,如果不符合编译也会报错。
接口式编程的作用:
1、规范访问配置文件
2、当mybatis和spring整合后,配置的数据源将交给Spring管理,也就意味着认为手写的提供SqlSession会消失,Spring将提供SqlSesssion,传入的参数应该交给Service处理好再传入进来。通过SqlSession调用接口式编程的这些代码统统都由Spring来实现。这个Dao层将会消失,该接口将会变成真正的Dao层,这时Dao层将只剩下接口文件和配置文件。
当Mybatis与Spring结合时,这些Spring提供了便捷,这里只做一些了解即可,整合之后整个Dao层只剩接口文件和配置文件。
使用SqlSession的getMapper方法来直接获取Dao接口的实现类
接口式编程(针对调用配置文件sql语句这行代码,有四处值得分析的地方)
1、namespace :方法里的namespace需要和mapper标签的namespace一致,由于两边是手写的,可能存在不一致的风险,而且也不能保证多个sql配置文件,namespace不冲突。
2、与sql关联的id :方法里的id和标签的id也是手写的,也存在不一致的风险。
3、传入的参数 :例如selectList传入的参数类型是Object,所以传入的参数不管是何种类型,它不会报错,但是如果传入的类型和parameterType类型不匹配,sql语句中引用的参数就会出错。
4、返回值:例如selectList方法,Mybatis提供了一种约束,只要是List即可,无论集合中存储何种类型,但是这样不意味执行就是对的,因为真正存入的是resultMap约束的,编译时不会报错,执行时可能就会报错。
SqlSession方法的mapper的namespace、与sql关联的id、传入的参数、返回值。
接口式编程:就是为了避免上述风险,而人为做的强制性规范和约束,Mybatis提供的这种方式,就称作接口式编程(相当于sql的配置文件有一个java接口作为代言人,这样SqlSession对象直接调用接口里的方法即可。但是该接口有一些前提:
1、namespace的统一:该接口的包名+接口名就是namespace名。
2、sql标签id的统一:代言人代言一条sql语句提供给外面,代言哪条sql语句,就提供和该sql的id相同名称方法。该接口可以代言sql配置文件的sql语句,通过提供方法,方法名为id名。
3、方法参数的统一:接口方法参数类型为parameterType类型。
4、方法返回值的统一:接口方法返回值类型为resultMap类型。
注意:如上该接口就可以代言sql语句了。该接口不用人为手动编写实现类,通过Mybatis获取该接口,就可以调用,Mybatis已经实现了该接口(它就会知道该方法是调用配置文件中的哪条sql语句)。因为当前该接口没有实现类,这里通过SqlSession对象的getMapper(接口的类类型)就可以获得该接口实现类的代理对象,这样就可以直接调用接口里的方法,而不用传入namespace+id,而是按照接口的约束进行调用)。
这样就避免了上述的问题:namespace不可能相同,因为不可能有多个相同名全路径的接口,调用方法时也不需要传入namespace。同一个接口里也不肯有多个相同名称的方法。传入的参数已经被限制,如果不符合编译会报错。返回的接口也被限定,如果不符合编译也会报错。
接口式编程的作用:
1、规范访问配置文件
2、当mybatis和spring整合后,配置的数据源将交给Spring管理,也就意味着认为手写的提供SqlSession会消失,Spring将提供SqlSesssion,传入的参数应该交给Service处理好再传入进来。通过SqlSession调用接口式编程的这些代码统统都由Spring来实现。这个Dao层将会消失,该接口将会变成真正的Dao层,这时Dao层将只剩下接口文件和配置文件。
当Mybatis与Spring结合时,这些Spring提供了便捷,这里只做一些了解即可,整合之后整个Dao层只剩接口文件和配置文件。
mybatis接口式编程:
如果没有使用接口式编程,需要在dao层手动调用SqlSession的方法直接访问xml文件。
接口式编程则不然,建立一个对应xml的接口,通过SqlSession.getMapper()方法进行实例化,可以直接使用该接口的方法。
接口式编程主要结合spring一起使用,数据源管理将由spring托管,db层将消失,SqlSessin将托管给spring,组织对象的代码移交给service层,通过SqlSession实现接口式编程的代码由spring实现,dao层消失,接口将成为正式的dao层,dao层只有接口文件和配置文件。
接口式编程mybatis Sql配置文件的namespace名称对应接口的权限类名. Sql配置文件中对应的sql语句的标签的id对应接口的方法名. 接口中方法的参数对应sql语句标签的parameterType类型. 调用接口:通过sqlSession.getMapper(接口.class)获取到接口的引用(并没有实例化接口,方法也没有被实现,但是却可以调用接口中的方法,是因为有动态代理),再调用接口中的方法即可. public List<Command> getCommand(){ SqlSession sqlSession=Util.getSqlSession(); ICommand com=sqlSession.getMapper(ICommand.class); List<Command> list=com.getCommand(); return list; }