首页 > 其他分享 >mybatis学习第三部分:Mybatis基本应⽤

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

时间:2022-11-19 16:34:34浏览次数:75  
标签:xml MyBatis 第三 mybatis sqlSession resourceAsStream user 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();
}

 

标签:xml,MyBatis,第三,mybatis,sqlSession,resourceAsStream,user,Mybatis,编写
From: https://www.cnblogs.com/eagle888/p/16906347.html

相关文章

  • 代码随想录训练营第三十八天 | 动态规划
    今天是第三十八天,最难的动态规划要开始了 509.斐波那契数 classSolution{publicintfib(intn){if(n<2){returnn;}......
  • mybatis 之 sql语句写法集锦
    1、mapper接口中的方法存在批量数据操作,接口参数是List类型   在mybatis的xml文件中,使用foreach动态标签拼接SQL语句,每一条数据的更新语句对应一条update语句,......
  • 小知识点-第三讲
    享元模式:利用享元模式进行对象共享,从而提升系统性能(空间开销和创建创建开销)。在开发的过程中也经常使用此模式。 原理: 当一个应用中使用了大量的对象,这些对象造成了很大的......
  • mybatis源码解析1
    一、mybatis的简单使用根据mybatis官网提供的例子,需要这么几个步骤1、获取mybatis配置文件的输入流对象2、创建SqlSessionFactoryBuilder对象3、调用SqlSessionFactor......
  • MyBatisPlus 多数据源动态切换
    一、官方文档https://baomidou.com/pages/a61e1b/#%E6%96%87%E6%A1%A3-documentation二、操作步骤1、引入依赖版本号在下面 懒得单独复制了 一起贴出来了<!......
  • MyBatis练习(初)
    目录环境准备库,表idea准备题目一、简单查询环境准备MySQL,JDK17,Maven,MyBatis库,表库:CREATEDATABASEStuDB;学生表:Student(Sno,Sname,Ssex,Sage,Sdept)其中Sno为......
  • Mybatis中的${}和#{}区别(转载)
    动态sql是mybatis的主要特性之一,在mapper中定义的参数传到xml中之后,在查询之前,mybatis会对其进行动态解析。mybatis为我们提供了两种支持动态sql的语法:#{}以及......
  • Vue第三节
    目录4.通过axios实现数据请求4.2.1数据接口4.2.3ajax的使用4.2.4同源策略4.2.5ajax跨域(跨源)方案之CORS5.组件化开发5.1组件[component]5.1.1局部组件5.1.2默认组......
  • mybatis中公共字段的自动填充
    在需要自动填充的字段上添加注解@TableField@ApiModelProperty(value="创建时间")@TableField(fill=FieldFill.INSERT)privateDategmtCreate;@A......
  • 橙单低代码生成器 v2.6.1 发布,在线表单支持第三方框架接入
    橙单低代码生成器v2.6.1发布,在线表单支持第三方框架接入来源:投稿作者: Jerry40002022-11-1807:47:00 2新版功能在线表单,支持独立部署,可接入多个应......