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.xml和StudentTest
<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代表数据源的信息,其中type是POOLED指的是数据库连接池。
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中的#{}替换为?号,使用PreparedStatement的set方法来赋值;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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)