映射配置文件
映射配置文件介绍
查询功能
新增功能
修改功能
删除功能
总结
核心配置文件
核心配置文件介绍
数据库连接配置文件引入
注意事项:#{} 与${}有有什么区别
起别名
总结
映射配置文件包含了数据和对象之间的映射关系以及要执行的 SQL 语句
我们以之前的案例为例,里面的StudentMapper.xml如下图所示:
可分为3个部分
xml的文档标题
mybatis的DTD约束
引入之后,我们在写配置的时候,会给出相应的提示;如果输错了字母,则会根据约束报错!
mapper标签
mapper:核心根标签
namespace属性:名称空间
select:查询功能的标签
id属性:唯一标识
resultType属性:指定结果映射对象类型
parameterType属性:指定参数映射对象类型
resultType:使用标签里面的SQL语句查询出来的数据,封装到指定的对象中。
在上一节的基础上,我们可以再写一些功能,例如根据指定的id查询学生信息
其他的代码不动,我只要修改一下StudentMapper.xml和StudentTest
// 指定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 最核心的设置和属性信息。如数据库的连接、事务、连接池信息等。
MyBatisConfig.xml
简述如下
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标签引入外部文件
一定要放在src下,否则就不能直接这么写!
具体使用,如下配置
$ {} :是字符串替换
完整的MyBatiesConfig.xml文件如下
我也是初学者,博客写道这里才发现我自己好像不是很清楚,所以查了一下资料:
动态 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
:为全类名起别名的父标签。
:为全类名起别名的子标签。 属性
type:指定全类名
alias:指定别名
:为指定包下所有类起别名的子标签。(别名就是类名)
在MyBatis中,帮我们把一些常见的数据类型已经起好别名了!如下:
完整代码
在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}