• Java框架 特殊SQL的执行


    这里所有的情况都是 不能直接使用 #{} 的情况

    0. 准备工作


    pojo类:

    1. /**
    2.  * 和数据库表 t_user 对应的实体类
    3.  */
    4. public class User {
    5.     private Integer id;
    6.     private String username;
    7.     private String password;
    8.     private Integer age;
    9.     private String gender;
    10.     private String email;
    11.  
    12.     public User() {
    13.     }
    14.  
    15.     public User(Integer id, String username, String password, Integer age, String gender, String email) {
    16.         this.id = id;
    17.         this.username = username;
    18.         this.password = password;
    19.         this.age = age;
    20.         this.gender = gender;
    21.         this.email = email;
    22.     }
    23.  
    24.     public Integer getId() {
    25.         return id;
    26.     }
    27.  
    28.     public void setId(Integer id) {
    29.         this.id = id;
    30.     }
    31.  
    32.     public String getUsername() {
    33.         return username;
    34.     }
    35.  
    36.     public void setUsername(String username) {
    37.         this.username = username;
    38.     }
    39.  
    40.     public String getPassword() {
    41.         return password;
    42.     }
    43.  
    44.     public void setPassword(String password) {
    45.         this.password = password;
    46.     }
    47.  
    48.     public Integer getAge() {
    49.         return age;
    50.     }
    51.  
    52.     public void setAge(Integer age) {
    53.         this.age = age;
    54.     }
    55.  
    56.     public String getGender() {
    57.         return gender;
    58.     }
    59.  
    60.     public void setGender(String gender) {
    61.         this.gender = gender;
    62.     }
    63.  
    64.     public String getEmail() {
    65.         return email;
    66.     }
    67.  
    68.     public void setEmail(String email) {
    69.         this.email = email;
    70.     }
    71.  
    72.     @Override
    73.     public String toString() {
    74.         return "User{" +
    75.                 "id=" + id +
    76.                 ", username='" + username + '\'' +
    77.                 ", password='" + password + '\'' +
    78.                 ", age=" + age +
    79.                 ", gender='" + gender + '\'' +
    80.                 ", email='" + email + '\'' +
    81.                 '}';
    82.     }
    83. }

    工具类:

    1. package com.chenyixin.ssm.utils;
    2.  
    3. import org.apache.ibatis.io.Resources;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.apache.ibatis.session.SqlSessionFactory;
    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    7.  
    8. import java.io.InputStream;
    9.  
    10. public class SqlSessionUtil {
    11.  
    12.     public static SqlSession getSqlSession() {
    13.         try {
    14.             // 获取核心的配置文件
    15.             InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    16.             // 创建 SqlSessionFactoryBuilder 对象
    17.             SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    18.  
    19.             // 通过核心配置文件多对应的字节输入流创建工厂类 SqlSessionFactory ,生产 SqlSession 对象
    20.             SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
    21.  
    22.             // 创建 SqlSession 对象(自动操作事务)
    23.             return sqlSessionFactory.openSession(true);
    24.         } catch (Exception e) {
    25.             throw new RuntimeException(e);
    26.         }
    27.  
    28.     }
    29. }

    mybatis-config.xml:

    1. configuration
    2.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    3.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4. <configuration>
    5.     
    6.  
    7.     
    8.     <properties resource="jdbc.properties"/>
    9.  
    10.     <typeAliases>
    11.         <package name="com.chenyixin.ssm.pojo"/>
    12.     typeAliases>
    13.  
    14.     
    15.     <environments default="development">
    16.         <environment id="development">
    17.             <transactionManager type="JDBC"/>
    18.             <dataSource type="POOLED">
    19.                 <property name="driver" value="${jdbc.driver}"/>
    20.                 <property name="url" value="${jdbc.url}"/>
    21.                 <property name="username" value="${jdbc.username}"/>
    22.                 <property name="password" value="${jdbc.password}"/>
    23.             dataSource>
    24.         environment>
    25.  
    26.     environments>
    27.  
    28.     
    29.     <mappers>
    30.         
    31.         <package name="com.chenyixin.ssm.mapper"/>
    32.     mappers>
    33. configuration>

    数据库中的数据:

    1、模糊查询

     SpecialSQLMapper 接口:

    1. public interface SpecialSQLMapper {
    2. /**
    3. * 根据用户名含有 mohu 查询用户
    4. * @param mohu
    5. * @return
    6. */
    7. List getUserByMohu(@Param("mohu") String mohu);
    8. }

     SpecialSQLMapper.xml 配置文件:

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.chenyixin.ssm.mapper.SpecialSQLMapper">
    5. <select id="getUserByMohu" resultType="user">
    6. select * from t_user where username like "%"#{mohu}"%"
    7. select>
    8. mapper>

     测试类:

    1. public class SpecialSQLMapperTest {
    2. SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    3. SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
    4. @Test
    5. public void getUserByMohu() {
    6. List list = mapper.getUserByMohu("a");
    7. list.forEach(System.out::println);
    8. // User{id=15, username='admin', password='admin', age=20, gender='女', email='admin@qq.com'}
    9. // User{id=16, username='zhangsan', password='zhangsan', age=21, gender='女', email='zhangsan@qq.com'}
    10. }
    11. }

    2、批量删除

     SpecialSQLMapper 接口:

    1. /**
    2. * 根据 id 批量删除记录
    3. * @param ids 要删除的 id
    4. * @return 返回影响数据库的记录数
    5. */
    6. int deleteMore(@Param("ids") String ids);

      SpecialSQLMapper.xml 配置文件:

    1. <delete id="deleteMore" >
    2. delete from t_user where id in(${ids})
    3. delete>

    测试:

    1. @Test
    2. public void deleteMore() {
    3. int i = mapper.deleteMore("16,17");
    4. System.out.println(i); // 2
    5. }

     结果:

    3、动态设置表名

     SpecialSQLMapper 接口:

    1. /**
    2. * 动态设置表名,查询所有的用户信息
    3. * @param tableName 要查询的表名称
    4. * @return 返回所查询的表记录
    5. */
    6. List getAllUser(@Param("tableName") String tableName);

    SpecialSQLMapper.xml 配置文件:

    1. <select id="getAllUser" resultType="user">
    2. select * from ${tableName}
    3. select>

    测试:

    1. @Test
    2. public void getAllUser() {
    3. List t_user = mapper.getAllUser("t_user");
    4. t_user.forEach(System.out::println);
    5. // User{id=1, username='张三', password='123456', age=19, gender='男', email='123456@qq.com'}
    6. // User{id=3, username='李四', password='123', age=19, gender='男', email='123456@qq.com'}
    7. // User{id=13, username='王五', password='321', age=23, gender='女', email='321@qq.com'}
    8. // User{id=14, username='赵六', password='123456', age=null, gender='男', email='null'}
    9. // User{id=15, username='admin', password='admin', age=20, gender='女', email='admin@qq.com'}
    10. }

    4、添加功能获取自增的主键

    需求:获取当前添加记录的主键值

    SpecialSQLMapper 接口:

    1. /**
    2. * 添加用户信息
    3. * @param user 要添加的用户
    4. * @return 返回影响数据库的记录数
    5. */
    6. int insertUser(User user);

    SpecialSQLMapper.xml 配置文件:

    1. <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    2. insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
    3. insert>

    测试:

    1. @Test
    2. public void insertUser() {
    3. User user = new User(null, "xiaoming", "654321", 23, "男", "xiaoming@qq.com");
    4. mapper.insertUser(user);
    5. System.out.println(user);
    6. }

    结果:

    注意:

        useGeneratedKeys:设置使用自增的主键
         keyProperty:因为增删改有统一的返回值是受影响的行数,
         因此只能将获取的自增的主键放在传输的参数user对象的某个属性中

  • 相关阅读:
    侯捷C++复现 :explicit在构造函数中
    【练习赛】2022年高教杯数学建模C题(第一题的第一小问)
    【毕业季】青春散场,我们期待下一场的开幕
    汽车R155法规包含那些国家?
    MySQL访问方法
    LipidSearch 5.1
    layui.msg第一次弹出的提示很长
    一、基本remix环境及HelloWord contract《2022 solidity8.+ 版本教程到实战》
    初识二叉搜索树
    SKG 渠道中台借助 SAE + 大禹打造云原生 DevOPS,提效 60%
  • 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126305773