Sql构建
SQL 构建对象介绍
-  之前通过注解开发时,相关 SQL 语句都是直接拼写的,一些关键字写起来比较麻烦、而且容易出错 
-  MyBatis 提供了 org.apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL 语句 

sql拼接测试:
public class SqlTest {
    public static void main(String[] args) {
        String sql = getSql();
        System.out.println(sql);
    }
    public static String getSql(){
        String sql =new SQL(){
            {
            SELECT("*");
            FROM("student");
            }
        }.toString();
        return sql;
    }
}
1. 查询功能的实现
-  定义功能类并提供获取查询的 SQL 语句的方法 
-  @SelectProvider:生成查询用的 SQL 语句注解 
-  type 属性:生成 SQL 语句功能类对象 
-  method 属性:指定调用方法 
1.1 构建成SQL语句功能类对象
public class ReturnSql {
    //定义方法,返回查询的sql语句
    public String getSelectAll(){
        return new SQL(){
            {
                SELECT("*");
                FROM("t_user");
            }
        }.toString();
    }
}
更改mapper接口方法:
public interface UserMapper {
   // @Select("select * from t_user")
    @SelectProvider(type = ReturnSql.class,method = "getSelectAll")
    public List<User> selectAll();
}
1.2 实现动态SQL查询
根据id和名字查询用户信息:
public String getFindUser(User user){
        return new SQL() {
            {
            SELECT("*");
            FROM("t_user");
            if(user.getId()!=0){
                WHERE("id=#{id}");
            }
                if (user.getUsername()!=null && user.getUsername()!=""){
                    AND().WHERE("username =#{username}");
                }
        }
        }.toString();
    }
mapper文件:
@SelectProvider(type = ReturnSql.class,method = "getFindUser")
    public List<User> findColl(User user);
测试代码:
 @Test
    public  void test02(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setId(4);
        user.setUsername("小马");
        List<User> coll = mapper.findColl(user);
        for (User user1 : coll) {
            System.out.println(user1);
        }
    }
根据名字和地址模糊查询
功能类对象里面编写方法:
 public String getLikeUser(User user){
        return new SQL() {
            {
               SELECT("*");
               FROM("t_user").WHERE("1=1");
          if (user.getUsername()!=null && user.getUsername()!=""){
          AND().WHERE("username like concat('%',#{username},'%')");
                }
                if(user.getAddress()!=null && user.getAddress()!=""){
             AND().WHERE("address like concat('%',#{address},'%')");
                }
            }
        }.toString();
    }
mapper接口里面编写:
 @SelectProvider(type = ReturnSql.class,method = "getLikeUser")
    public List<User> findLike(User user);
测试类编写:
 @Test
    public  void test02(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setUsername("小");
        user.setAddress("郑");
        List<User> coll = mapper.findLike(user);
        for (User user1 : coll) {
            System.out.println(user1);
        }
    }
2. 新增功能的实现
-  定义功能类并提供获取新增的 SQL 语句的方法 
-  @InsertProvider:生成新增用的 SQL 语句注解 
-  type 属性:生成 SQL 语句功能类对象 
-  method 属性:指定调用方法 
2.1 编写功能类对象
 //定义方法,返回新增的sql语句
    public String getInsert(User user) {
        return new SQL() {
            {
                INSERT_INTO("t_user");
                INTO_VALUES("#{id},#{username},#{sex},#{address},#{birthday}");
            }
        }.toString();
    }
2.2 编写mapper接口方法
 //@Insert("INSERT INTO user VALUES (#{id},#{username},#{sex},#{address},#{birthday})")
    @InsertProvider(type = ReturnSql.class,method = "getInsert")
    public Integer insert(User user);
2.3 编写测试类
 @Test
    public void test03(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
       // user.setId();
        user.setUsername("李名");
        user.setAddress("新乡");
        user.setSex("男");
        user.setBirthday(Date.valueOf("2022-09-08"));
        Integer insert = mapper.insert(user);
        System.out.println(insert);
    }
3. 修改功能的实现
-  定义功能类并提供获取修改的 SQL 语句的方法 
-  @UpdateProvider:生成修改用的 SQL 语句注解 
-  type 属性:生成 SQL 语句功能类对象 
-  method 属性:指定调用方法 
代码实现:
3.1 编写功能类对象
 //定义方法,返回修改的sql语句
    public String getUpdate(User user) {
        return new SQL() {
            {
                UPDATE("t_user");
                SET("username=#{username}","sex=#{sex}");
                WHERE("id=#{id}");
            }
        }.toString();
    }
3.2 编写mapper接口类
  //修改功能
//@Update("UPDATE student SET  username=#{username},sex=#{sex} where id=#{id}")
 @UpdateProvider(type = ReturnSql.class , method = "getUpdate")
 public abstract Integer update(User user);
3.3 测试运行
   @Test
    public void test03(){
        SqlSession sqlSession = MybatisUtils.getSqlSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setId(9);
        user.setUsername("李明");
        user.setAddress("新乡");
        user.setSex("男");
        user.setBirthday(Date.valueOf("2022-09-08"));
        Integer update = mapper.update(user);
        System.out.println(update);
    }
4. 动态sql实现修改模式
4.1 编写功能类
 //动态sql实现修改
    public String doUpdate(User user){
        return  new SQL(){
            {
                UPDATE("t_user");
                if(user.getUsername()!=null){
                    SET("username=#{username}");
                }
                if (user.getSex()!=null){
                    SET("sex=#{sex}");
                }
                if(user.getAddress()!=null){
                    SET("address=#{address}");
                }
                if (user.getId()!=null){
                    WHERE("id=#{id}");
                }
            }
        }.toString();
    }
4.2 编写mapper接口方法
@UpdateProvider(type = ReturnSql.class , method = "doUpdate")
 public abstract Integer update(User user);
5. 删除功能的实现
-  定义功能类并提供获取删除的 SQL 语句的方法 
-  @DeleteProvider:生成删除用的 SQL 语句注解 
-  type 属性:生成 SQL 语句功能类对象 
-  method 属性:指定调用方法 
定义功能类:
 //定义方法,返回删除的sql语句
    public String getDelete(Integer id) {
        return new SQL() {
            {
                DELETE_FROM("t_user");
                WHERE("id=#{id}");
            }
        }.toString();
    }
定义mapper接口方法:
 //删除功能
    //@Delete("DELETE FROM t_user WHERE id=#{id}")
    @DeleteProvider(type = ReturnSql.class , method = "getDelete")
    public abstract Integer delete(Integer id);














![[centos]安装mysql8.0.26](https://img-blog.csdnimg.cn/7fd8ee320a3f40e8b2c8a2b8b13b1e0f.png)



