首页 > 其他分享 >MyBatis细节注意

MyBatis细节注意

时间:2024-03-30 16:05:22浏览次数:27  
标签:salary name employee 细节 注意 SQL MyBatis id emp

1.参数占位符:${}#{}

  • #{}:占位符会将传入的值安全地转义,防止SQL注入攻击,它会在预编译阶段将占位符替换为一个问号 ?,然后通过PreparedStatement设置参数值,从而确保安全性。适用于实际参数值作为参数传递给SQL语句的情况,如表名、字段名、条件值等。

  • ${}:占位符会直接替换为参数值,不提供SQL注入防护,因为它直接将传入的值嵌入到SQL语句中。适用于需要将动态内容(如列名、排序方式等)插入到SQL语句中的情况。

举例说明:

假设我们有一个查询方法,通过MyBatis传递参数:

SELECT * FROM employee WHERE department = #{dept}

如果使用#{}

String department = "IT";
employeeMapper.getEmployeesByDepartment(department);

MyBatis会把这个参数转义处理,生成类似以下的SQL语句来避免SQL注入:

SELECT * FROM employee WHERE department = ?

如果使用${}

String sortBy = "name";
employeeMapper.getAllEmployeesOrderedBy(${sortBy});

${}方式拼接SQL语句会将${sortBy}替换为实际的参数值,可能导致SQL注入风险:

SELECT * FROM employee ORDER BY name

因此,一般来说,为了避免SQL注入等安全问题,推荐优先使用#{}占位符来传递参数值。

 2.resultType的使用

resultType = "全限定符 | 别名 | 如果是返回集合类型,写范型类型即可"

        1.全限定符

<select id="xxx" resultType="com.example.pojo.Xxx">
        xxx
    </select>

        2.别名为自定义类

                方式一:在配置typeAlias标签中声明类
<typeAlias type="com.example.pojo.Employee" alias="hahaha" />
<!-- 整个包下的类在使用时能直接使用 Bean 的首字母小写的非限定类名来作为它的别名-->
<select id="xxx" resultType="hahaha" >
        xxx
    </select>
                方式二:在配置typeAlias标签中声明包(更方便)
<typeAliases>
        <!-- 批量将包下的类给与别名,别名就是类的首字母小写! -->
        <package name="com.example.pojo"/>
    </typeAliases>
                方式三:直接在类中注解
@Alias("author")
public class Author {
    ...
}

         3.别名为常见的 Java 类型

<select id="xxx" resultType="_double">
        xxx
    </select>
别名映射的类型
_bytebyte
_char (since 3.5.10)char
_character (since 3.5.10)char
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
首字母改为小写其他

        4.集合类型

                1.有的情况下没有实体类可以使用接值的时候, 我们可以使用map接受数据!
        key - > 查询的列
        value -> 查询的值
<select id="xxx" resultType="map">
        xxx
    </select>
                2.返回值是集合。resultType不需要指定集合类型,只需要指定泛型即可
//查询工资高于传入值的员工姓名们 200
        List<String> queryNamesBySalary(Double salary);

 <select id="queryNamesBySalary" resultType="string">
        select emp_name from t_emp where emp_salary > #{ salary }
    </select>


//查询全部员工信息
        List<Employee> queryAll();

 <select id="queryAll" resultType="employee">
        select * from t_emp
    </select>

3.自增长主键回显

有时我们想要数据库自动增强的主键值怎么做

<insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
        insert into t_emp (emp_name,emp_salary)
        value(#{empName},#{empSalary});
</insert>
<!--例如员工插入时
            int insertEmp(Employee employee);
            useGeneratedKeys="true" 我们想要数据库自动增强的主键值
            keyColumn="emp_id" 主键列的值!!!
            keyProperty="empId" 接收主键列值的属性!!!-->

4.当非自增长的主键,如何交给mybatis帮助我们维护

    1.自己维护主键

String id = UUID.randomUUID().toString().replaceAll("-", "")
                employee.settId(id);

    2.mybatis维护

    <insert id="insertxxx">
        <!-- 插入之前,先指定一段sql语句,生成一个主键值!
             order="before|after" sql语句是在插入语句之前还是之后执行!
             resultType = 返回值类型
             keyProperty = 查询结果给哪个属性赋值

        -->
        <selectKey order="BEFORE" resultType="string" keyProperty="tId">
            SELECT  REPLACE(UUID(),'-','');
        </selectKey>

        INSERT INTO teacher (t_id,t_name)
        VALUE(#{tId},#{tName});
    </insert>

5.实体类属性和数据库字段名对应问题

    <select id="queryByNameAndSalary" resultType="Employee">
        select emp_id empId , emp_name empName , emp_salary empSalary
        from t_emp where emp_name = #{param1} and emp_salary = #{param2}
    </select>

能看出在查询时为了对应上实体类属性和数据库字段名,将查询结果列名映射为empId......了,那么还有其他办法吗?

        方案一:开启驼峰式映射

在mybatis配置文件下添加settings属性,数据库字段自动映射为驼峰式empId。

    <settings>
        <!--开启驼峰式自动映射 数据库 a_column->java aColumn -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

        方案二:使用resultMap自定义映射代替resultType自动映射

<resultMap id="employeeResultMap" type="Employee">
<!--id 为主键映射关系
    result 为普通列的映射关系-->
    <id column="emp_id" property="id" />
    <result column="emp_name" property="name" />
    <result column="emp_salary" property="salary" />
    <!-- Other mappings -->
</resultMap>
<select id="getEmployeeById" resultMap="employeeResultMap">
    SELECT emp_id, emp_name, emp_salary FROM employee WHERE emp_id = #{id}
</select>

6.让mybatis自动开启事务提交

在写插入语句时,要让sqlSession.commit()提交事务才能插入数据库。

//openSession自动开启事务,不会自动提交 !
//openSession(true)自动开启事务,自动提交事务!  不需要sqlSession.commit();
SqlSession session = sf.openSession(true);

标签:salary,name,employee,细节,注意,SQL,MyBatis,id,emp
From: https://blog.csdn.net/m0_61160520/article/details/137173558

相关文章

  • Capture One 23:光影魔术师,细节掌控者mac/win版
    CaptureOne23,不仅仅是一款摄影后期处理软件,它更是摄影师们的得力助手和创意伙伴。这款软件凭借其卓越的性能、丰富的功能和前沿的技术,为摄影师们带来了前所未有的影像处理体验。→→↓↓载CaptureOne23mac/win版CaptureOne23以其强大的色彩管理和光影调整能力,让摄影师们......
  • <商务世界>《第28课 商务旅行的注意事项》
    1选择人气旺的酒店酒店找一个旺气的地方。1是干净、整洁是最重要的。2是在选择酒店的时候尽量选择闹市,人口要集中的地方,这样入住率有保证,人多气场旺不至于发生一些灵异事件。而且人少屋多,也会让我们没有安全感。2避免无窗房酒店住房要尽量避免选择没有窗户或者窗户过小......
  • 程序员在平台兼职接单,月入30K,方法我全写出来了!(附接单渠道和注意事项)
    本月兼职的收入又到账了,程序员副业实在是太香了!虽然这点小钱还远远达不到财富自由,也比不上那些真正的大佬,但在这个行业寒冬里,能有一笔相对稳定的收入,作为全职之外的补充,还是让人倍感踏实的!今天我就掏心掏肺地跟大家讲一讲,平台接单的二三事,知无不言言无不尽!什么是程序员......
  • Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项
    企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽......
  • mysql之MyBatis核心工作原理
    MyBatis核心工作原理一、源码环境1.手动编译源码工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官网下载*gitclonehttps://github.co......
  • JavaSE_方法method 定义时的注意事项 案例分析
    在定义方法时,需要注意以下几个重要事项:1.**方法定义的位置**:方法不能定义在另一个方法内部。2.**方法名及参数列表**:确保方法名的拼写正确,并且参数列表也要准确无误。参数列表包括参数的类型、顺序和数量,这些都必须与方法调用时的实参匹配。3.**返回值类型**:如果方法声明......
  • Spring Boot整合MyBatis-Plus,并通过AutoGenerator生成项目骨架代码
    作为一名Java后端开发,日常工作中免不了要生成数据库表对应的持久化对象PO,操作数据库的接口DAO,以及CRUD的XML,也就是mapper。MybatisGenerator是MyBatis官方提供的一个代码生成工具,完全可以胜任这个工作,不过最近在开发项目的时候试用了一下MyBatis-Plus官方提供......
  • 在视频号上开小店,这些细节内容你知道吗?过来人经验分享!
    大家好,我是电商小布。现在有越来越多的小伙伴,看到了视频号小店的内部的发展机会,纷纷想要加入这个市场。但是不了解这个项目,在开店运营的时候都是无处下手的。这其中的一些细节内容一定要提前的了解清楚。接下来,小布就从三个方面,来带大家深入的了解一下这个项目。一、主体......
  • 温馨提示:不注意这几点,PDT(产品开发团队)就得散!
    在IPD(集成产品开发)体系中,PDT(ProductDevelopmentTeam,产品开发团队)发挥着至关重要的作用。PDT是一个跨部门、跨职能的协作团队,其成员来自不同的专业领域,包括研发、市场、销售、供应链等。从概念阶段到发布阶段,PDT都以跨部门的形式紧密协作,共同推进产品的研发和商业化过程。在PDT......
  • 宁波中墙建材教你如何选择合适的PC砖胎膜?安装需要注意哪些细节?
    宁波中墙建材教你如何选择合适的PC砖胎膜?安装需要注意哪些细节?选择合适的PC砖胎膜对于确保施工质量和工程的耐久性至关重要。PC砖胎膜是一种预制混凝土构件,用于建筑工程中的模板结构,特别是在地下室筏板的侧壁施工中。以下是如何选择合适的PC砖胎膜以及安装时需要注意的细节......