折叠

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.一对一映射

  1. 为字段起别名,保持和属性名的一致

  2. 使用配置文件(config.xml)中的全局配置,自动映射为驼峰

    <settings>
    	<setting name="mapUnderscoreToCamelCase" value="true"/>
    </settiings>
    
  3. resultMap自定义映射,id:唯一标识,不能重复,type:设置映射关系中的实体类类型

resultType默认映射关系,resultMap自定义映射关系

2.多对一映射

  1. 级联属性赋值

  2. association解决fetchType="lazy|eager",当开启了全局的延迟加载之后,可通过此属性手动控制延迟加载的效果

  3. 分布查询,可以延迟加载(默认不开启),lazyLoadingEnabled=trueaggressiveLazyLoading=false

    <settings>
    	<setting name="lazyLoadingEnabled" value="true"/>
    </settiings>
    

3.一对多映射

  1. collection解决oftype:表示该属性所对应的集合中存储数据的类型

    <resultMap 略>
    	<collection property="表名" ofType="表名的类型">
    		<result 略/>
    	</collection>
    </resultMap>
    
  2. 分布查询

四、动态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); 
    } 
}
posted @ 2022-09-12 11:21  %p%s%n  阅读(184)  评论(0)    收藏  举报
折叠