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

映射配置文件

映射配置文件介绍

查询功能

新增功能

修改功能

删除功能

总结

核心配置文件

核心配置文件介绍

数据库连接配置文件引入

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

起别名

总结


映射配置文件

映射配置文件介绍

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

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

可分为3个部分

xml的文档标题

<?xml version="1.0" encoding="UTF-8" ?>

mybatis的DTD约束

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

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

mapper标签

mapper:核心根标签

namespace属性:名称空间

select:查询功能的标签

id属性:唯一标识

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

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

<mapper namespace="StudentMapper">
    <select id="selectAll" resultType="com.itheima.bean.Student">
        SELECT * FROM student
    </select>
</mapper>

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

查询功能

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

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

<select id="selectById" resultType="com.itheima.bean.Student" parameterType="java.lang.Integer">
    SELECT * FROM student WHERE id = #{id}
</select>
// 指定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 id="insert" parameterType="com.itheima.bean.Student">
    INSERT INTO student VALUES (#{id},#{name},#{age})
</insert>
@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 id="update" parameterType="com.itheima.bean.Student">
    UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}
</update>

删除功能

// 删除
@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 id="delete" parameterType="java.lang.Integer">
    DELETE FROM student WHERE id = #{id}
</delete>

总结

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

核心配置文件

核心配置文件介绍

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

MyBatisConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration 核心根标签-->
<configuration>
    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost/db1"/>
                <property name="username" value="root"/>
                <property name="password" value="888888"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>

</configuration>

简述如下 

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标签引入外部文件

<!--引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>

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

具体使用,如下配置

$ {} :是字符串替换

<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />

完整的MyBatiesConfig.xml文件如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration 核心根标签-->
<configuration>

    <!-- 引入数据库连接的配置文件 -->
    <properties resource="jdbc.properties"/>
    
    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <!-- property获取数据库连接的配置信息 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>

</configuration>

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

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

动态 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

起别名

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

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

  • 属性

    type:指定全类名

    alias:指定别名

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

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

完整代码

MyBatisConfig.xml中加入

<!-- 起别名-->
<typeAliases>
    <typeAlias type="com.itheima.bean.Student" alias="student"></typeAlias>
</typeAliases>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration 核心根标签-->
<configuration>

    <!-- 引入数据库连接的配置文件 -->
    <properties resource="jdbc.properties"/>

    <!-- 起别名-->
    <typeAliases>
        <typeAlias type="com.itheima.bean.Student" alias="student"></typeAlias>
    </typeAliases>

    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <!-- property获取数据库连接的配置信息 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>

</configuration>

StudentMapper.xml

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

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

如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    mapper:核心根标签
    namespace属性:名称空间
-->
<mapper namespace="StudentMapper">
    <!--
    select:查询功能的标签
    id属性:唯一标识
    resultType属性:指定结果映射对象类型
    parameterType属性:指定参数映射对象类型
    -->
    <select id="selectAll" resultType="student">
        SELECT * FROM student
    </select>
    
    <select id="selectById" resultType="student" parameterType="int">
        SELECT * FROM student WHERE id = #{id}
    </select>

    <!--
        返回的是一个int类型的行数!所以可以省略resultType
        但是,SQL语句的参数id、name、age是从学生对象中来所以,要有parameterType
    -->
    <insert id="insert" parameterType="student">
        INSERT INTO student VALUES (#{id},#{name},#{age})
    </insert>

    <update id="update" parameterType="student">
        UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}
    </update>
    
    <delete id="delete" parameterType="int">
        DELETE FROM student WHERE id = #{id}
    </delete>
</mapper>




总结

posted @   金鳞踏雨  阅读(48)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示