MyBatis第一章

学习过的持久层框架:DBUtils , Hibernate

Mybatis就是类似于hibernate的orm持久层框架。

为什么学Mybatis?

  1. 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。
  2. Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。
  3. sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。

JDBC编程回顾与存在的问题分析

2.1 开发步骤:

  1. 导入数据脚本,在课前资料中有
  2. 创建工程,导入mysql jar包
  3. 编码
  4. //加载数据库驱动
  5. //创建数据库连接
  6. //创建statement
  7. //设置sql语句
  8. //设置查询参数
  9. //执行查询,得到ResultSet
  10. //解析结果集ResultSet
  11. //释放资源

2.2 Jdbc访问数据库的过程:

2.3 Jdbc存在的问题:

  1. 频繁创建和打开、关闭数据连接,太消耗资源
  2. Sql语句存在硬编码,不利于维护
  3. Sql参数设置硬编码,不利于维护
  4. 结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象

Mybatis介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

Mybatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给mybatis去完成。

Mybaits入门

4.1 需求列表

根据用户ID查询用户信息

根据用户名查找用户列表

添加用户

修改用户

删除用户

4.2 工程搭建

  1. 导入依赖jar包,在课前资源中有
  2. 配置SqlMapConfig.xml,可参考课前资料
  3. 配置log4j.properties,可参考课前资料
  4. 在课前资料复制pojo到工程目录下
  5. 配置sql查询的映射文件,可参考课前资料
  6. 加载映射文件

4.3 完成需求

4.3.1 需求完成步骤

  1. 编写sql语句
  2. 配置user映射文件
  3. 编写测试程序

4.3.2 根据用户ID查询用户信息

4.3.2.1  映射文件与sql

<!-- id:statementId

resultType:查询结果集的数据类型

parameterType:查询的入参

-->

<select id="getUserById" parameterType="int" resultType="com.itheima.mybatis.pojo.User" >

SELECT * FROM USER WHERE id = #{id1}

</select>

4.3.2.2  MyBatis访问数据库代码

@Test

public void testGetUserByid() throws IOException {

// 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();

// 查找配置文件创建输入流

InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

// 加载配置文件,创建SqlSessionFactory对象

SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);

// 创建SqlSession对象

SqlSession sqlSession = sqlSessionFactory.openSession();

// 执行查询,参数一:要查询的statementId ,参数二:sql语句入参

User user = sqlSession.selectOne("user.getUserById", 1);

// 输出查询结果

System.out.println(user);

// 释放资源

sqlSession.close();

}

4.3.3 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程

/**

* SqlSessionFactory工具类

*

* @author Steven

*

*/

