mybatis的使用
mybatis的使用
一、mybatis传递参数
1.一个参数时
-
#占位符使用方法#{username},username可以为任意字符,只与传递过来的参数有关 -
$拼接使用方法为'${uername}'需要加单引号,而且username可以是任意名称
2.两个参数时
-
mybatis会将参数放在map集合中进行存储
-
以arg或者param为键,以参数为值
-
arg1,arg2,param1,param2,arg和param可以混合使用
-
只需要通过
#{},${}的方式访问值即可
3.有多个参数时
- 可以自己设置map
- 使用方法同两个参数时
4.参数为实体类时
- 通过属性名访问属性值,属性名不一定是成员变量
- 属性名是get和set方法名中的get和set去调用,把剩余部分的首字母变为小写的结果,就是我们当前的属性名
5.使用@Param注解命名参数
-
在mapper接口函数时使用,加在参数前面
-
例如:
User checkLoginByParam(@Param("username") String username, @Param("password") String password) -
mybatis会自动生成map
-
以@Param注解的值为键,以参数为值
-
注解之后arg参数就变为注解的值
使用最多的为实体类和@Param类型
二、特殊SQL执行
1.模糊查询
- 一般使用
$ - 使用
'where username like %#{username}%'会报错,因为单引号中的模糊查询语句会解析成字符串 - 使用
'like %${username}%'可以 - 使用拼接也可以
like concat('%', #{username}, '%') - 常用方法:
like "%"#{username}"%"
2.批量删除
where id in (${ids})
3.动态设置表名
${tablename}
添加功能获取自增主键
useGeneratedKeys="true":设置当前标签中的sql使用了自增的主键
keyProperty="id":将自增的主键的值赋值给传输到映射文件中参数的某个属性
三、映射关系
1.一对一映射
-
为字段起别名,保持和属性名的一致
-
使用配置文件(
config.xml)中的全局配置,自动映射为驼峰<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settiings> -
resultMap自定义映射,id:唯一标识,不能重复,type:设置映射关系中的实体类类型
resultType默认映射关系,resultMap自定义映射关系
2.多对一映射
-
association解决,
fetchType="lazy|eager",当开启了全局的延迟加载之后,可通过此属性手动控制延迟加载的效果 -
分布查询,可以延迟加载(默认不开启),
lazyLoadingEnabled=true,aggressiveLazyLoading=false<settings> <setting name="lazyLoadingEnabled" value="true"/> </settiings>
3.一对多映射
-
collection解决,
oftype:表示该属性所对应的集合中存储数据的类型<resultMap 略> <collection property="表名" ofType="表名的类型"> <result 略/> </collection> </resultMap>
四、动态SQL
1.if标签
- test属性里面的第一个参数是传递过来的参数中的属性名,第二个是字段名,第三个也是属性名
- 可以加上
1=1来拼接,防止sql出错
2.where标签
<where>
<if>
<!--可以防止sql出错,有内容时会自动生成where关键字,并且可以将内容中的and或or去掉,没有内容时没有关键字-->
<!--where不能将内容后面的内容去掉-->
</if>
</where>
3.trim标签
prefix|suffix:将trim标签中内容前面或后面添加指定内容prefixOverrides|suffixOverrides:将trim标签中内容前面或后面去电指定内容- 标签中没有内容时,trim没有作用
4.foreach标签
collection:设置需要循环的数组或集合item:表示数组或集合中的每一个数据separator:循环体之间的分隔符open:foreach标签所循环的所有内容的开始符close:foreach标签所循环的所有内容的结束符
五、mybatis逆向工程
1.添加依赖
<!-- 依赖MyBatis核心包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
<!-- 控制Maven在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency> <groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build
2.创建逆向工程配置文件
文件名必须是:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
targetRuntime: 执行生成的逆向工程的版本
MyBatis3Simple: 生成基本的CRUD(清新简洁版)
MyBatis3: 生成带条件的CRUD(奢华尊享版)
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.atguigu.mybatis.bean" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 逆向分析的表 -->
<!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
<!-- domainObjectName属性指定生成出来的实体类的类名 -->
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
3.执行MBG插件的generate目标

4.QBC查询
@Test public void testMBG() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpExample empExample = new EmpExample();
// 创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系
empExample.createCriteria().andEnameLike("a").andAgeGreaterThan(20).andDidIsNot Null();
// 将之前添加的条件通过or拼接其他条件
empExample.or().andSexEqualTo("男");
List<Emp> list = mapper.selectByExample(empExample);
for (Emp emp : list) {
System.out.println(emp);
}
}

浙公网安备 33010602011771号