lMyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
使用SqlSession调用mybatis方法直接操作数据库
namespace的命名空间的名称 + sql语句的id名 组合起来,构成一个唯一的id。用于区分不用的mapper
使用mapper接口方式操作数据库
namespace名称 必须等于 接口的全限定类名,保证mybatis能正常找到mapper接口定义方法
Select标签专门用来查询数据库表中的信息,用法和普通的sql语句中的select一致
属性名 | 作用 |
---|---|
id | 给sql语句取一个别名,方便后续调用 |
parameterType | 用户传入的参数类型 |
resultType | 查询到的数据结果集返回类型 |
思路:
u(1)将用户传入的多个参数打包封装成一个对象(User)
u(2)用户传入多个参数
【parameterType】
基础数据类型:
int、String、Date等
只能传入一个,通过#{参数名}即可获取传入的值
复杂数据类型:
Java实体类、Map等
通过#{属性名}或者#{map的keyName}即可获取传入值
【注意点】:
(1)parameterType接收用户传入参数的时候,如果只是基本数据类型,那么占位符(#{变量名}),可以随便写。
(2)parameterType接收用户传入参数的时候,如果是复杂类型的时候,那么占位符(#{变量名}),需和entity实体中属性以及数据表中的字段一致。
<< span="">select id="selectUserByNameAndage" parameterType="com.shop.domain.User" resultType="com.shop.domain.User"> select * from tb_user where name like #{name} and age=#{age} select>SqlSession session = sqlSession.openSession(true); UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setName("%王%"); user.setAge(100); Listlist = userMapper.selectUserByNameAndage(user); for (User user2 : list) { System.out.println(user2); } session.close(); << span="">select id="selectUserByNameAndage2" parameterType="java.util.Map" resultType="com.shop.domain.User"> select * from tb_user where name like #{name} and age=#{age} select> UserMapper userMapper = session.getMapper(UserMapper.class); MapuserMap = new HashMap(); userMap.put("name", "%王%"); userMap.put("age", 100); Listlist = userMapper.selectUserByNameAndage2(userMap); for (User user2 : list) { System.out.println(user2); } session.close(); |
---|
myabtis能帮我们自动将数据提交到数据库中,前提一定是java实体对象中属性名称要数据库表字段名称之间的映射关系是一致的
思考:如果不一致,结果会怎么样?
解决方式1:
<< span="">mapper namespace="com.shop.mapper.OrderMapper"> << span="">select id="selectOrderList" resultType="com.shop.domain.Order"> SELECT id,user_id as userId,number,createtime,note from `order` select>mapper> |
---|
解决方式2:
使用resultMap标签进行映射
<< span="">resultMap type="com.shop.domain.Order" id="orderMap"> << span="">id property="id" column="id"/> << span="">result property="userId" column="user_id"/>resultMap> << span="">select id="selectOrderList" resultMap="orderMap"> SELECT id,user_id,number,createtime,note from `order` select>mapper> |
---|
思考:既然只有一个字段和实体不一致,那可以不以只映射一个不匹配的呢???
答案:(YES/NO)
resultType :直接表示返回类型
基本数据类型
复杂数据类型
resultMap :对外部resultMap的引用
应用场景:
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
面试题:二者可以同时存在吗???
答案:(YES/NO)
专门用来插入数据到数据库的表中的
lid
lparameterType
注意:
uinsert、update、delete元素均没有resultType属性
uinsert、update、delete元素都需要配合事务进行操作
mybatis默认帮我们自动打开了事物,但是提交事务并没有,所以我们需要自己控制
u手动去commit()提交
u在调用opensession()的时候,设置true或者false,让mybatis帮我们提交
修改mybatisTools -> 封装getSession(boolean isCommit)的重载
专门用来更新数据到数据库表中的
lid
lparameterType
思考:用户修改密码功能和上面的修改个人信息功能有什么不同呢?
l用户修改密码功能,参数是比较固定的,就是两个
l用户修改个人信息的功能参数非常之多
解决方案:对于上面的两种功能,我们都可以将所有需要被修改的参数统一打包封装成一个对象(User)来进行操作,但是开发中,一般对于参数较为固定的,我们一般不使用封装到对象中进行处理,而是直接传入多个参数进去
为什么?
过3个以上的参数最好封装成对象入参(特别是在常规的增加和修改操作时,字段较多,封装成对象比较方便)
参数固定的业务方法,最好使用多参数入参
(这种方法比较灵活,代码的可读性高,可以清晰看出来这个接口方法的所需的参数是什么
并且对于固定的接口方法,参数一般是固定的,所以可以使用直接参数入参即可,无需封装对象,
比如修改个人密码的方法,根据ID删除用户的方法,根据id查看用户明细的方法,都可以采取这种方式)
如果要一次传入多个参数,就需要使用mybatis中提供的注解 - @Param
如何使用@param注解
1.在mapper接口方法中的每一个参数类型前面 加上@Param(“注解名”)
2.Mapper文件中的sql语句中的占位符参数名也要和注解名称一致
专门用来从数据库表中删除数据的
lid
lparameterType
association
复杂的类型关联,一对一
Collection
复杂类型集合,一对多
内部嵌套
映射一个嵌套结果集到一个列表
在association和collection两个演示示例的基础上进行测试
在控制台输出没有在resultMap中进行匹配的属性,并观察输出结果
resultMap自动映射(autoMappingBehavior)的三个匹配级别
NONE
禁止自动匹配
PARTIAL(默认)
自动匹配所有属性,内部嵌套除外
FULL
自动匹配所有
uMyabtis是操作数据库的一种框架技术-是dao层的u使用mybatis操作数据库的方式有两种: (1)使用内置的增删改查方法 (2)使用mapper接口方式uMyBatis参数入参 @Param注解参数 封装成对象入参uDAO层接口方法常见的返回类型 Map、List等复杂数据类型 int(增删改)更新操作时,影响的数据行数 |
---|
Mybatis需要自己写Sql,可以自己优化性能,一般用于大型互联网电商
Hibetrnate完全自动映射,不需要写任何Sql,性能的不是很好,一般用于内网系统