本节知识点:
➢MyBatis 的SQL映射文件提供select、insert、 update、 delete 等元素来实现SQL语句的映射。
➢SQL 映射文件的根节点是mapper元素,需指定namespace来区别于其他的mapper,保证全局唯一,且其名称必须要跟接口同名,作用是绑定DAO接口,即面向接口编程。
➢SQL 映射文件的select的返回结果类型的映射可以使用resultMap和resultType,但不能同时使用。
➢关于MyBatis的SQL语句参数入参,对于基础数据类型的参数数据,使用@Param注解实现参数入参;复杂数据类型的参数直接入参即可。
➢resultMap 的association和collection可以实现高级结果映射。
目录
一、使用MyBatis实现条件查询
案例:https://blog.csdn.net/weixin_42661709/article/details/109717021
注意点:select的resultType/resultMap属性只能二选一
resultType属性直接表示返回类型,包括基础数据类型和复杂数据类型。
(用resultType做自动映射时,字段名和POJO的属性名必须一致,不一致需要给字段起别名)
resultMap属性则是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上;
它的应用场景一般是:数据库字段信息与对象属性不一致,或者需要做复杂的联合查询以便自由控制映射结果。
引用示例如下:
<!--resultMap="userList" 这里就是引用的id为userList的resultMap-->
<select id="getUserList" resultMap="userList" parameterType="User">
select user.* from study_tests.user
</select>
<resultMap type="User" id="userList">
<!--property是对象的属性名 column数据库里的字段(如这里的用户名就不一致)-->
<result property="id" column="id"/>
<result property="name" column="userName"/>
<result property="password" column="password"/>
</resultMap>
二、使用MyBatis实现增删改查操作
insert 、 delete 、 update 均没有resultType属性,只有select操作需要对返回结果类型(resultType/resultMap)进行相应的指定
前面的配置工作(导包、核心配置,可参考MyBatis学习01)完成后,增删改查操作都是先写好接口,然后根据接口 再在mapper映射文件里写好对应的select、insert 、 delete 、 update 操作,最后进行测试,下面是在MyBatis学习01代码基础上新增的核心代码:
1、dao层接口
package dao;
import entity.User;
import java.util.List;
/**
* 增删改查接口
*/
public interface UserDao {
List<User> getUserList();
public int addUser(User user);
public int deleteUserById(int id);
public int updateUser(User user);
}
2、dao层SQL映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--这个mapper就相当于以前的接口实现类-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这里写对应接口类 -->
<mapper namespace="dao.UserDao">
<!--这里写实现的接口下的哪一个方法,以及返回的类型,并写出需要执行的sql语句-->
<select id="getUserList" resultType="entity.User">
select * from study_tests.user
</select>
<!--新增insert操作,parameterType对应接口接受的参数类型-->
<insert id="addUser" parameterType="entity.User">
insert into study_tests.user (id,username,password) values (#{id},#{username},#{password})
</insert>
<!--新增delete操作-->
<delete id="deleteUserById" parameterType="int">
delete from study_tests.user where id=#{id}
</delete>
<!--新增update操作-->
<update id="updateUser" parameterType="entity.User">
update study_tests.user
set username=#{username},password=#{password}
where id=#{id}
</update>
</mapper>
3、测试
注意:
每次执行删改查之后,sqlSession都commit()一下,这样数据库里数据才会同步, 最后执行完操作后记得close()关闭 sqlSession
package dao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;
import java.util.List;
public class UserDaoTest {
@Test//需要导入junit包才可以用
public void test() {
//3.使用工厂生产SqlSession对象 (接着工具类的语句)
SqlSession sqlSession = MybatisUtils.getSqlSession();
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//5.使用代理对象userDao执行方法
/**测试insert操作
User newUser = new User();
newUser.setId(3);
newUser.setUsername("韩信");
newUser.setPassword("789");
userDao.addUser(newUser);
sqlSession.commit();
*/
/**测试delete操作
userDao.deleteUserById(2);
sqlSession.commit();
*/
/**测试update操作
User oldUser = new User();
oldUser.setId(3);
oldUser.setUsername("李白");
oldUser.setPassword("7893");
userDao.updateUser(oldUser);
sqlSession.commit();
*/
/*测试select操作*/
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭
sqlSession.close();
}
}
原始数据库里:
查询:
新增3号:
删除2号:
修改3号韩信名字为李白,密码改为7893:
4、使用@Param注解实现多参数入参
@Para注解参数,适合只修改部分字段值情况下部分做入参 ,就不用像上面的update操作得封装成整个User做入参
下面是只修改用户密码的接口、映射、测试对应的核心代码:
//下面的@Param("password") String psw相当于将参数psw重命名为password
public int updatePassword(@Param("username") String username,@Param("password") String psw);
<!--使用@Para注解实现多参数入参,这里仅根据用户名修改当前用户密码-->
<update id="updatePassword">
update study_tests.user
set password=#{password}
where username=#{username}
</update>
//测试使用@Para注解进行修改用户密码
userDao.updatePassword("赵云","101");
sqlSession.commit();
三、使用resultMap实现高级结果映射
1、基本配置项
resultMap的属性:
子节点:
下面主要学习association和collection
2、association映射(处理一对一关联关系)
比如JavaBean里头内嵌JavaBean的情况
3、collection映射(处理一对多关联关系)
比如JavaBean里头内嵌集合的情况
四、resultMap自动映射级别和MyBatis缓存
1、自动映射级别
➢NONE:禁止自动匹配
➢PARTIAL(默认):自动匹配 除了内部嵌套 的所有属性
➢FULL:自动匹配所有
例如mybatis-config.xml设置如下:
<setting>
<!--自动映射级别设置为FULL-->
<setting name="autoMappingBehavior" value="FULL"/>
</setting>
2、缓存
mybatis提供一级缓存和二级缓存的支持,一级缓存SQL语句,二级缓存结果对象。
一级缓存:mybatis自带的基于PerpetualCache的HashMap本地缓存,作用范围为session域内,session被flush或close之后,该session内的所有cache就会被清空。
二级缓存:global caching,超出session范围,可被所有SqlSession共享(针对mapper的namespace而言),开启只需在mybatis-config.xml中设置如下:
<setting>
<setting name="cacheEnabled" value="true"/>
</setting>
然后在mapper映射文件中设置缓存,如:
<mapper namespace="dao.user.UserMapper">
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
......
</mapper>