public class SqlSessionFactoryUtils {

/**

* 单例SqlSessionFactory

*/

private static SqlSessionFactory sqlSessionFactory;

static {

// 创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();

try {

// 查找配置文件创建输入流

InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

// 加载配置文件,创建SqlSessionFactory对象

sqlSessionFactory = sfb.build(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 获取单例SqlSessionFactory

* @return

*/

public static SqlSessionFactory getSqlSessionFactory() {

return sqlSessionFactory;

}

}

4.3.4 根据用户名查找用户列表

4.3.4.1 映射文件与sql

<!-- resultType:如果要返回数据集合,只需设定为每一个元素的数据类型 -->

<select id="getUserByName" parameterType="string" resultType="com.itheima.mybatis.pojo.User">

<!-- SELECT * FROM USER WHERE username LIKE #{name} -->

SELECT * FROM USER WHERE username LIKE ‘%${value}%‘

</select>

4.3.4.2 MyBatis访问数据库代码

@Test

public void getUserByName() {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

//List<User> users = sqlSession.selectList("user.getUserByName", "%张%");

List<User> users = sqlSession.selectList("user.getUserByName", "张");

for (User user : users) {

System.out.println(user);

}

// 释放资源

sqlSession.close();

}

4.3.5 添加用户

4.3.5.1 映射文件与sql

<insert id="insertUser" parameterType="com.itheima.mybatis.pojo.User">

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`)

VALUES (#{username},

#{birthday},

#{sex},

#{address});

</insert>

4.3.5.2 MyBatis访问数据库代码

@Test

public void testInsertUser() throws IOException {

// 创建SqlSession对象

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

User user = new User();

user.setUsername("张飞");

user.setAddress("深圳市黑马");

user.setBirthday(new Date());

user.setSex("1");

// 执行插入

sqlSession.insert("user.insertUser", user);

// 提交事务

sqlSession.commit();

// 释放资源

sqlSession.close();

}

4.3.5.3 Mysql自增返回

<!-- useGeneratedKeys:标识插入使用自增id

keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性

-->

<insert id="insertUserKey" parameterType="com.itheima.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">

<!-- selectKey:用于配置主键返回

keyProperty:要绑定的pojo属性

resultType:属性数据类型

order:指定什么时候执行,AFTER之后

-->

<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">

SELECT LAST_INSERT_ID()

</selectKey> -->

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`,

`uuid2`)

VALUES (#{username},

#{birthday},

#{sex},

#{address},

#{uuid2});

</insert>

4.3.5.4 Mysql的uuid返回主键

注:在使用uuid之前数据库user表要先加上uuid2字段、user的pojo也要加上相应属性

<!-- useGeneratedKeys:标识插入使用自增id

keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性

-->

<insert id="insertUserUUID" parameterType="com.itheima.mybatis.pojo.User">

<!-- selectKey:用于配置主键返回

keyProperty:要绑定的pojo属性

resultType:属性数据类型

order:指定什么时候执行,BEFORE之前

-->

<selectKey keyProperty="uuid2" resultType="string" order="BEFORE">

SELECT UUID()

</selectKey>

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`,

`uuid2`)

VALUES (#{username},

#{birthday},

#{sex},

#{address},

#{uuid2});

</insert>

4.3.6 修改用户

<update id="updateUser" parameterType="com.itheima.mybatis.pojo.User">

UPDATE USER SET username = #{username} WHERE id = #{id}

</update>

4.3.7 删除用户

<delete id="deleteUser" parameterType="int">

DELETE FROM `user` WHERE `id` = #{id1}

</delete>

4.4 Mybatis入门小结与Mybatis架构图

Mybatis Dao开发方式

5.1 Dao需求

根据用户ID查询用户信息

根据用户名查找用户列表

添加用户

5.2 原始Dao开发方法

5.2.1 使用原有的user映射文件,不需修改

5.2.2 新建个UserDao接口

public interface UserDao {

/**根据用户ID查询用户信息

* @param id

* @return

*/

User getUserById(Integer id);

/**

* 根据用户名查找用户列表

* @param name

* @return

*/

List<User> getUserByUserName(String name);

/**

* 添加用户

* @param user

*/

void insertUser(User user);

}

5.2.3 新建个UserDaoImpl接口实现类

public class UserDaoImpl implements UserDao {

@Override

public User getUserById(Integer id) {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

User user = sqlSession.selectOne("user.getUserById", id);

sqlSession.close();

return user;

}

@Override

public List<User> getUserByUserName(String name) {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

List<User> list = sqlSession.selectList("user.getUserByName", name);

sqlSession.close();

return list;

}

@Override

public void insertUser(User user) {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

sqlSession.insert("user.insertUser", user);

sqlSession.commit();

sqlSession.close();

}

}

5.2.4 使用dao测试

public class UserDaoTest {

@Test

public void testGetUserById() {

UserDao userDao = new UserDaoImpl();

User user = userDao.getUserById(30);

System.out.println(user);

}

@Test

public void testGetUserByUserName() {

UserDao userDao = new UserDaoImpl();

List<User> list = userDao.getUserByUserName("张");

for (User user : list) {

System.out.println(user);

}

}

@Test

public void testInsertUser() {

UserDao userDao = new UserDaoImpl();

User user = new User();

user.setUsername("张飞3");

user.setAddress("深圳市黑马");

user.setBirthday(new Date());

user.setSex("1");

userDao.insertUser(user);

}

}

5.3 官方推荐,接口动态代理

5.3.1 动态代理dao开发规则

  1. namespace必需是接口的全路径名
  2. 接口的方法名必需与映射文件的sql id一致
  3. 接口的输入参数必需与映射文件的parameterType类型一致
  4. 接口的返回类型必须与映射文件的resultType类型一致
  5. 创建UserMapper.xml映射文件(把原来的user.xml复制按开发规则要求修改一下)
  6. 创建UserMapper接口(把原来的UserDao.java复制按开发规则要求修改一下)
  7. 加载UserMapper.xml

5.3.2 动态代理dao开发步骤

  1. 测试动态代理Dao

 

public class UserMapperTest {

@Test

public void testGetUserById() {

// 加载配置得到SqlSession

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

// 获取代理对象

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 查询数据

User user = userMapper.getUserById(30);

System.out.println(user);

// 关闭资源

sqlSession.close();

}

@Test

public void testGetUserByUserName() {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

// 获取代理对象

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 查询数据

List<User> list = userMapper.getUserByName("张");

for (User user : list) {

System.out.println(user);

}

// 关闭资源

sqlSession.close();

}

@Test

public void testInsertUser() {

SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

User user = new User();

user.setUsername("张飞飞");

user.setAddress("深圳市黑马");

user.setBirthday(new Date());

user.setSex("1");

userMapper.insertUser(user);

// 提交事务

sqlSession.commit();

// 关闭资源

sqlSession.close();

}

}

SqlMapConf.xml配置

6.1 properties

6.1.1 属性核心文件配置

<!-- 加载规则,首先加载标签内部属性,再加载外部文件,名称相同时,会替换相同名称的内容 -->

<properties resource="jdbc.properties">

<property name="jdbc.username" value="root1"/>

<property name="jdbc.password" value="root"/>

</properties>

6.1.2 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8

jdbc.username=root

jdbc.password=root

6.2 typeAliases

mybatis默认支持java基本数据类型的别名识别详细参考教案。

自定义别名

<typeAliases>

<!-- 单个别名定义 -->

<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->

<!-- 别名包扫描器(推荐使用此方式),整个包下的类都被定义别名,别名为类名,不区分大小写-->

<package name="com.itheima.mybatis.pojo"/>

</typeAliases>

6.3 mappers

<mappers>

<!-- 第一种方式,加载 resource-->

<mapper resource="mapper/user.xml"/>

<!-- <mapper resource="mapper/UserMapper.xml"/> -->

<!-- 第二种方式,class扫描器要求:

1、映射文件与接口同一目录下

2、映射文件名必需与接口文件名称一致

-->

<!-- <mapper class="com.itheima.mybatis.mapper.UserMapper"/> -->

<!-- 第三种方式,包扫描器要求(推荐使用此方式):

1、映射文件与接口同一目录下

2、映射文件名必需与接口文件名称一致

-->

<package name="com.itheima.mybatis.mapper"/>

</mappers>

原文地址:https://www.cnblogs.com/ServletGo/p/9851605.html

时间: 2024-10-11 06:29:28

MyBatis第一章的相关文章

Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Java数据持久化层(persistencelayer)的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互. MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建.MyBatis 3 是iBATIS的全新设计,支持注解和Mapper

2017.2.20 activiti实战--第一章--认识Activiti

学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis 2.原生支持spring,可以轻松集成spring 3.引擎的Service接口 Activiti引擎提供了7大Service接口,均通过processEngine获取,支持链式API风格. Service接口 作用 RepositoryService 流程仓库服务,管理流程仓库,比如部署.删除.读取流程资源

第一章 第一个spring boot程序

环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(jdk6也可以,可能需要额外配置,没试过,官方推荐jdk8) maven至少使用3.2 1.首先进入一个文件夹,例如"~/Desktop/project",然后按照"第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合"

C#认证第一章1 题 11题

C#第一章第一题 C#认证第一章  11题

计算机网络安全第一章

计算机网络不安全因素:偶发因素.自然因素.认为因素(被动攻击.主动攻击.邻近攻击.内部人员攻击.分发攻击) 不安全的主要原因: 1.互联网具有不安全性:开放的网络,国际性的网络,自由性的网络 2.操作系统存在的安全问题:操作系统软件自身的不安全性,留下"后门".操作 系统体系结构造成的不安全隐患.操作系统可以创建进程.操作系统的无口令入口及隐蔽通道 3.数据安全问题 4.传输线路安全问题 5.网络应用存在的安全问题 6.网络安全管理问题 计算机网络安全是一门涉及计算机科学.网络技术.通

第一章读后感

第一章主要讲述了安卓系统的一些基本知识,安卓系统的架构以及如何查看Linux内核版本和其定义的规则. Android的体系结构主要由Linux内核.C/C++代码库.Android SDK API和应用程序四层构成,因此,Android和linux的核心部分差异非常的小:而且Android SDK API 是由Java语言编写的. 安卓移植在很大程度上是Linux内核移植主要就是移植驱动程序. 怎样学习Linux驱动开发呢,由于Linux的内核版本更新较快,每一次内核的变化就意味着Linux驱动

《大道至简》第一章读后感

经常听见有人抱怨编程太难,说自己不是学软件的料,那么他们真该好好看看<大道至简>这本书,相信他们看完这本书后会有很大收获. <大道至简>第一章引用了一个很简单的故事“愚公移山”,用这个故事很好的概述了我们在完成一个项目时所要进行的步骤.听上去“愚公移山”和编程简直是风马牛不相及,但是看过作者的叙述又有原来如此的感觉.其实编程并没有什么难懂的,就和我们日常生活一样,发现问题,分析问题,提出解决问题的方案,实施,和后续的验收.例如某天我们突然发现家里放不出水了,这就是发现问题,我们会观

读《大道至简》第一章有感

近期老师为我们推荐了一本书,叫做<大道至简>,书很薄,却精辟的讲述了软件工程专业对于编程这一实践过程的重要思想,我们总以为编程是怎样的有难度,却从来没有考虑过编程为什么难,他到底难在哪.事实是我们错了,我们不是不会技术,而是不会方法. 第一章主要讲述了编程的精义,作者利用愚公移山的故事,简洁明了的讲解了编程的实质含义,从愚公移山实施的各个方面与编程联系在一起,讲解了编程的过程.从开始的原因,到编程实现的目标,然后小组团队对这个编程项目的讨论,以及各个人员在不同项目上的安排,并且还有项目之外的协

C++ Primer快速学习 第一章 入门

很多人说C++Primer不适合于入门,本系列入门文章向大家证明了:这是一个谎言. 第一章 入门 本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表 达式.语句和函数. 1.1. 编写简单的 C++ 程序 每个 C++ 程序都包含一个或多个 函数 ,而且必须有一个命名为 main.函数 由执行函数功能的语句序列组成.操作系统通过调用 main 函数来执行程序, main 函数则执行组成自己的语句并返回一个值给操作系统. 下面是一个简单的 main 函数,它不执行任何功能,只是