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

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

为什么学Mybatis?

目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。

Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。

sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。

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

2.1 开发步骤:

导入数据脚本,在课前资料中有

创建工程,导入mysql jar包

编码

//加载数据库驱动

//创建数据库连接

//创建statement

//设置sql语句

//设置查询参数

//执行查询,得到ResultSet

//解析结果集ResultSet

//释放资源

2.2 Jdbc访问数据库的过程:

2.3 Jdbc存在的问题:

频繁创建和打开、关闭数据连接,太消耗资源

Sql语句存在硬编码,不利于维护

Sql参数设置硬编码,不利于维护

结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象

3 Mybatis介绍

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

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

4 Mybaits入门

4.1 需求列表

根据用户ID查询用户信息

根据用户名查找用户列表

添加用户

修改用户

删除用户

4.2 工程搭建

导入依赖jar包,在课前资源中有

配置SqlMapConfig.xml,可参考课前资料

配置log4j.properties,可参考课前资料

在课前资料复制pojo到工程目录下

配置sql查询的映射文件,可参考课前资料

加载映射文件

4.3 完成需求

4.3.1 需求完成步骤

编写sql语句

配置user映射文件

编写测试程序

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

4.3.2.1 映射文件与sql

SELECT * FROM USER WHERE id = #{id1}

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

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

4.3.4.2 MyBatis访问数据库代码

@Test

public void getUserByName() {

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

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

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

for (User user : users) {

System.out.println(user);

}

// 释放资源

sqlSession.close();

}

4.3.5 添加用户

4.3.5.1 映射文件与sql

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`)

VALUES (#{username},

#{birthday},

#{sex},

#{address});

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自增返回

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`,

`uuid2`)

VALUES (#{username},

#{birthday},

#{sex},

#{address},

#{uuid2});

4.3.5.4 Mysql的uuid返回主键

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

SELECT UUID()

INSERT INTO USER

(`username`,

`birthday`,

`sex`,

`address`,

`uuid2`)

VALUES (#{username},

#{birthday},

#{sex},

#{address},

#{uuid2});

4.3.6 修改用户

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

4.3.7 删除用户

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

4.4 Mybatis入门小结与Mybatis架构图

5 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 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 getUserByUserName(String name) {

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

List 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 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开发规则

namespace必需是接口的全路径名

接口的方法名必需与映射文件的sql id一致

接口的输入参数必需与映射文件的parameterType类型一致

接口的返回类型必须与映射文件的resultType类型一致

创建UserMapper.xml映射文件(把原来的user.xml复制按开发规则要求修改一下)

创建UserMapper接口(把原来的UserDao.java复制按开发规则要求修改一下)

加载UserMapper.xml

5.3.2 动态代理dao开发步骤

测试动态代理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 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();

}

}

6 SqlMapConf.xml配置

6.1 properties

6.1.1 属性核心文件配置

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基本数据类型的别名识别详细参考教案。

自定义别名

6.3 mappers

y2第一章 初始mybatis的上机3_MyBatis第一章相关推荐

  1. y2第一章 初始mybatis的上机3_MyBatis3.2.x从入门到精通之第一章

    第一章 一.引言 mybatis是一个持久层框架,是apache下的顶级项目.mybatis托管到goolecode下,再后来托管到github下.(百度百科有解释) 二.概述 mybatis让程序将 ...

  2. 第一章初始mybatis框架

    mybatis框架 ORM: 常见的ORM框架: ----认识MyBatis: ----开发步骤: ----认识配置文件: ---认识映射文件: -----加载映射文件: ORM: ORM(Objec ...

  3. 入门篇 第1章 初始Python

    入门篇 第1章 初始Python 入门篇 第1章  初始Python 1.1  Pyhton 概述 1.1.1 了解 Python Python,本义是指"蟒蛇".1989年,荷兰 ...

  4. 零基础学Python--------入门篇 第1章 初始Python

    入门篇 第1章  初始Python 1.1  Pyhton 概述 1.1.1 了解 Python Python,本义是指"蟒蛇".1989年,荷兰人Guido van Rossum ...

  5. python学习之第一课时--初始python

    python学习之第一课时--初始python Python前世今世 python是什么 python是一门多种用途的编程语言,时常在扮演脚本语言的角色 python流行原因 软件质量 提高开发者效率 ...

  6. 第章量子计算机产业,又一个世界第一,九章量子计算机诞生,中国战斗机智能空战不是梦...

    原标题:又一个世界第一,九章量子计算机诞生,中国战斗机智能空战不是梦 近日,中国新型量子计算机"九章"( 76个光子的量子计算原型机)的诞生,引发了热议,因为其先进程度远超大家的想 ...

  7. C#苹果应用开发——第一讲初始Xamarin

     C#苹果应用开发--第一讲初始Xamarin Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发 观看地址:v.youku.com/v_show/id_XNzEwOTYzNjU ...

  8. C#苹果应用开发——第一讲初始Xamarin Xamarin ios 教程 Xamarin跨平台开发

    C#苹果应用开发--第一讲初始Xamarin   Xamarin ios 教程 Xamarin跨平台开发 C#苹果应用开发 教程观看地址:v.youku.com/v_show/id_XNzA3OTUx ...

  9. 第一章c语言基础知识答案,第一章 C语言的基础知识练习题

    第一章 C语言的基础知识练习题 第一章 C语言的基础知识 第一节 对C语言的初步认识 习题 1. 下列叙述中错误的是 B A)任何一个C程序都必须有且仅有一个main函数,C语言总是从main函数开始 ...

  10. 《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言...

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.1节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 预备 ...

最新文章

  1. 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  2. java 月份起止时间_java已知时间的本周,本月,本年的起始时间
  3. oracle字符串转in方法,Oracle 逗号分割的字符串转换为可放入in的语句
  4. reg 只能导入二进制注册文件
  5. 如何开始学习以太坊及区块链
  6. 建造者模式(Builder Pattern)(转自TerryLee)
  7. log4j控制台乱码解决办法
  8. django 学习-7 模型数据操作
  9. JDK动态代理的实现原理
  10. syslog函数输出在哪个文件中_syslog服务详解
  11. 分享几个设计精美电路图的工具
  12. 威廉 哈特 史密斯《当你抚触》
  13. git 上查找一行代码的提交记录
  14. 修改tomcat 发布war大小限制
  15. Project0:小游戏
  16. Python爬虫:爬取网页图片
  17. 华为nova7se怎么看云相册_华为nova7如何开启云空间
  18. 大型高并发高负载网站的系统架构[转载]
  19. 打破双亲委派的几种方式
  20. WIN7 iTunes无法识别iPhone,重装系统解决

热门文章

  1. MySQL中用给出的生日查询年龄的方法
  2. 树莓派+英特尔神经网络计算棒
  3. postman “header“:{“retCode“:“999999“
  4. FRP内网穿透访问家中的NAS和路由器后台
  5. 阿里云云解析DNS各种概念深度剖析
  6. 记一次使用npm命令报错
  7. linux 设置色彩深度,wayland显示服务器,怎么把色彩深度设置成24位
  8. 启科量子在2022全球数字经济大会量子信息技术与应用论坛公布量子计算机工程化进展
  9. luogu P5336 [THUSC2016]成绩单
  10. windows7 旗舰版 集成 usb3.0 NVMe 支持 AM4