发表于: 2017-11-07 08:52:58

1 619


编辑日报内容...

今天学习的内容:

Dao接口:定义抽象方法,查询,增删改等,确定传入参数,返回参数类型
DaoImpl 接口的实现类:1.先创建一个私有的会话工厂:让整个类都能公用这个工厂
2.构造构造方法,实现传入一个会话工厂对象,this.factory=factory
3.重写抽象方法:通过会话工厂创建SqlSession 即创建会话,因为会话是线程不安全的,所以要创建在方法内部
4.通过会话执行在mapper文件中的sql语句,设置传入参数并接收返回类型等等
5.将返回的对象返回
测试类:1.定义一个私有会话工厂
2.创建方法,将全局配置的SqlMapConfig.xml
总结:
1.mybatis是持久层框架,作用是跟数据库交互实现增删改查
2.原生Dao实现(需要接口和实现类)
3.动态代理(只需要接口,核心配置文件和映射文件以及pojo)
mapper接口代理事项编写规则
1.映射文件中的namespace要等于接口的全路径名称
2.映射文件中的sql语句id要等于接口的方法名称
3.映射文件中传入的参数类型要等于接口方法传入的类型
4.映射文件中返回的结果类型要等于接口方法的返回类型
4.#{}占位符  如果传入的是基本类型 那么#{}中的变量名称可以随意写,如果传入的参数类型是pojo类型,那么#{}中的变量名称必须是属性.属性.属性...
5.${}拼接符: 如果传入的是基本数据类型,那么${}中的变量名称必须是value,如果传入的参数类型是pojo那么%${}%中的变量名称必须是pojo中的属性.属性.属性
注意:使用拼接符可能造成sql注入,在页面输入的时候可以加入校验,不可输入sql关键字,不可输入空格。
6.映射文件:
1.传入的参数类型通过parameterType属性指定
2.返回结果集类型通过resultType属性指定
7.hibernate和mybatis区别
hibernate:比较重量级,学习成本高 标准orm框架
优点:高度封装,使用起来不用写sql,开发的时候会降低开发周期
缺点:sql语句无法优化
应用场景:OA(办公自动化系统),erp(企业流程系统)等,还有一些政府项目
总的来说,在用户量不大,并发量小的时候使用
mybatis:不是orm框架,是jdbc的轻量级封装,学习成本低,简单
优点:学习成本低,sql语句可以优化。执行效率高,速度快
缺点:编码量较大,会拖慢开发周期
应用周期:互联网项目,电商,p2p
用户量较大,并发量高的项目用


mybatis中核心配置文件部分标签:

typeAliases中的部分标签:

<typeAliases>
<typeAlias type="cn.ll.pojo.User" alias="User"/><!-- 定义单个pojo类别名 -->
<package name="cn.ll.pojo"/><!-- 使用包扫描定义别名,定义后别名等于类名,不区分大小写,驼峰原则 -->

</typeAliases>


transactionManager \dataSource \property 标签:

<transactionManager type="jdbc"/><!-- 事务管理者 --><!-- 使用jdbc事务管理 -->
<dataSource type="POOLED"><!-- 数据库连接池 -->
<property name="driver" value="${jdbc.driver}"/><!-- 属性 -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

</dataSource>


mapper标签

<mappers>

<mapper resource="User.xml" />
<mapper class="cn.ll.mapper.UserMapper"/><!-- 使用class属性引用接口的全路径名称:使用规则1.接口的名称和映射文件名称除扩展名外要完全相同 2.映射文件要和接口在同一文件下 -->
<package name="cn.ll.mapper"/><!-- 使用包扫描技术批量引入mapper接口 使用规则:使用规则1.接口的名称和映射文件名称除扩展名外要完全相同 2.映射文件要和接口在同一文件下 -->

</mappers>



