• MyBatis学习:使用占位符#


    1、本篇博客的背景和目的

    目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,稍详细介绍了MyBatis框架,初步建立了一个使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和INSERT语句手动提交事务。本篇博客记录一下MyBatis中#占位符的使用。

    2、我的上一篇博文

    我上一篇博文记录的是STDOUT_LOGGING日志和事务,感兴趣的读者可以前往阅读,链接如下:MyBatis学习:MyBatis中简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务_你是我的日月星河的博客-CSDN博客目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,稍详细介绍了MyBatis框架,初步建立了一个使用MyBatis和MySQL的Maven项目。本篇博文记录一下简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务。...https://blog.csdn.net/weixin_46281472/article/details/125934432

    3、为什么要使用占位符

    比方说我们有这样的一个场景:新用户注册。我们需要将用户注册的用户名和密码写到数据库中。那么就需要执行Insert语句。但是用户名和密码是用户提供的,需要从前端获得用户提供的用户名和密码,然后我们再写入到数据库中。

    那么在我们的Insert语句中,用户名和密码就作为了参数。这两个参数就来自新用户,程序在先前肯定是不知道的,也就是说SQL语句不能写死,因为要插入的数据不确定是什么。

    所以这时候就使用到了占位符:我们将获得的用户名和密码替换掉我们在XML配置文件中的SQL里面的占位符的位置。

    4、java实体类Student代码(可以类比用户类)

    代码如下所示:

    1. package com.dcy.domain;
    2. public class Student {
    3. //这里我们的属性名和数据库表中的列名保持一致,如果不一致的话我们需要在mapper.XML文件中配置或者是使用注解配置
    4. private Integer id;
    5. private String name;
    6. private String email;
    7. private Integer age;
    8. public Integer getId() {
    9. return id;
    10. }
    11. public void setId(Integer id) {
    12. this.id = id;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public String getEmail() {
    21. return email;
    22. }
    23. public void setEmail(String email) {
    24. this.email = email;
    25. }
    26. public Integer getAge() {
    27. return age;
    28. }
    29. public void setAge(Integer age) {
    30. this.age = age;
    31. }
    32. @Override
    33. public String toString() {
    34. return "一个学生实体的信息{" +
    35. "id=" + id +
    36. ", name='" + name + '\'' +
    37. ", email='" + email + '\'' +
    38. ", age=" + age +
    39. '}';
    40. }
    41. }

    上面实体类的代码比较简单,我不多解释了。

    5、mapper.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.dcy.dao.StudentDao">
    5. <select id="selectStudentById" resultType="com.dcy.domain.Student">
    6. select id,name,email,age from student where id=#{studentId}
    7. select>
    8. <insert id="insertStudent">
    9. insert into student values (#{id},#{name},#{email},#{age})
    10. insert>
    11. mapper>

    上面的代码主要是最后的一个insert标签,里面使用的属性都是Student实体java类中的属性。

    注意看里面的注释,不多解释了。

    6、Main方法测试代码

    代码如下:

    1. package com.dcy;
    2. import com.dcy.domain.Student;
    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. import java.io.IOException;
    8. import java.io.InputStream;
    9. public class Starter {
    10. public static void main(String[] args) throws IOException {
    11. /*
    12. myBatis的核心类是SqlSessionFactory
    13. 就是需要我们加载一下主配置文件,有点像我们使用SpringMVC加载spring.xml配置文件或者BeanFactory对象一样。
    14. 这些在官网是有的。
    15. */
    16. //定义主配置文件的目录,从类路径开始:com/**/**这样的,如果是在resources目录下,那就是 **/**/
    17. String config="mybatis.xml";
    18. //下面读取主配置文件,使用MyBatis框架中的Resources类
    19. InputStream inputStream = Resources.getResourceAsStream(config);
    20. //下面创建SqlSessionFactory对象,使用的是SqlSessionFactoryBuilder类,需要用到上面的inputStream参数
    21. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    22. //MyBatis最终执行SQL语句,使用的是SqlSession类中的方法。SqlSession实例的获得,依靠的是SqlSessionFactory类。
    23. //下面获取SqlSession对象,SqlSession是接口
    24. SqlSession session = sqlSessionFactory.openSession();
    25. //指定要执行的SQL语句的id
    26. //SQL语句的id=namespace+"."+SQL语句所在标签的id属性的值
    27. String SQLID="com.dcy.dao.StudentDao"+"."+"insertStudent";
    28. //通过SqlSession对象的方法执行SQL语句
    29. // Student student = session.selectOne(SQLID); //这个是没有使用占位符,没有传参的
    30. Student student=new Student();
    31. student.setId(1006);
    32. student.setAge(24);
    33. student.setEmail("luoluo.163.com");
    34. student.setName("洛洛");
    35. Integer row=session.insert(SQLID,student);//将一个java对象传过去
    36. session.commit();//提交一下事务
    37. System.out.println("影响的行数是"+row);
    38. //最后我们关闭SqlSession对象
    39. session.close();
    40. }
    41. }

    调用insert方法,将SQL语句的“地址”和需要插入的数据:一个java对象 传过去即可。

    最后可以顺利插入数据。

    7、总结一下

    如果传入给MyBatis的是一个java对象,mapper.XML文件  使用 #{属性名} 获取此属性的值,属性值会放到 #{ }占位符的位置。 MyBatis在背后执行的是这个属性对应的get()方法

    所以,多说一下吧:实体类的set()和get()方法是必须有的,我有一次做项目就是一个实体类忘记了写get()方法,导致使用MyBatis框架出现问题,调试了很久,都是经验啊!!!很多框架内部都是要使用到set()和get()方法的。

    8、我的下一篇博文

  • 相关阅读:
    【项目】实现一个mini的tcmalloc(高并发内存池)
    【最全】linux服务器上安装Mysql
    配配网:什么是流通盘,流通盘的相关知识内容是什么
    Linux多线程编程实例解析
    微服务项目:尚融宝(32)(后端搭建:会员列表搭建(3))
    ABAP 计算时间差
    SpringCloud 使用与Nacos
    Mongodb数据库
    [目录]HTML CSS JS
    Leetcode_Weekly_310
  • 原文地址:https://blog.csdn.net/weixin_46281472/article/details/126004776