发现之前看的别人的博客也是按照这系列的视频写的,emm;
传智播客牛X!
嘻!
即parameterType的使用;
可以是基本数据类型或引用数据类型;
使用Vo类:
public class QueryVo {
//这个类的作用是:如果页面中查询条件有多种组合(而非单一查询条件:如仅通过id或姓名查询)
//使用Vo类,将User类封装在里面,可以简化操作;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
对应的映射文件:
<select id="findUserByVo" parameterType="cn.itheima.pojo.QueryVo" resultType="cn.itheima.pojo.User">
select * from atestlee where name like '%${user.username}%' and sex like '%${user.sex}%'
select>
resultType,可取的类型:
pojo类型;
基本数据类型;
返回基本数据类型举例:
映射文件:
<select id="findUserCount" resultType="java.lang.Integer">
select count(*) from atestlee
select>
作用就是组成动态sql;
使用方式举例:
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">
select * from atestlee where 1=1
<if test="username!=null and username!=''">
and name like '%${username}%'
if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
if>
select>
作用:
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">
select * from atestlee
<where>
<if test="username!=null and username!=''">
and name like '%${username}%'
if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
if>
where>
select>
特别的,如果之后没有if语句,则不会添加where语句;
作用:将sql条件封装起来,封装后可以重用;id:是这个sql条件的唯一标识。
使用举例:
"user_where">
<where>
<if test="username!=null and username!=''">
and name like '%${username}%'
if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
if>
where>
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">
select * from atestlee
"user_where">
select>
作用:循环传入的集合参数;
属性:
collection:传入的集合的变量名称;
item:每次循环将循环出的数据放入这个变量中;
open:循环开始拼接的字符串;
close:循环结束拼接的字符串;
separator:循环中拼接的分隔符;
sql语句中出现or时,查询效率大幅度降低;所以多用in替代or;
select * from user where id in (1,3,5,7,9)
用foreach写法:
<select id="findUsersByIds" parameterType="cn.itheima.pojo.QueryVo" resultType="cn.itheima.pojo.User">
select * from atestlee where id in (1,3,5,7,9)
<where>
<if test="ids!=null">
<foreach collection="ids" item="id" open="id in(" close=")" separator=",">
#{id}
foreach>
if>
where>
select>
数据模式:用户表(user_id,)和订单表(id,user_id,number,createtime,note)
先从订单查用户;
select a.*,b.id uid,username, from orders a,user b
where a.user_id=b.user_id
举例:
一对一自动映射
<select id="findOrderAndUser1" resultType="cn.itheima.pojo.CustomOrders">
select a.*,b.id uid,username,birthday,sex,address
from orders a,user b
where a.user_id=b.id
select>
public class CustomOrders extends Orders{
//继承了Orders,有Orders的相关属性;类中定义User的对应属性;
private Integer uid;
private String number;
private Date createtime;
private String note;
private User user;
//...
}
一对一手动映射
在Order中添加User类对象,作为其成员对象;
id:resultMap的唯一标识;
type:将查询出来的数据放入这个指定的对象中;
注意
手动映射需要指定数据库中表的字段名与java中pojo类的属性名称的对应关系
<resultMap type="cn.itheima.pojo.Orders" id="orderAndUserResultMap">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="cn.itheima.pojo.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 if="findOrdersAndUser2" resultMap="orderAndUserResultMap">
select a.*,b.id uid,username,birthday,sex,address
from orders a,user b
where a.user_id=b.id
select>
Note:
手动映射是mybatis提供的标准方法;自动方法,em,谨慎用。
用户订单的数据模型中,用户相对于订单是一对多。
select a.*,b.id oid,user_id,number,createtime from user a,orders b where a.id=b.user_id
一对多查询时,一个用户对应多个订单,需要在User类中添加List< Orders>对象;
举例:
"cn.itheima.pojo.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:将数据放入User对象的哪个属性中:orderList;
ofType:指定orderList属性的泛型类型;(使用collection标签后,mybatis知道要返回list,所以指定泛型类型即可)
-->
property="orderList" ofType="cn.itheima.pojo.Orders">
<id column="oid" property="id"/>
"userid" property="userId"/>
"createtime" property="createtime"/>
"number" property="number"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml">property>
<property name="dataSource" ref="dataSource">property>
bean>
<bean id="userDao" class="cn.itheima.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory">property>
bean>
其实讲真……我他妈没看懂;
1)
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" values="cn.itheima.maper.UserMapper">property>
<property name="sqlSessionFactory" ref="sqlSessionFactory">property>
bean>
2)包扫描的方式
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itheima.mapper">property>
bean>
通过数据库自动生成单表的、接口类和pojo类
生成单表的增删改查操作;
注意:如果多次执行生成文件的文件,会采用添加而不是覆盖的方式产生新文件;这可能会给以后运行带来问题;
criteria的使用:
实现单表多种条件的查询;