官网 :https://mybatis.org/mybatis-3/zh/configuration.html
看word
解决SQL映射文件的警告提示:
IDEA中配置MySQL数据库连接
1.点击IDEA右边框的 Database
,在展开的界面点击 +
选择 Data Source
,再选择 MySQL
2.在弹出的界面进行基本信息的填写
使用Mapper代理要求
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
3.在 Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
/**
* Mybatis 代理开发
*/
public class MyBatisDemo2 {
public static void main(String[] args) throws IOException {
//1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象,用它来执行sql -----当为true 时 自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 执行sql
//3.1 获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List users = userMapper.selectAll();
System.out.println(users);
//4. 释放资源
sqlSession.close();
}
}
注意: -------别忘了加载sql映射文件
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件的加载映射配置文件的配置修改为
注意: 习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring
之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下
1.在核心配置文件的 environments
标签中其实是可以配置多个 environment
,使用 id
给每段环境起名,在 environments
中使用 default='环境id'
来指定使用哪儿段配置。我们一般就配置一个 environment
即可。
2.类型别名
在映射配置文件中的 resultType
属性需要配置数据封装的类型(类的全限定名)。而每次这样写是特别麻烦的,Mybatis 提供了 类型别名
(typeAliases) 可以简化这部分的书写。
1.我们可以在写sql语句时给这两个字段起别名,将别名定义成和属性名一致即可。
2.SQL片段:
将需要复用的SQL片段抽取到 `sql` 标签中
id, brand_name as brandName, company_name as companyName, ordered, description, status
id属性值是唯一标识,引用时也是通过该值进行引用。
在原sql语句中进行引用
使用 `include` 标签引用上述的 SQL 片段,而 `refid` 指定上述 SQL 片段的id值。
3.使用resultMap定义字段和属性的映射关系
在映射配置文件中使用resultMap定义 字段 和 属性 的映射关系
注意:在上面只需要定义 字段名 和 属性名 不一样的映射,而一样的则不需要专门定义出来。
SQL语句正常编写
1.#{} :执行SQL时,会将 #{} 占位符替换为?,将来自动设置参数值。从上述例子可以看出使用#{} 底层使用的是 `PreparedStatement
2.${} :拼接SQL。底层使用的是 Statement
,会存在SQL注入问题。如下图将 映射配置文件中的 #{} 替换成 ${} 来看效果
对于有参数的mapper接口方法,我们在映射配置文件中应该配置 ParameterType
来指定参数类型。只不过该属性都可以省略。如下图:
因为映射配置文件是xml类型的问题,而 > < 等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义,可以使用以下两种方式进行转义
多参数传递
1.使用 @Param("参数名称")
标记每一个参数,在映射配置文件中就需要使用 #{参数名称}
进行占位
List selectByCondition(@Param(“status”) int status, @Param(“companyName”) String companyName,@Param(“brandName”) String brandName);
其中这个Param中()为sql语句中的参数
2.将多个参数封装成一个 实体对象 ,将该实体对象作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容}
时,里面的内容必须和实体类属性名保持一致。
List selectByCondition(Brand brand);
其中这个brand(对象)中对象的名字要跟SQL的参数名应该一样
3.将多个参数封装到map集合中,将map集合作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容}
时,里面的内容必须和map集合中键的名称一致。
List selectByCondition(Map map);
SQL中的参数名和map集合中的 键 的名称对应上
SQL语句可以根据我的需求进行变换
如上的这种SQL语句就会根据传递的参数值进行动态的拼接。如果此时status和companyName有值那么就会值拼接这两个条件。
select * from tb_brand where and company_name like ? and brand_name like ?
2.WHERE
choose(when,otherwise)标签
实现, 而 choose
标签类似于Java 中的switch语句。
当都没有时会执行otherwise
select * from tb_brand
status = #{status}
company_name like #{companyName}
brand_name like #{brandName}
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
主键返回
在 insert 标签上添加如下属性: 添加在sql映射文件的insert标签上
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。
update tb_brand
brand_name = #{brandName},
company_name = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
delete from tb_brand where id=#{id};
编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach
标签供我们使用
foreach 标签
用来迭代任何可迭代的对象(如数组,集合)。
foreach
标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。
delete from tb_brand where id
in
#{id}
;
Mybatis 接口方法中可以接收各种各样的参数,如下:
User select(@Param("username") String username,@Param("password") String password);
Mybatis 会将这些参数封装成 Map 集合对象,值就是参数值,而键在没有使用 @Param
注解时有以下命名规则:
以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推。如:
map.put(“arg0”,参数值1);
map.put(“arg1”,参数值2);
以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推。如:
map.put(“param1”,参数值1);
map.put(“param2”,参数值2);
结论:以后接口参数是多个时,在每个参数上都使用 @Param
注解。这样代码的可读性更高。
POJO 类型
直接使用。要求 属性名
和 参数占位符名称
一致
Map 集合类型
直接使用。要求 map集合的键名
和 参数占位符名称
一致
Collection 集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,collection集合);
map.put(“collection”,collection集合;
可以使用 @Param
注解替换map集合中默认的 arg 键名。
List 集合类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,list集合);
map.put(“collection”,list集合);
map.put(“list”,list集合);
可以使用 @Param
注解替换map集合中默认的 arg 键名。
Array 类型
Mybatis 会将集合封装到 map 集合中,如下:
map.put(“arg0”,数组);
map.put(“array”,数组);
可以使用 @Param
注解替换map集合中默认的 arg 键名。
例如
:void DeleteList(@Param(“ids”) int[] ids);
delete from tb_brand where id
in
collection时循环的数组
#{id}
;
其他类型
比如int类型,参数占位符名称
叫什么都可以。尽量做到见名知意
简单的SQL可以使用注解
难的一般使用配置文件的方式
我们一般创建一个工具类
public class SqlSessionFactoryT {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
使用
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryT.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
虽然使用注解开发,不需要mapper.xml了 ,但是mybatis的配置文件中的加载Sql映射文件和起别名一点都不能少。 -------如果使用注解就没有该映射文件