Mybatis-映射配置文件、核心配置文件

映射配置文件

映射配置文件介绍

查询功能

新增功能

修改功能

删除功能

总结

核心配置文件

核心配置文件介绍

数据库连接配置文件引入

注意事项:#{} 与${}有有什么区别

起别名

总结


映射配置文件

映射配置文件介绍

映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句

我们以之前的案例为例,里面的StudentMapper.xml如下图所示:

Mybatis-映射配置文件、核心配置文件_第1张图片

可分为3个部分

xml的文档标题

mybatis的DTD约束

引入之后,我们在写配置的时候,会给出相应的提示;如果输错了字母,则会根据约束报错

mapper标签

mapper:核心根标签

namespace属性:名称空间

select:查询功能的标签

id属性:唯一标识

resultType属性:指定结果映射对象类型

parameterType属性:指定参数映射对象类型


    

resultType:使用标签里面的SQL语句查询出来的数据,封装到指定的对象中。

查询功能

在上一节的基础上,我们可以再写一些功能,例如根据指定的id查询学生信息

其他的代码不动,我只要修改一下StudentMapper.xmlStudentTest

// 指定id查询
@Test
public void selectById() throws IOException {
    InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Student stu = sqlSession.selectOne("StudentMapper.selectById", 1);
    System.out.println(stu);
    sqlSession.close();
    is.close();
}

注意: 

  • 属性

    id:唯一标识, 配合名称空间使用。

    parameterType:指定参数映射的对象类型。

    resultType:指定结果映射的对象类型。

  • SQL 获取参数: #{属性名}

新增功能

与上述查询功能在,xml参数的使用其实没有什么区别,这里直接给出代码,大家自行阅读。


    INSERT INTO student VALUES (#{id},#{name},#{age})
@Test
public void insert() throws IOException {
    InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Student stu = new Student(3,"王五",46);
    int insert = sqlSession.insert("StudentMapper.insert", stu);
    //提交事务
    sqlSession.commit();
    System.out.println(insert);
    sqlSession.close();
    is.close();
}

注意:

需要提交事务!在使用openSession()方法的时候没有指定boolean类型的参数,即默认是false,就是此时是手动提交事务的方式,所以一定要使用sqlSession.commit()才算是真正执行成功!!

当然也可以把openSession()的参数设置为true,就不用调用commit()手动提交了!

修改功能

// update
@Test
public void update() throws IOException {
    InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Student stu = new Student(4,"张八",100);
    int result = sqlSession.update("StudentMapper.update", stu);
    //提交事务
    sqlSession.commit();
    System.out.println(result);
    sqlSession.close();
    is.close();
}

    UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}

删除功能

// 删除
@Test
public void delete() throws IOException {
    InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    int result = sqlSession.delete("StudentMapper.delete",4);
    //提交事务
    sqlSession.commit();
    System.out.println(result);
    sqlSession.close();
    is.close();
}

    DELETE FROM student WHERE id = #{id}

总结

可以发现crud操作,除了标签名称以及sql语句不一样之外,其他属性参数基本一致。

Mybatis-映射配置文件、核心配置文件_第2张图片

核心配置文件

核心配置文件介绍

核心配置文件包含了 MyBatis 最核心设置属性信息。如数据库的连接、事务、连接池信息等。

MyBatisConfig.xml






    
    
        
        
            
            
            
            
                
                
                
                
            
        
    
    
    
    
        
        
    

简述如下 

configuration是核心根标签

environments是用来配置数据库环境的,环境可以有多个,其中default属性是用来指定使用哪一个。

environment是用来配置数据库环境的,id属性是其唯一标识。上面的default属性值使用哪一个id就代表用哪一个数据库环境。

transactionManager代表事务管理。type属性是JDBC说明是采用JDBC默认的事务处理。

dataSource代表数据源的信息,其中typePOOLED指的是数据库连接池。

property获取数据库连接的配置信息。

mappers、mapper引入指定的配置文件,resource属性指定映射配置文件的名称。

数据库连接配置文件引入

在实际开发中,数据库连接信息不能在MyBatisConfig.xml中写“死”了,这样子不利于项目后期的维护,应该使用一个properties文件将配置信息存于其中!

我们在src项目下创建一个jdbc.properties的文件

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/db1
username=root
password=888888

properties标签引入外部文件


一定要放在src下,否则就不能直接这么写! 

具体使用,如下配置

$ {} :是字符串替换





完整的MyBatiesConfig.xml文件如下







    
    
    
    
    
        
        
            
            
            
            
                
                
                
                
                
            
        
    

    
    
        
        
    



注意事项:#{} 与${}有有什么区别

我也是初学者,博客写道这里才发现我自己好像不是很清楚,所以查了一下资料:

动态 sql 是 MyBatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 MyBatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}

#{}是预编译处理,$ {}是字符串替换

下面是我查到的资料,据说面试好像经常问!

  • MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatementset方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值
  • 使用 #{} 可以有效的防止SQL注入,提高系统安全性。

要理解记忆这个题目,我觉得要抓住两点

(1)$ 符号一般用来当作占位符,常使用Linux脚本的同学应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。

(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。在某些特殊场合下只能用${},不能用#{}。

例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法

#{}和${}的区别是什么? - JustJavaIt - 博客园 (cnblogs.com)https://www.cnblogs.com/liaowenhui/p/12217959.html

起别名

  • :为全类名起别名的父标签

  • :为全类名起别名的子标签

  • 属性

    type:指定全类名

    alias:指定别名

  • :为指定包下所有类起别名的子标签。(别名就是类名)

在MyBatis中,帮我们把一些常见的数据类型已经起好别名了!如下:

Mybatis-映射配置文件、核心配置文件_第3张图片

完整代码

MyBatisConfig.xml中加入



    






    
    

    
    
        
    

    
    
        
        
            
            
            
            
                
                
                
                
                
            
        
    

    
    
        
        
    



StudentMapper.xml

我们在核心配置文件中将com.itheima.bean.Student起别名为student

还有Mybatis自己给常用数据类型起的别名java.lang.Integer -> int

如下所示:





    
    
    
    

    
    
        INSERT INTO student VALUES (#{id},#{name},#{age})
    

    
        UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}
    
    
    
        DELETE FROM student WHERE id = #{id}
    





总结

Mybatis-映射配置文件、核心配置文件_第4张图片

你可能感兴趣的:(Mybatis,Java全栈学习笔记,java,mybatis,映射配置,核心配置,xml)