MyBatis基础环境搭建(使用idea,meven)
文章目录
1.MyBatis 简介
作为持久层的框架,还有一个封装程度更高的框架就是Hibernate,但这个框架因为各种原因目前在国内的
流行程度下降太多,现在公司开发也越来越少使用。目前使用 Spring Data 来实现数据持久化也是一种趋势。
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,
而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中
sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我
们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
2.分析JDBC 编程的中存在的问题
2.1.原生态JDBC程序代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test
{
public static void main(String[] args)
{
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try
{
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
//3、定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//4、获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "admin");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while (resultSet.next())
{
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
//8、释放资源
if (resultSet != null)
{
try
{
resultSet.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (preparedStatement != null)
{
try
{
preparedStatement.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
2.2、JDBC问题总结
(1)数据库连接频繁开启和关闭,会严重影响数据库的性能。
(2)代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。
3.Mybatis框架开发的准备
jar包下载地址 :mybatis-x.x.x.jar
这里使用 Maven 来构建项目,在 pom.xml 文件中添加 Mybatis的坐标
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
</dependencies>
3.1.编写User实体类
//为实体类添加get,set方法以及重新toString方法等等,来自lombok jar
@Data
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
}
3.2.编写持久层接口UserMapper
UserMapper 接口就是我们的持久层接口(也可以写成 UserDao)
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
}
3.3.编写持久层接口的映射文件UserMapper.xml
映射文件一般存放位置有两个:
- 直接放在dao包内,因为也是持久化相关的
这样放会出现一种问题,idea不会将源代码包下的其他类型文件编译,执行时就会抛出找不到Mapper.xml文件的异常
解决方案:在pom.xml文件中添加一段代码如下:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
作用就是将src/main/java目录下的所有文件夹及子文件夹的所有xml文件统统编译到classes目录下
-
放在resources资源文件夹,这种方式不会出现之前的问题,因为资源文件夹下编译资源文件很合理啊,
注意:创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml
注意:在resources中建包一定不能使用一下方式
到文件资源管理器中你会发现,它变成了一个文件夹
正确建包方式应该为
结果
有人可能会问变成一个文件夹会怎么样,首先违背了你一开始的意愿,所以编译后这个包就和它原本应该在的位置分道扬镳了
你一开始想要的长这样
结果却是这样
代码
<?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">
<!--namespace 写对应接口的全限定类名-->
<mapper namespace="com.liao.mapper.UserMapper">
<!--id 写对应接口的对应方法名称,resultType 写返回类型的全限定类名-->
<select id="findAll" resultType="com.liao.pojo.User">
select * from user
</select>
</mapper>
3.4.编写MyBatis的全局配置文件
<?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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC"/>
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper resource="com.liao.mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.5.编写测试类
public class MybatisTest {
@Test
public void m1() throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//6.使用代理对象执行查询所有方法
List<User> users = userMapper.findAll();
for (User user : users) {
System.out.println(user);
}
//7.释放资源
session.close();
in.close();
}
}
4.小结
通过快速入门示例,使用 mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照
mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc 方便多了。(我们使用注解之后,将变得 更为简单,只需要编写一个 mybatis 配置文件就够了。)
5.基于注解的mybatis使用(入门)
5.1.在持久层接口中添加注解
public interface UserMapper {
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
List<User> findAll();
}
5.2.修改 mybatis-config.xml
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper class="com.liao.dao.UserMapper"/>
</mappers>
5.3.注意事项
在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(UserMapper.xml)。