MyBatis基础及基本使用

271 阅读4分钟

第一节

传统JDBC存在的问题

1.配置信息硬编码问题。有sql语句的硬编码和preparedstatement的硬编码问题(where条件的判断) preparedStatement
2.频繁创建数据库连接,造成资源浪费,影响性能。
3.在封装结果集的时候,代码较多,改变较大,不易维护。
代码:
//加载数据库驱动
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 name = ?"
//获取preparedstatement预处理对象
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第⼀个参数为sql语句中参数的序号(从1开始),第⼆个参数为设置的参数值
// 向数据库发出sql执⾏查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//释放资源
resultSet.close();
preparedStatement.close();
connection.close();

问题解决方案

 1.创建数据库连接池,从连接池中获取连接;
 2.使用配置文件的形式就行传参和数据源的配置等;
 3.使⽤反射、内省等底层技术,⾃动将实体与表进⾏属性与字段的⾃动映射(pojo对象)。

第二节

Mybatis的相关概念

 **对象/关系数据库的映射(orm)**
 ORM全称Object/Relation Mapping:对象-关系映射
 ORM完成⾯向对象的编程语⾔到关系数据库的映射。当ORM框架完成映射后,程序员既可以利⽤⾯向
 对象程序设计语⾔的简单易⽤性,⼜可以利⽤关系数据库的技术优势。ORM把关系数据库包装成⾯向对
 象的模型。ORM框架是⾯向对象设计语⾔与关系数据库发展不同步时的中间解决⽅案。采⽤ORM框架
 后,应⽤程序不再直接访问底层数据库,⽽是以⾯向对象的⽅式来操作持久化对象,⽽ORM框架则将这
 些⾯向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象(pojo)的保存、修改、删除
 等操作,转换为对数据库的操作。
 POJO:(Plain Old Java Objects,普通⽼式Java对象。
 优点:MyBatis是⼀款优秀的基于ORM的半⾃动轻量级持久层框架,它⽀持定制化SQL、存储过程以及⾼级映射。
 

第三节

MyBatis快速入门

  创建工程
  

image.png

  导入相关依赖
  <dependencies>
    <!--mybatis坐标-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!--mysql驱动坐标-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
        <scope>runtime</scope>
    </dependency>
    <!--单元测试坐标-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!--⽇志坐标-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>
  创建数据库表和相关实体类   

image.png

  创建配置文件SqlMapConfig.xml和UserMapper.xml

image.png

进行测试:
`//1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流
 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
 //2.构建者模式,解析了配置文件,并创建了sqlSessionFactory工厂
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
 //3.工厂模式生产sqlSession
 SqlSession sqlSession = sqlSessionFactory.openSession();// 默认开启一个事务,但是该事务不会自动提交
 //在进行增删改操作时,要手动提交事务
 //4.sqlSession调用方法:查询所有selectList  查询单个:selectOne 添加:insert  修改:update 删除:delete
 List<User> users = sqlSession.selectList("user.findAll");
 for (User user : users) {
     System.out.println(user);
 }
 //关闭资源
 sqlSession.close();`

image.png

**增删改**

image.png

image.png

**注意事项**
1.插⼊操作使⽤的API是sqlSession.insert(“命名空间.id”,实体对象),并且在映射⽂件中使⽤parameterType属性指定要插⼊的数据类型;
2.修改操作使⽤的API是sqlSession.update(“命名空间.id”,实体对象);
3.删除操作使⽤的API是sqlSession.delete(“命名空间.id”,Object);
4.必须要手动提交事务,sqlsession.commit()。

第四节

核心配置文件和映射配置文件

**映射配置文件**
namespace: 名称空间:与id组成sql的唯一标识
resultType:表明返回值类型
parameterType:参数类型
mapper为根标签
if标签用法
<select id="findByCondition" parameterType="user" resultType="user">
     select * from User
     <where>
     <if test="id!=0">
     and id=#{id}
     </if>
     <if test="username!=null">
     and username=#{username}
     </if>
     </where>
</select>
foreach标签用法
<select id="findByIds" parameterType="list" resultType="user">
     select * from User
     <where>
     <foreach collection="list" open="id in(" close=")" item="id"
    separator=",">
     #{id}
     </foreach>
     </where>
</select>

image.png

**核心配置文件**
层级关系:

image.png

enviroments标签

image.png

其中,事务管理器(transactionManager)类型有两种:
•JDBC:这个配置就是直接使⽤了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作
⽤域。
•MANAGED:这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣
命周期(⽐如 JEE 应⽤服务器的上下⽂)。 默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因
此需要将 closeConnection 属性设置为 false 来阻⽌它默认的关闭⾏为。
其中,数据源(dataSource)类型有三种:
•UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
•POOLED:这种数据源的实现利⽤“池”的概念将 JDBC 连接对象组织起来。•JNDI:这个数据源的实现是为了能在如 EJB 或应⽤服务器这类容器中使⽤,容器可以集中或在外部配
置数据源,然后放置⼀个 JNDI 上下⽂的引⽤。

mapper标签
•使⽤相对于类路径的资源引⽤,如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
•使⽤完全限定资源定位符(URL),如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
•使⽤映射器接⼝实现类的完全限定类名,如:
<mapper class="org.mybatis.builder.AuthorMapper"/>
•将包内的映射器接⼝实现全部注册为映射器,如:
<package name="org.mybatis.builder"/>