# mybatis
**Repository Path**: mr_sen/mybatis
## Basic Information
- **Project Name**: mybatis
- **Description**: mybatis学习记录
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-20
- **Last Updated**: 2021-06-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 搭建环境
>步骤一:加入jar
```xml
org.mybatis
mybatis
3.5.7
org.projectlombok
lombok
1.18.8
mysql
mysql-connector-java
8.0.16
```
>步骤二:mybatis的全局配置文件:mybatis-config.xml
```xml
```
> 以及mapper文件:LoverDao.xml
```xml
```
>步骤三:获取SqlSession和dao接口进行操作
```java
public class Test {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//region 原生jdbc操作
/*
Connection connection = sqlSession.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select * from lover");
ResultSet resultSet = preparedStatement.executeQuery();
*/
//endregion
// region 执行方法:方式一,推荐使用该方式
LoverDao mapper = sqlSession.getMapper(LoverDao.class);
List all = mapper.getAll();
System.out.println(all);
// endregion 推荐
// region 执行方法:方式二,不再推荐该方法
List lovers = sqlSession.selectList("com.lovexk.entity.dao.LoverDao.getAll");
System.out.println(lovers);
// endregion
}
}
```
## 自定代码块折叠
```java
//region 描述文字
//.....代码
//endregion
```
## 配置文件
### 属性(properties)
>这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
```xml
```
> 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如
```xml
```
> 总结:
> 这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由 config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
- 首先读取在 properties 元素体内指定的属性。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
### 设置(settings)
>完整的settings
```xml
```
更多内容:[详情点击](https://mybatis.org/mybatis-3/zh/configuration.html#properties)
## 插曲
>整表复制
```shell
## 在数据库mybatis2中创建一个和mybatis库中lover一样表结构的lover表
CREATE TABLE mybatis2.`lover` LIKE mybatis.`lover`; ##创建表
INSERT INTO mybatis2.`lover` SELECT * FROM mybatis.`lover`;## 插入数据
```
## 开启日志功能,打印sql
>在全局配置文件中加入
```xml
```
> 注意:全局配置文件中的标签是有顺序的。踩坑:把settings放在最后报错了
>本来想用log4j来记录日志,发现自己整不明白
##开启驼峰命名法
>在配置文件中添加
>
```xml
```
## 给类起别名
>在配置文件中添加
```xml
```
> 这样在接口实现的xml中
```xml
```
## # 和 $ 的区别
一、两者的异同
相同:
都可以通过 #和 $ 来 获取对象中的信息
不同:
使用#传递的参数会先转换为占位符?, 通过设置占位符参数的方式来设置值(会给值使用单引号引起来)
使用$传递的参数,直接把解析出来的数据作为SQL语句的一部分
二、推论
#: 好比使用PrepareStatement,不会导致SQL注入问题,相对安全
$: 好比使用Statement, 可能会导致SQL注入问题,相对不安全.
三、如何选择
如果需要设置 占位符参数 的地方,全部使用 # ,也就是SQL之后可能使用 ? 的情况
如果我们传递过去的对象字段的内容应该作为SQL的一部分, 此时使用 $ , 比如 排序、分组查询等
## resultMap
```xml
```