MyBatis的构建,动态sql的语句

MyBatis 是一个半自动的映射框架,之所以称为半自动,是因为它需要手工匹配提供的POJO SQL 、和映射关系,而Hibernate 只需提供POJO 和映射关系即可。
下载地址:
创建项目,导入jar

Mybatis的基本构成

1、SqlSessionFactoryBuilder (构造器),根据配置信息或代码来生成SqlSessionFactory (工厂接口)
2、SqlSessionFactory :来生成SqlSession
3、SqlSession :执行SQL 并返回结果
4、SQLMapper :由一个Java 类和XML (或注解)构成
构建 SqlSessionFactory
主映射文件:
<? xml version= "1.0" encoding= "UTF-8" ?>
<! DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd" >
< configuration >
    <!-- 引入配置文件 -->
    < properties resource= "jdbc.properties" ></ properties >
    <!-- 设置别名 -->
    < typeAliases >
       <!-- 方式一 -->
       <!-- <typeAlias type="com.my.entity.User" alias="user"/> -->
       <!-- 方式二,常用 可以在实体类上定义 @Alias( "user") 指定是user别名-->
       < package name= "com.my.entity" />
    </ typeAliases >
    < environments default= "development" >
       < environment id= "development" >
           < transactionManager type= "JDBC" />
           < dataSource type= "POOLED" >
              < property name= "driver" value= "${driver}" />
              < property name= "url" value= "${url}" />
              < property name= "username" value= "${username}" />
              < property name= "password" value= "${password}" />
           </ dataSource >
       </ environment >
    </ environments >
      < mappers >
        < mapper class= "com.my.mapper.UserMapper2" /> <!-- 注解的 mapper -->
       < mapper resource= "com/my/mapper/UserMapper.xml" />
    </ mappers >
</ configuration >
代码:(创建工厂)
public void createFactory() throws IOException{
       SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
       String resource = "mybatis-config.xml";
       InputStream inputStream = Resources. getResourceAsStream( resource);
       SqlSessionFactory sessionFactory = builder.build( inputStream);
构建SqlSession
SqlSession sqlSession = null;
      //构造器
      try {    
         sqlSession = sqlSessionFactory .openSession();        
         sqlSession.commit();
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         if( sqlSession!= null){
            sqlSession.close();
         }
      }
SqlSession两个作用
1、获取映射器, 让映射器通过命名空间和方法名称找到对应的SQL ,执行SQL 并返回结果
2、直接通过命名信息去执行SQL 返回结果 
映射器
映射器是由Java 接口和XML 文件(或注解)共同组成的。
作用如下:
1)          定义参数类型
2)          描述SQL 语句
3)          定义查询结果和POJO 的映射关系
4)          描述缓存

定义一个接口
public interface UserMapper {
    public User getById( int id); //获取对象
    public int add(User user); //添加
    public int update(User user); //修改
    public int deleteById( int id); //删除
    //模糊查询
    public List<User> queryUser(String username);
    //用map的方法传参数
    public User queryUserByMap(Map<String, Object> map);
    //采用注解的方式传参数
    public User queryAnnotation( @Param( "username")String username, @Param( "password")String password);
}  
定义对应的UserMapper映射文件
<? xml version= "1.0" encoding= "UTF-8" ?>
<! DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace= "com.my.mapper.UserMapper" >
    <!-- 抽取公共的 sql 语句 用<include refid= "user-common" />接收-->
<!--role_name as roleName当我们的数据库 表字段 和实体类 类属性 不一样的时候用 as -->
    < sql id= "user-common" >
       id, username,password,role_name as roleName
    </ sql >
</ mapper > 
    < select id= "getById" resultType= "user" parameterType= "int" >
       select < include refid= "user-common" /> from user where id = #{id}
    </ select >
    < insert id= "add" parameterType= "com.my.entity.User" >
       insert into user( username,password) values(#{ username},#{password})
    </ insert >
    < update id= "update" parameterType= "com.my.entity.User" >
       update user set username=#{ username},password=#{password} where id=#{id}
    </ update >
    < delete id= "deleteById" parameterType= "com.my.entity.User" >
       delete from user where id=#{id}
    </ delete >   
    <!-- 模糊查询 -->
    < select id= "queryUser" resultType= "user" parameterType= "string" >
       select < include refid= "user-common" /> from user
       where username like concat('%',#{ username},'%')
    </ select >
    <!-- 传参的方式一,map的方式  -->
    < select id= "queryUserByMap" resultType= "user" parameterType= "map" >
       select < include refid= "user-common" /> from user
       where username=#{ username} and password=#{password}
    </ select >
    <!-- 注解的方法传参数  -->
    < select id= "queryAnnotation" resultType= "user" >
       select < include refid= "user-common" />  from user
       where username=#{ username} and password=#{password}
    </ select >


动态SQL

解决大量拼装SQL 的工作
if
需求: 我们现在做用户查询, 有可能带用户名, 有可能不带
where
trim : 替换的作用
choose when otherwise
多个查询条件同时出现的时候, 排优先级
If ..elseif..else
Set
假如一个表有多个字段,但我只需要更新需要更新的字段,减少网络带宽
foreach
案例,我们做批量的删除或更新
方式一, 以整型数组的方式
Int[] id = new int[]{1,2,3,4,5}
Delete from user where id in(s)
方式二: 以集合的方式
方式三: map 的方式


mybatis的创建总结:
首先注意我们mybatis的搭建环境;配置他的主配置文件;
创建工厂获取sqlsessionFacctory,
SqlSession 两个作用
1、获取映射器, 让映射器通过命名空间和方法名称找到对应的SQL ,执行SQL 并返回结果
2、直接通过命名信息去执行SQL 返回结果
映射器定义接口:实现CRUD的方法:
xml的方式: 在接口下创建一个和接口名一样的UserMapper .xml文件,映射空间为接口类,里面写我们接口的CRUD的方法操作sql语句,写好了映射之后要记得在我们的主配置文件里面配置我们<mappers>
<mapper resource="com/my/mapper/UserMapper.xml" />
他们的 id 都是我们接口里对应的 方法名 resultType="user" 是我们的返回的类型, parameterType="int" 是方法参数的类型,条件的值注意是用 #{id} 来获取,比如:delete from user where id= #{id}
其中模糊查询的语句为:
select id,username,password,role_name as roleName from user
where username like concat('%',#{username},'%')
注解的方式: 定义一个接口。
public interface UserMapper2 {  //注解的形式  
    @Select( "select * from user where id=#{id}")
    public User getById( int id);
}
修改主配置文件的mappers,改为类名
<mapper class="com.my.mapper.UserMapper2"/><!-- 注解的mapper -->

设置别名:如下,设置好别名之后,我们接口的映射文件返回类型就可以改为user
resultType="user"
< typeAliases >
       <!-- 方式一 -->
       <!-- <typeAlias type="com.my.entity.User" alias="user"/> -->
       <!-- 方式二,常用 可以在实体类上定义 @Alias( "user") 指定是user别名-->
       < package name= "com.my.entity" />
    </ typeAliases >
抽取创建工厂的工具类,避免写重复的代码:
1.自身私有化
 2.得到一个工厂对象,单例
 3.提供一个得到sqlSession对象的方法
传递多个参数 的方式:
1、采用map 的方式传递
2、采用注解的方式
3、采用javabean 的方式
总结:
同个类里面的属性,就是bean 的方式传递
不是的话,map 和注解选择

少的(小于5个),就选注解,多的话就选map


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值