Mybati学习随笔01
# Mybatis框架
Mybatis框架概述
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
JDBC操作数据库
在没有Mybatis框架前,我们通过JDBC与数据库打交道我们有以下步骤
-
下载相关数据库的驱动,把jar包添加入项目中
-
加载驱动
-
通过驱动管理类获取数据库链接
-
定义sql语句并加入preparedStatement
-
查询出结果集
-
释放资源
public static void main(String[] args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置参数值
preparedStatement.setString(1, "王五");
//向数据库发出 sql 执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
System.out.println(resultSet.getString("id")+"
"+resultSet.getString("username"));
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
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();
}
}
}
} ahnvauzBU3+L
传统的JDBC直接操作数据库会有以下问题
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2.Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
3.使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护。
4.对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记 录封装成 pojo 对象解析比较方便。
使用Mybatis操作数据库就能轻松的完成查询数据库的目标
基于XML的Mybatis开发
-
创建maven工程,并在pom.xml文件下导入坐标
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.2</version> <scope>test</scope> </dependency> </dependencies>
-
编写学生类
public class Student { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
-
编写持久层Dao
public interface StudentDao { List<Student> findAll(); }
-
编写持久层接口的映射文件StudentDao.xml
注意:
这里创建的xml文件需要在resource下,并且文件目录结构要和java文件下dao的文件目录结构相同!!!
<?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="com.wjf.dao.StudentDao"> <!-- 配置sql语句,和结果集--> <select id="findAll" resultType="com.wjf.domain.Student"> select * from student; </select> </mapper>
-
在resource下编写数据库映射配置文件
<?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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<!-- 填写数据库连接相关信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/cnblog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mapper resource="com/wjf/dao/StudentDao.xml"/>
</mappers>
</configuration>
-
使用我们的dao接口查询
@Test public void func() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 SqlSession sqlSession = factory.openSession(); //4.使用SqlSession创建dao结果代理对象 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); //5.执行方法 List<Student> students = studentDao.findAll(); for (Student student:students) System.out.println(student); sqlSession.close(); in.close(); }
结果如下
现在我们发现用Mybatis比直接使用JDBC更方便一些,但任然有些复杂。
我们发现,在建立dao的映射xml文件的时候,需要严格依照原来dao的文件目录,并且在xml文件里边编写的东西有些繁杂。
Mybatis支持更加便捷的注解开发,可以为你省去这些步骤
基于注解的Mybatis开发
-
我们只需要在原来的dao接口的方法上写上对应注解,并且写上sql语句即可
public interface StudentDao { @Select("select * from student") List<Student> findAll(); }
-
同时在SqlMapConfig中稍作修改
<?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> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"/> <!-- 填写数据库连接相关信息--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/cnblog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123"/> </dataSource> </environment> </environments> <mappers> <!-- 修改部分--> <!-- 用注解来配置,此处应该使用class属性指定被注解的dao全限定类名 --> <mapper class="com.wjf.dao.StudentDao"/> </mappers> </configuration>
这样既可完成mybatis的注解模式开发
-