mybatis学习第三部分:Mybatis基本应⽤

3.1 快速⼊⻔

MyBatis官⽹地址:http://www.mybatis.org/mybatis-3/

 

3.1.1 开发步骤:

①添加MyBatis的坐标

②创建user数据表

③编写User实体类

④编写映射⽂件UserMapper.xml

⑤编写核⼼⽂件SqlMapConfig.xml

⑥编写测试类

3.1.1 环境搭建:

1)导⼊MyBatis的坐标和其他相关坐标

复制代码
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<!--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>
复制代码

2) 创建user数据表

复制代码
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `birthday` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'lucy', '123', '2019-12-12');
INSERT INTO `user` VALUES ('2', 'tom','123', '2019-12-12');
复制代码

 

 

3) 编写User实体

public class User { 
    private int id;
    private String username; private String password;
    //省略get个set⽅法
}

4)编写UserMapper映射⽂件

<?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="userMapper">
    <select id="findAll" resultType="com.lagou.domain.User">
         select * from User
    </select>
</mapper>

5) 编写MyBatis核⼼⽂件

复制代码
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN“ "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lagou/mapper/UserMapper.xml"/>
</mappers>
</configuration>
复制代码

6) 编写测试代码

复制代码
//加载核⼼配置⽂件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获得sqlSession⼯⼚对象
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执⾏sql语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印结果 System.out.println(userList);
//释放资源
sqlSession.close();
复制代码

3.1.4  MyBatis的增删改查操作

MyBatis的插⼊数据操作

1)编写UserMapper映射⽂件

<mapper namespace="userMapper">
<insert id="add" parameterType="com.lagou.domain.User"> insert into user values(#{id},#{username},#{password})
</insert>
</mapper>

2)编写插⼊实体User的代码

 

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession();
int insert = sqlSession.insert("userMapper.add", user); System.out.println(insert);
//提交事务
sqlSession.commit(); sqlSession.close();

3)插⼊操作注意问题

•插⼊语句使⽤insert标签

•在映射⽂件中使⽤parameterType属性指定要插⼊的数据类型

•Sql语句中使⽤#{实体属性名}⽅式引⽤实体中的属性值

 

•插⼊操作使⽤的API是sqlSession.insert(“命名空间.id”,实体对象);

•插⼊操作涉及数据库数据变化,所以要使⽤sqlSession对象显示的提交事务,即sqlSession.commit()

 

 

3.1.5  MyBatis的修改数据操作

1)编写UserMapper映射⽂件

<mapper namespace="userMapper">
<update id="update" parameterType="com.lagou.domain.User">
update user set username=#{username},password=#{password} where id=#
{id}
</update>
</mapper>

2)编写修改实体User的代码

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("userMapper.update", user); System.out.println(update); sqlSession.commit(); sqlSession.close();

3)修改操作注意问题

•修改语句使⽤update标签

 

•修改操作使⽤的API是sqlSession.update(“命名空间.id”,实体对象);

 

3.1.6  MyBatis的删除数据操作

1)编写UserMapper映射⽂件

<mapper namespace="userMapper">
<delete id="delete" parameterType="java.lang.Integer"> delete from user where id=#{id}
</delete>
</mapper>

2)编写删除数据的代码

 InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); S
qlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int delete = sqlSession.delete("userMapper.delete",3); System.out.println(delete); sqlSession.commit(); sqlSession.close();

3)删除操作注意问题

•删除语句使⽤delete标签

•Sql语句中使⽤#{任意字符串}⽅式引⽤传递的单个参数

 

•删除操作使⽤的API是sqlSession.delete(“命名空间.id”,Object);

 

3.1.7 MyBatis的映射⽂件概述

 

3.1.8 ⼊⻔核⼼配置⽂件分析:

 

MyBatis核⼼配置⽂件层级关系

 

 

3.1.9 MyBatis常⽤配置解析

