目录
一.mybatis-config.xml-配置文件详解
1.说明
2.properties 属性
通过该属性,可以指定一个外部的 jdbc.properties 文件,引入我们的 jdbc 连接信息
代码演示
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=hong
jdbc.driver就是key值,名字随便起
当然使用一个配置文件在另外一个文件中自然需要引入(在前面引入)
<!--引入外部的jdbc.properties-->
<properties resource="jdbc.properties"/>
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
3.settings 全局参数定义--》通常使用默认
这是mybatis中极为重要的调整设置,他们会改变mybatis的运行时行为
4.typeAliases 别名处理器
<!--配置别名-->
<typeAliases>
<!--<typeAlias type="com.hong.entity.Monster" alias="Monster"/>-->
<!--
如果一个包下有很多的类,我们可以直接引入包,这样
该包下面的所有类名,可以直接使用
-->
<package name="com.hong.entity"/>
</typeAliases>
就可以直接使用类名操作了
5.typeHandlers 类型处理器
6.environments 环境
1. resource 注册 Mapper 文件: XXXMapper.xml 文件(常用,使用过)
<!-- 这里会引入(注册)我们的Mapper.xml文件-->
<!-- <mapper resource="com/hong/mapper/MonsterMapper.xml"/>-->
2. class:接口注解实现(使用过)
<!--解读
1. 如果是通过注解的方式,可不再使用 MonsterMapper.xml
2. 但是需要在mybatis-config.xml注册/引入含注解的类
3. 如果没有引入,不能使用
-->
<mapper class="com.hong.mapper.MonsterAnnotation"/>
3. url:外部路径,使用很少,不推荐, <mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />
4. package 方式注册 :<package name="com.hong.mapper"/>
<!-- <package name="com.hong.mapper"/>-->
解读
1. 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册
2. 将下面的所有xml文件和注解接口 都进行注册
二.XxxxMapper.xml-SQL 映射文件
1.XxxMapper.xml-基本介绍
2.XxxMapper.xml-详细说明
2.1基本使用
3.parameterType(输入参数类型)
代码:案例1
//通过id 或者名字查询
public List<Monster> findMonsterByNameORId(Monster monster);
<mapper namespace="com.hong.mapper.MonsterMapper">
<!--
1. 配置/实现public List<Monster> findMonsterByNameORId(Monster monster);
2. 通过id 或者名字查询
3. `id` = #{id} `id`表示表的字段名 #{id} 中的id表示你传入的Monster对象的属性名
-->
<select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">
SELECT * FROM `monster` WHERE `id` = #{id} OR `name` = #{name}
</select>
</mapper>
public void findMonsterByNameORId() {
Monster monster = new Monster();
monster.setId(1);
monster.setName("狐狸精-100");
List<Monster> monsters =
monsterMapper.findMonsterByNameORId(monster);
for (Monster m : monsters) {
System.out.println("m-" + m);
}
if (sqlSession != null) {
sqlSession.close();
}
System.out.println("操作成功~");
}
案例二:
<!--
1. 配置/实现 public List<Monster> findMonsterByName(String name);
2. 请查询 name 中 包含 "牛魔王" 的妖怪 - 是模糊查询
3. 模糊查询的使用 取值 需要 ${value} 取值
-->
<select id="findMonsterByName" parameterType="String" resultType="Monster">
SELECT * FROM `monster` WHERE `name` LIKE '%${name}%'
</select>
public void findMonsterByName() {
List<Monster> monsters = monsterMapper.findMonsterByName("牛魔王");
for (Monster monster : monsters) {
System.out.println("monster--" + monster);
}
if (sqlSession != null) {
sqlSession.close();
}
System.out.println("操作成功~");
}
4.传入 HashMap
//查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
public List<Monster>
findMonsterByIdAndSalary_PrameterHashMap(Map<String, Object> map);
<!-- 实现 findMonsterByIdAndSalary_PrameterHashMap -->
<select id="findMonsterByIdAndSalary_PrameterHashMap" parameterType="map" resultType="Monster">
SELECT * FROM monster
WHERE id > #{id} AND salary > #{salary}
</select>
public void findMonsterByIdAndSalary_PrameterHashMap() {
//Diamond types are not supported at language level '5'
//如何解决.=> 在pom.xml文件中指定编译器版本
/*
<!--指定Maven编译器 和 jdk版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
</properties>
*/
Map<String, Object> map = new HashMap<>();
map.put("id", 10);
map.put("salary", 40);
List<Monster> monsters =
monsterMapper.findMonsterByIdAndSalary_PrameterHashMap(map);
for (Monster monster : monsters) {
System.out.println("monster--" + monster);
}
if (sqlSession != null) {
sqlSession.close();
}
System.out.println("操作成功~");
}
//查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
public List<Map<String, Object>>
findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String, Object> map);
<!--
1. 配置/实现 public List<Map<String, Object>>
findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String, Object> map);
2. id > 10 并且 salary 大于 40, 要求传入的参数和返回的是HashMap
-->
<select id="findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap" parameterType="map" resultType="map">
SELECT * FROM `monster` WHERE `id` > #{id} AND `salary` > #{salary}
</select>
public void findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap() {
Map<String, Object> map = new HashMap<>();
map.put("id", 10);
map.put("salary", 40);
List<Map<String, Object>> monsterList =
monsterMapper.findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(map);
//取出返回的结果-以map取出
//回顾java基础,map遍历
for (Map<String, Object> monsterMap : monsterList) {
//System.out.println("monsterMap-" + monsterMap);
//遍历monsterMap(方式1) ,取出属性和对应值
//Set<String> keys = monsterMap.keySet();
//for (String key : keys) {
// System.out.println(key + "=>" + monsterMap.get(key));
//}
//遍历monsterMap(方式2) ,取出属性和对应值
for (Map.Entry<String, Object> entry : monsterMap.entrySet()) {
System.out.println(entry.getKey() + "==>" + entry.getValue());
}
System.out.println("------------------------");
}
if (sqlSession != null) {
sqlSession.close();
}
System.out.println("操作成功~");
}
5.resultMap(结果集映射)
简单理解:就是当数据库中的字段名和我们pojo的属性名不一样的时候(因为我们在填写对应的xml文件的时候#{}要和属性名一样),使用resultMap 做一个专门的映射指定就可以找到了。我理解为就是将数据库的字段改变成属性的名字。
举例:
User表字段:
`user_id` INT NOT NULL AUTO_INCREMENT,
`user_email` VARCHAR(255) DEFAULT '',
`user_name` VARCHAR(255) DEFAULT '',
pojo类属性:
private Integer user_id;
private String username;
private String useremail;
xml中的配置(主要就在这里)
<mapper namespace="com.hong.mapper.UserMapper">
<!--
1、配置方法public void addUser(User user);
2、完成添加用户的任务, 注意这里user属性和表的字段名不一致
-->
<insert id="addUser" parameterType="User">
INSERT INTO `user` (`user_email`,`user_name`)
VALUE (#{useremail}, #{username})
</insert>
<!--
1. 配置方法public List<User> findAllUser();
2. 返回所有的user信息
3. 按照传统的方式完成,会出现什么问题?=> 如果对象属性名和表字段相同时,就会设置值, 如果不同, 就会是默认值
4. 我们可以使用resultMap来解决
5. resultMap : 表示我们要定义一个resultMap
6. id="findAllUserMap" => id 就是程序员指定的resultMap id ,后面通过id可以使用他
7. type="User" , 就是你需要返回的对象类型
8. result column="user_email" property="useremail": column="user_email" 表的字段名, property="useremail" 对象属性名
9. resultMap="findAllUserMap" 表示使用我们定义的 resultMap , 通过id关联
-->
<resultMap id="findAllUserMap" type="User">
<result column="user_email" property="useremail"/>
<result column="user_name" property="username"/>
</resultMap>
<select id="findAllUser" resultMap="findAllUserMap">
SELECT * FROM `user`
</select>
<!--使用表字段别名,来解决表的字段名和对象属性名,不一致问题, 可以用,但是我们仍然推荐使用resultmap-->
<!--<select id="findAllUser" resultType="User">-->
<!-- SELECT user_id ,user_name AS username,user_email AS useremail FROM `user`-->
<!--</select>-->
</mapper>
测试
public class UserMapperTest {
//属性
private SqlSession sqlSession;
private UserMapper userMapper;
//初始化
@Before
public void init() {
sqlSession = MyBatisUtils.getSqlSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void addUser() {
User user = new User();
user.setUsername("jack");
user.setUseremail("jack@qq.com");
userMapper.addUser(user);
//如果是增删改, 需要commit()
if(sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
System.out.println("操作OK~");
}
@Test
public void findAllUser() {
List<User> users = userMapper.findAllUser();
for (User user : users) {
System.out.println("user--" + user);
}
if(sqlSession != null) {
sqlSession.close();
}
System.out.println("操作OK~");
}
注意事项和细节
<!--使用表字段别名,来解决表的字段名和对象属性名,不一致问题, 可以用,但是我们仍然推荐使用resultmap-->
<!--<select id="findAllUser" resultType="User">-->
<!-- SELECT user_id ,user_name AS username,user_email AS useremail FROM `user`-->
<!--</select>-->