MyBatis框架学习

MyBatis框架
1.MyBatis框架简介
目的(最大的作用):实现sql语句和java代码的分离,替代的是mvc模式中的Dao层,是持久层框架。
搭建方式:
1.配置mybatis全局配置文件:
a.固定的文件头,根标签为<configuration></configuration>;
b.在根标签内存在多个标签,<settings></settings>:设置日志文件打印内容的标签;
< typeAliases></typeAliases>:设置文件的别名使用<package></package>设置的是整个包内所有类的别名,为该类名的全小写名,使用<typeAlias></typeAlias>设置单个类的别名。
c.必备:<environments></environments>:环境标签,其中可以存在多个<environment></environment>标签,设置数据库连接环境。
每个环境标签中包含固定的内容:
< transactionManager type="JDBC/MANAGFED"></transactionManager>事务管理器,其中type参数有JDBC/MANAGFED两种取值,MANAGED指几乎不作任何处理,由容器来管理事务的生命周期,如:Spring和JEE应用服务器的上下文,会默认关闭连接。
< dataSource type="POOLED/UNPOOLED/JNDI"></dataSource>数据源,其中type参数有三种取值:POOLED:使用数据库连接池,UNPOOLED:不使用数据库连接池,JNDI:结合服务器容器使用,在外部配置数据源,使用JNDI引用。
每个数据源标签中的内容是基本固定的:存在四个< property name="" value=""></property>标签,其中的name值依次为:driver,url,username,password;依次对应使用jdbc方式连接数据库中的驱动,数据库url,数据库用户名,数据库密码,四个name值不可修改。其中value值可以以.properties配置文件存储,以<properties></properties>引入配置文件,并在value中以${driver}的方式获得。
PS:<configuration></configuration>标签中的字标签都有固定的顺序,这是由xml文件开头的文件约束DTD文件决定的。而DTD文件可以通过idea设置为寻找本地DTD文件。
d.必备:<mappers></mappers>:用来连接mapper.xml文件从而在解析mybatis.xml文件时扫描mapper.xml文件并解析,其中可以通过两种方式扫描mapper.xml文件:1.<mapper resource=""></mapper>:扫描单个mapper.xml文件,resource值为mapper.xml文件的url。
PS:url是路径,路径的形式为:包路径/文件名.xml,使用“/”连接。
2.< package name=""></package>:扫描某个包下所有mapper.xml文件,name值为包的全限定名,如:com.javalq.mapper,使用“.”连接。
2.配置mapper.xml文件
a.固定的文件头,根标签为<mapper namespqce=""></mapper>,必须配置namespace值,当使用mapper动态代理时,namespace值必须为xml文件的全限定名,如:com.javalq.mapper.Mapper.xml,此时每个xml文件名必须与其对应的接口名一致。
PS:因为使用动态代理时,扫描xml文件时会根据xml文件名寻找对应的接口,并通过解析xml获得该接口的实现类对象。
 
b.在mapper标签下书写SQL语句,可以通过动态SQL语句标签动态拼接SQL语句。
SQL语句基本标签:<select id="" resultType="" parameterType></select>:选择语句标签,id值为动态代理中的方法名,resultType(SQL语句返回值类型)值若为基本数据类型可以不写,若为实体类对象则写实体类别名;若为实体类对象list集合同样则写集合元素类型,即实体类别名;若为实体类对象Map集合,则写Map的别名:map(mybatis中定义了一些java类的别名,除了基本数据类型为在前边加"_",基本为类名的全小写形式);parameterType(参数类型):传入的参数若为单个可以为基本数据类型和自定义类;若为复杂参数可以为map和java实体类。<insert></insert>:添加语句标签,参数类型同上;<update></update>:修改语句标签,参数类型同上;<delete></delete>:删除语句标签,参数类型同上。
PS:#{}和${}的区别:
#{}:占位符,配合PreparedStatement使用。mybatis会自动使用PreparedStatement的set方法进行值得替换。
${}:字符串替换符,配合Statement使用。
 
动态SQL语句标签:(PS:在动态SQL语句标签中,都是ODNL表达式,获取值得方式为:基本数据类型参数:0/1,param1/param2;对象作为参数:直接使用对象属性获取值:id,name等。在标签外SQL语句中的时候获取值仍需要使用#{0/1;param1/param2};#{id/name}获得;
①<if test="">SQL语句</if>:通过if标签进行判断,若满足test条件则拼接标签中的SQL语句;
②<where>and+其他动态SQL语句</where>:where标签会在生成SQL语句时自动添加where关键字,并且会自动去除第一个and。
③<foreach collection="" open="" separator="' close="" item="" index=""></foreach>:foreach只能遍历两种数据,一种为集合,一种为数组,当传入这两种值时候mybatis会将其封装到map集合中,其中键为"list"或者"array",所以collection值只能为list或者array,这取决于你传入的是集合还是数组,open值为SQL语句的开始字符串,close值为SQL语句的结束字符串,separator值为分割符,item就是集合中的每个值。
④<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>:增加SQL语句中的前缀和后缀,去除SQL语句中的前缀和后缀。更加灵活强大,动态调整SQL语句。
⑤<set></set>:可以理解为trim标签的特殊情况,只能增加set前缀,去除最后","后缀。
⑥<choose><when test=""></when><otherwise><otherwise></choose>:逻辑上相当于java中的
if(){}else if(){}else if(){}else{},当满足test条件时才拼接其中的SQL语句,没有满足条件则拼接otherwise中的SQL语句,一旦进入某个when就不会继续向下判断,直接结束choose。
⑦<bind name="" value=""></bind>:创建一个变量,并绑定上下文,name值自定义,value常为字符串的拼接,如:模糊查询时,可以拼接"'%'param1'%'",这样在传参数的时候不必将“%”拼入参数中。
⑧<sql id="">SQL语句</sql>/<include refid=""></include>:使用sql标签自定义一段sql语句,给定id值,在拼接字符串时使用include标签通过id引入使用。
2.使用SqlSession对象直接进行增删查改操作
a.service层调用xml文件方式:①解析mybatis.xml全局配置文件为字符流,获取字符输入流;②获得SqlSessionFactory对象,即SqlSession对象工厂;③获得SqlSession对象;④使用SqlSession对象的方法执行对应的SQL语句:selectList():查找多条数据,返回值是带有泛型的List集合;selectOne():查找单调数据,返回值是pojo实体类对象;selectMap():查找多条数据,返回值是带有泛型的map集合;update():返回值是int数值,代表操作的数据条数;delete():返回值是int数值,代表操作的数据条数;insert():返回值是int数值,代表操作的数据条数;
PS:selectList(String s,Object obj):其中的参数s为mapper.xml文件的namespace值(定位到xml文件)+xml文件中<select id="selectOne"></select>标签中的id值(定位到具体的SQL语句),如:"com.javalq.mapper.Mapper.selectOne"。
 
b.这些方法中参数只能存在一个,如果需要传入多个参数可以将参数封装到一个对象中或者集合中传入。
3.使用mapper动态代理实现动态拼接SQL语句
优点:
1、可以直接传入多个参数,不必封装为对象或者集合;
2、调用方法时直接以接口的实现类对象来调用方法,更加清晰方便。
注意要点:
1、接口名必须和xml文件名一致
2、接口方法名必须和xml标签id一致
3、namespace的值必须为接口的全路径名
4、使用package扫描mapper时,接口名必须与xml文件名一致

猜你喜欢

转载自www.cnblogs.com/paralleluniverse/p/11294305.html