1)environments标签

 

数据库环境的配置,⽀持多环境配置

 

 

其中,事务管理器(transactionManager)类型有两种:

•JDBC:这个配置就是直接使⽤了JDBC     的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作⽤域。

•MANAGED:这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣命周期(⽐如 JEE 应⽤服务器的上下⽂)。 默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因此需要将 closeConnection 属性设置为 false来阻⽌它默认的关闭⾏为。

其中,数据源(dataSource)类型有三种:

•UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。

•POOLED:这种数据源的实现利⽤“池”的概念将   JDBC  连接对象组织起来。

 

•JNDI:这个数据源的实现是为了能在如    EJB   或应⽤服务器这类容器中使⽤,容器可以集中或在外部配

置数据源,然后放置⼀个  JNDI  上下⽂的引⽤。

2)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"/>

3.1.10 Mybatis相应API介绍

 

SqlSession⼯⼚构建器SqlSessionFactoryBuilder 常⽤API:SqlSessionFactory build(InputStream inputStream)通过加载mybatis的核⼼⽂件的输⼊流的形式构建⼀个SqlSessionFactory对象

String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources ⼯具类,这个类在 org.apache.ibatis.io 包中。

Resources类帮助你从类路径下、⽂ 件系统或⼀个webURL中加载资源⽂件。

SqlSession⼯⼚对象SqlSessionFactory

SqlSessionFactory有多个个⽅法创建SqlSession实例。常⽤的有如下两个:

 

 

SqlSession会话对象

SqlSession实例在MyBatis中是⾮常强⼤的⼀个类。在这⾥你会看到所有执⾏语句、提交或回滚事务 和获取映射器实例的⽅法。

 

执⾏语句的⽅法主要有:

 

 

操作事务的⽅法主要有:

void commit() 
void rollback()

3.2MybatisDao层实现

3.2.1传统开发⽅式

 

编写UserDao接⼝

public interface UserDao {
    List<User> findAll() throws IOException;
}

编写UserDaoImpl实现

复制代码
public class UserDaoImpl implements UserDao {
    public List<User> findAll() throws IOException {
        InputStream resourceAsStream =
        Resources.getResourceAsStream("SqlMapConfig.xml");             
        SqlSessionFactory sqlSessionFactory = new
        SqlSessionFactoryBuilder().build(resourceAsStream); 
        SqlSession sqlSession = sqlSessionFactory.openSession(); 
        List<User> userList = 
        sqlSession.selectList("userMapper.findAll"); sqlSession.close();
        return userList;
  }
}
复制代码

测试传统⽅式

@Test
public void testTraditionDao() throws IOException { 
UserDao userDao = new UserDaoImpl(); List<User> all = userDao.findAll(); System.out.println(all); }

3.2.2代理开发⽅式

代理开发⽅式介绍

采⽤ Mybatis 的代理开发⽅式实现 DAO层的开发,这种⽅式是我们后⾯进⼊企业的主流。

Mapper接⼝开发⽅法只需要程序员编写Mapper接⼝(相当于Dao接⼝),由Mybatis框架根据接⼝定义创建接⼝的动态代理对象,代理对象的⽅法体同上边Dao接⼝实现类⽅法。

Mapper接⼝开发需要遵循以下规范:

1)  Mapper.xml⽂件中的namespacemapper接⼝的全限定名相同

2)  Mapper接⼝⽅法名和Mapper.xml中定义的每个statementid相同

3)  Mapper接⼝⽅法的输⼊参数类型和mapper.xml中定义的每个sqlparameterType的类型相同

 

4)  Mapper接⼝⽅法的输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同

编写UserMapper接⼝

 

 

测试代理⽅式

@Test
public void testProxyDao() throws IOException { InputStream resourceAsStream =
Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架⽣成的UserMapper接⼝的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findById(1);
System.out.println(user); sqlSession.close();
}

 

posted @   eagle88  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示