MyBatis中映射文件的使用
1、配置核心文件
①引入映射文件
首先我们得在核心配置文件中配置
mappers
,引入映射文件所在的包
<mappers><packagename="com.ch.mybatis.mapper"></package></mappers>
这里必须满足两个条件:
- 接口和映射文件所在的包必须一致
- 接口的名字和映射文件的名字必须一致
②配置typeAliases
typeAliases
:设置类型别名,即为某个具体的类型设置一个别名。在MyBatis的范围中,就可以使用别名表示一个具体的类型。
在核心配置文件中设置
typeAliases
,在映射文件中则可以直接使用别名。
- 通过包设置类型别名,指定包下所有的类型将全部有用默认的别名,即类名且不区分大小写 。
- 要注意标签的先后顺序
<!--
标签的先后顺序
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?
--><typeAliases><packagename="com.ch.mybatis.pojo"></package></typeAliases>
③配置映射文件
namespace
接口的全类名和映射文件
namespace
一致。
<mappernamespace="com.ch.mybatis.mapper.userMapper"></mapper>
3、MyBatis的增删改查
创建数据表
复制进
MySQL
数据库中运行即可
DROPTABLEIFEXISTS`t_user`;CREATETABLE`t_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(20)CHARACTERSET utf8 COLLATE utf8_unicode_ci DEFAULTNULL,`password`varchar(20)CHARACTERSET utf8 COLLATE utf8_unicode_ci DEFAULTNULL,`age`int(11)DEFAULTNULL,`gender`char(2)CHARACTERSET utf8 COLLATE utf8_unicode_ci DEFAULTNULL,`email`varchar(50)CHARACTERSET utf8 COLLATE utf8_unicode_ci DEFAULTNULL,PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=1CHARACTERSET= utf8 COLLATE= utf8_unicode_ci ROW_FORMAT = Compact;SET FOREIGN_KEY_CHECKS =1;
工具类
创建一个工具类,每次测试就不用去重新写,直接调用获取返回值即可
publicstaticSqlSessiongetSqlSession(){SqlSession sqlSession =null;try{//获取核心配置文件InputStream is =Resources.getResourceAsStream("MyBatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder =newSqlSessionFactoryBuilder();//根据核心配置文件对应的输入流获取SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取SqlSession对象 自动提交
sqlSession = sqlSessionFactory.openSession(true);}catch(IOException e){
e.printStackTrace();}return sqlSession;}
添加
首先得在Mapper接口中创建方法
intinsertUser();
在映射文件中使用
insert
标签,标签中的
id
要与接口中的方法名保持一致。等调用接口中的方法,它会根据mapper接口的全类名找到映射文件,然后会根据我们调用的方法的方法名,来找到当前的
sql
语句,然后获取当前的
sql
来执行。
- 可以将接口的方法写在标签的上方,方便查看。
<!-- int insertUser(); --><insertid="insertUser">
insert into t_user
values (null, 'admin', '123456', 23, '男', '[email protected]')
</insert>
测试代码
publicvoidtestinsert(){SqlSession sqlSession = sqlSessionUtil.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);int i = mapper.insertUser();
sqlSession.close();}
修改
<!-- void updateUser(); --><updateid="updateUser">
update t_user set username='root',password='123'where id = 1
</update>
删除
<!-- void deleteUser(); -->
<delete id="deleteUser">
delete from t_user where id = 1
</delete>
查询
查询比较特殊除了得设置id还必须得设置另外一个参数resultType或resultMap
resultType:设置结果类型,即查询的数据要转换为的java的类型
resultMap:自定义映射,处理多对一或一对多的映射关系resultType中应该写实体类的全类名,但是在核心文件中配置了typeAliases,所以这里可以直接写实体类的名字不区分大小写
<!-- User selectUser();--><selectid="selectUser"resultType="user">
select id, username, password, age, gender, email from t_user where id = 1
</select>
4、MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:**${}和#{}**
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号
单个字面量类型的参数
<!-- User getUserByUsername(String username); --><selectid="getUserByUsername"resultType="user"><!-- select * from t_user where username = #{username}-->
select * from t_user where username = '${username}'
</select>
mapper接口方法的参数为单个的字面量类型此时可以通过
#{}
和
${}
以任意的内容获取参数值,一定要注意${}的单引号问题
多个字面量类型的参数
<!-- User chekLogin(String username , String password); --><selectid="chekLogin"resultType="user"><!-- select * from t_user where username = #{arg0} and password = #{arg1}-->
select * from t_user where username = '${param1}' and password = '${param2}'
</select>
mybatis会自动把当前参数放在一个Map集合中
放在Map集合中会以两种方式存储数据
①arg0,arg1…为键,以参数为值
②param1,param2…为键,以参数为值
map集合类型的参数
<!-- User chekLoginByMap(Map<String,Object> map);--><selectid="chekLoginByMap"resultType="user">
select * from t_user where username = #{username} and password = #{password}
</select>
mapper接口方法的参数为map集合类型的参数
只需要通过#{}和${}范围map集合的键,
就可以获取相对于的值,一定要注意${}的单引号问题
测试代码
publicvoidtestChekLoginByMap(){SqlSession sqlSession = sqlSessionUtil.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);Map map =newHashMap<String,Object>();
map.put("username","admin");
map.put("password","123456");User admin = mapper.chekLoginByMap(map);System.out.println(admin);}
实体类类型的参数
<!--voidselectUser(UserUser);--><insert id="selectUser">
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})</insert>
mapper接口方法的参数为实体类类型的参数
只需要通过#{}和${}访问实体类中的属性名,
就可以获取相对于的属性值,一定要注意${}的单引号问题
使用@Param标识参数
<!-- User chekLoginByUser(@Param("username") String username ,@Param("password") String password); --><selectid="chekLoginByUser"resultType="user">
select * from t_user where username = #{username} and password = #{password}
</select>
可以在mapper接口将这些参数上设置@param注解
此时MyBatis会将这些参数放在map中,以@Param注解的value属性值为键,以参数为值;
版权归原作者 一天睡20个小时 所有, 如有侵权,请联系我们删除。