mybatis映射文件中的部分标签:
<mapper namespace="cn.ll.mapper.UserMapper">
<!-- 命名空间,做sql隔离 就是相当于包名 调用时用的是namespace+id -->
<!-- mapper接口代理事项编写规则
1.映射文件中的namespace要等于接口的全路径名称
2.映射文件中的sql语句id要等于接口的方法名称
3.映射文件中传入的参数类型要等于接口方法传入的类型 4.映射文件中返回的结果类型要等于接口方法的返回类型 -->(mapper接口代理不用写实现类)
select标签:表示查询
<select id="findUserByUserName" parameterType="String"
resultType="User">
select * from user where username like '%${value}%'
<!-- ${}拼接符,字符串原样拼接,如果传入的参数是一个基本类型 (int.long.string.double.boolean.float等)那么${}中的中的变量名称必须是value -->
<!-- 如果返回的是集合,可以调用selectList方法,这个方法返回的就是一个集合,所以映射文件中应该配置成集合泛型的类型 -->
<!-- 注意拼接符有sql注入风险,所以慎重使用 -->
</select>
<!-- 只有返回结果为一行一列的时候,才能把返回类型指定成基本类型 -->
<select id="findUserCount" resultType="int">
select count(*) from user
</select>
<!-- 一对一:自动映射 -->
<select id="findOrdersAndUser1" resultType="CustomOrders">
select a.*,b.id uid,username,birthday,sex,address from orders a,user b where a.user_id = b.id
</select>
<!-- 一对一:手动映射-->
<!-- id:resultMap的唯一标识  type:将查询出的数据放入指定的对象 注意手动映射需要指定数据库中表的字段名与pojo类中属性名称对应关系 -->
<resultMap type="Orders" id="orderAndUserResultMap">
<id column="id" property="id"/><!-- id标签指定主键字段对应关系 column:数据库中的字段名称 property:pojo类中的指定属性名称 -->
<result column="user_id" property="userId"/><!-- result标签指定非主键字段的对应关系 -->
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="cn.ll.pojo.User"><!-- 这个标签指定单个对象的对应关系 property指定将数据放入orders中的user属性中 javaType:user属性的类型-->
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersAndUser2" resultMap="orderAndUserResultMap">
select a.*,b.id uid,username,birthday,sex,address from orders a,user b where a.user_id = b.id
</select>
<resultMap type="User" id="userAndOrderResultMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<collection property="ordersList" ofType="Orders"><!-- 指定对应的集合对象关系映射 proprety:将数据放入User对象中的orderList属性中 ofType:指定的orderList的泛型类型 -->
<id column="oid" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="birthday" property="birthday"/>
<result column="note" property="note"/>
</collection>
</resultMap>
<select id="findUserAndOrders" resultMap="userAndOrderResultMap">
select a.*,b.id oid,user_id,number,createtime,note from user a,orders b where a.id = b.user_id
</select>
foreach标签
<select id="findUserByIds" parameterType="QueryVo" resultType="User">
select * from user
<where>
<if test="ids != null ">
<!-- foreach:循环传入的集合参数
collection:传入的集合的变量名称
item:每次循环将循环出的数据放到这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
select * from user where id in(1,16,25,28)
-->
<foreach collection="ids" item="id" open="id in(" close=")"  separator=",">
#{id}
</foreach>
</if>
</where>
</select>
<!-- 命名空间,做sql隔离  就是相当于包名  调用时用的是namespace+id-->
<mapper namespace="test">
<!--
id:sql语句的唯一标识
parameterType:指定传入参数类型
resultType:返回结果集类型
#{} 是占位符,起到站位作用,如果传入的是基本类型(int.long.string.double.boolean.float等)
那么#{}号中 变量名可随便写-->
<select id = "findUserById" parameterType = "int" resultType = "cn.ll.pojo.User">
select * from user where id = #{id}
</select>
<select id = "findUserByUserName" parameterType="String" resultType="cn.ll.pojo.User">
select * from user where username like '%${value}%'
<!-- ${}拼接符,字符串原样拼接,如果传入的参数是一个基本类型
(int.long.string.double.boolean.float等)那么${}中的中的变量名称必须是value -->
<!-- 如果返回的是集合,可以调用selectList方法,这个方法返回的就是一个集合,所以映射文件中应该配置成集合泛型的类型 -->
<!-- 注意拼接符有sql注入风险,所以慎重使用 -->
</select>
</mapper>


insert标签中的部分标签:
<insert id="insertUser" parameterType="User">
<!-- 执行插入时返回一个自增加的主键,select LAST_INSERT_ID() keyProperty:将返回的主键参数放入传入参数的id中保存
order:当前函数相对于insert语句执行顺序,在insert之前执行是before之后是AFTER resultType:id的类型,也就是keyProperty的类型 -->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select
LAST_INSERT_ID()
</selectKey>
<!-- #{}如果传入的是pojo类型,那么#{}中的变量名称必须是pojo中对应的属性.属性.属性... -->
insert into user (username,birthday,sex,address) values
(#{username},#{birthday},#{sex},#{address})
</insert>


明天计划,理清思路,记住mybatis的工作顺序,写几个pojo来加深印象。

遇到的问题:工作中使用mybatis都不需要写实现类吗?

收获:mybatis入门

昨晚日报编辑完了不能提交,所以今早上提交的



返回列表 返回列表
评论

    分享到