Mybatis教程(一)
1 Mybatis教程(一)
学习过的持久层框架: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
<!-- 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.2MyBatis访问数据库代码
@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.2MyBatis访问数据库代码
@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.3Mysql自增返回
<!-- 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.4Mysql的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架构图
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<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开发规则
- 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<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(); } }
6 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>
Mybatis教程(一)的更多相关文章
- mybatis教程:入门>>精通>>实战
以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活.性能也比hibernate好.而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记.后来项 ...
- MyBatis教程目录
MyBatis教程目录 2017-10-18 摘自 YSOcean MyBatis教程目录: 1 mybatis 详解(一)------JDBC 2 mybatis 详解(二)------入门实例( ...
- SpringBoot系列之集成Mybatis教程
SpringBoot系列之集成Mybatis教程 环境准备:IDEA + maven 本博客通过例子的方式,介绍Springboot集成Mybatis的两种方法,一种是通过注解实现,一种是通过xml的 ...
- mybatis 教程(mybatis in action)
目录简介: 一:开发环境搭建二:以接口的方式编程 三:实现数据的增删改查 四:实现关联数据的查询 五:与spring3集成(附源码) 六:与Spring MVC 的集成 七:实现mybatis分页(源 ...
- MyBatis 教程 ——检视阅读
MyBatis 教程 --检视阅读 准备 官网文档-中文 教程地址yiibai,质量很差 教程地址w3cschool,纯理论,还不如直接看官网文档 教程地址Mybatis框架入门教程,Oracle M ...
- Mybatis教程-实战看这一篇就够了
转自:https://blog.csdn.net/hellozpc/article/details/80878563 1.从JDBC谈起 1.1.使用IDEA创建maven工程 1.2.引入mysql ...
- 14、MyBatis教程之全部(包括所有章节)
MyBatis 3.5.5 教程 1.环境准备 jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Juni ...
- 最简单的SpringBoot整合MyBatis教程
前面两篇文章和读者聊了Spring Boot中最简单的数据持久化方案JdbcTemplate,JdbcTemplate虽然简单,但是用的并不多,因为它没有MyBatis方便,在Spring+Sprin ...
- mybatis教程6(逆向工程)
什么是逆向工程 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类 ...
随机推荐
- hihocoder offer收割编程练习赛12 B 一面砖墙
思路: 就是求哪个长度出现的次数最多. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...
- iOS programming Delegation and Text Input
iOS programming Delegation and Text Input 1.1 Text Fields CGRect textFieldRect = CGRectMake(40, ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- js 动态添加表单 table tr
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 微信小程序中使用echarts
一.效果图 二.代码 import * as echarts from '../../component/ec-canvas/echarts'; const app = getApp(); var x ...
- webgl推荐书籍
网址:https://www.douban.com/doulist/45940373/ webgl 来自: Pasu2017-04-17创建 2017-07-25更新 推荐 关注 2 人关注 ...
- caffe实现自己的层
http://blog.csdn.net/xizero00/article/details/52529341 将这篇博客所讲进行了实现 1.LayerParameter也在caffe.proto文件中 ...
- Perl字符集[\d\D]表示任何字符(所有数字和非数字,包括换行符),“.”表示除了换行符以外的所有字符。
Perl字符集[\d\D]表示任何字符(所有数字和非数字,包括换行符),“.”表示除了换行符以外的所有字符.
- TX-LCN事务控制原理
TX-LCN由两大模块组成, TxClient.TxManager,TxClient作为模块的依赖框架,提供TX-LCN的标准支持,TxManager作为分布式事务的控制方.事务发起方或者参与方都由T ...
- JAVA基础——设计模式之装饰者模式
装饰模式 : 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装饰器中,用到的地方 ...