1.什么是ORM?
ORM即对象关系映射(Object-Relationl Mapping),它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 对象一样操作它就可以了 。
-------------------------------------------------------------------
创建 maven 项目:
1.在 pom.xml 中引入 jar 包。
<!-- mybatis框架包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
2.创建 mybatis-config.xml主配置文件
3.将 database.properties 文件放入 resources 下
4.在 mybatis-config.xml 读取 database.properties
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入properties文件-->
<properties resource="database.properties"></properties>
<environments default="smbms">
<environment id="smbms">
<!--配置事务信息 采用JDBC方式进行事务管理-->
<transactionManager type="JDBC"/>
<!--数据源信息-->
<!--
type属性、其有三种取值:
POOLED:使用Mybatis自带的数据库连接池来管理数据库连接
UNPOOLED:不使用任何数据库连接池来管理数据库连接
JNDI:jndi形式使用数据库连接、主要用于项目正常使用的时候
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--读取mapper文件-->
<mappers>
<mapper resource="mappers/ProviderMapper.xml"/>
</mappers>
</configuration>
5.创建com.hz.pojo并复制Provider.java
6.创建DAO接口
7.在resources下创建mappers文件夹,并创建ProviderMapper.xml
8.编写mapper文件 实现findProviderById(Integer id);方法
<?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">
<!--
id 方法名
parameterType 参数类型
resultType 返回值类型
-->
<mapper namespace="com.hz.dao.ProviderDao">
<select id="findProviderById" parameterType="Long" resultType="com.hz.pojo.Provider">
select * from smbms_provider where id = ${id}
</select>
</mapper>
9.在主配置文件中读取mapper文件
<mappers>
<mapper resource="mappers/ProviderMapper.xml" />
</mappers>
10.创建测试类 并编写代码
try {
//读取主配置文件 返回流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSession工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建sqlSession
/**
* true 自动提交事务 (默认)
* false 关闭自动提交
*/
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获得ProviderDao实例
ProviderDao providerDao = sqlSession.getMapper(ProviderDao.class);
Provider provider = providerDao.findProviderById(2L);
System.out.println(provider.toString());
sqlSession.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
---------------------------------------------------------------------------------
mapper.xml的SQL语句中的占位符${}和#{}
- #{ }:会将其替换为?,为了防止SQL注入
- ${ }:拼sql,会存在SQL注入问题
- 使用时机:
- 参数传递的时候用:#{ }
- 表名或者列名不固定的情况下:${ }
一般会采用#{},#{}在mybatis中,最后会被解析为?,其实就是Jdbc的PreparedStatement中的?占位符,它有预编译的过程,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入,如果parameterType属性指定的入参类型是简单类型的话(简单类型指的是8种java原始类型再加一个String),#{}中的变量名可以任意,如果入参类型是pojo,比如是Student类
public class Student{
private String name;
private Integer age;
//setter/getter
}
那么#{name}表示取入参对象Student中的name属性,#{age}表示取age属性,这个过程是通过反射来做的,这不同于${},${}取对象的属性使用的是OGNL(Object Graph Navigation Language)表达式