今日内容
  • 回顾 mybatis的自定义、分析和环境搭建
  • 完善基于注解的mybatis
  • mybatis的curd(基于代理dao的方式)※
  • mybatis的参数深入及结果集的深入
  • mybatis中基于传统dao的方式(编写dao的实现类)--了解
  • mybatis中的配置(主配置文件:SqlMapConfig.xml)
    • properties标签
    • typeAliases标签
    • mappers标签
一、回顾
1、自定义mybatis的流程分析
2、基于注解的自定义再分析

3、实现查询所有功能
  • 写pom.xml文件
  • 创建domain下的User
  • 创建dao下的IUserDao
  • 写SqlMapConfig.xml和IUSerDao.xml(逐级创建目录)
  • 放入log4j的配置文件
二、CURD
1、保存操作
package com.itcast.test;
import com.itcast.dao.IUserDao;
import com.itcast.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; /**
* 测试mybatis的CURD操作
*/
public class MyBatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao; /**
* 在测试方法执行之前执行
* @throws IOException
*/
@Before
public void init() throws IOException {
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SQLSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
/**
* 释放资源
* 在测试方法之后执行
*/
@After
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
sqlSession.close();
in.close(); }
/**
* 测试查询所有
*/
@Test
public void findAll() throws IOException {
//5.执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
/**
* 测试保存操作
*/
@Test
public void testSave() {
User user = new User();
user.setUsername("刘金辉");
user.setAddress("山东省聊城市");
user.setSex("男");
user.setBirthday(new Date());
//5.执行保存方法
userDao.saveUser(user);
}
}
2、修改和删除操作
3、查询一个和模糊查询
4、(使用聚合函数)查询返回一行一列和占位符分析
三、mybatis的深入
1、模糊查询改写
  <select id="findByName" parameterType="String" resultType="com.itcast.domain.User">
<!-- select * from user where username like '#{username}'; -->
select * from user where username like '%${value}%';
</select> /**
* 模糊查询操作
*/
@Test
public void testFindByName() {
//5.执行删除方法
List<User> users = userDao.findByName("王");
for (User user : users) {
System.out.println(user);
}
}
2、获取保存数据的id
  • 增删改都有id,想要获取保存的id
 <insert id="saveUser" parameterType="com.itcast.domain.User">
<!-- 配置插入后,获取插入操作的id -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday});
</insert>
3、使用实体类的包装对象作为查询条件【传递pojo包装对象】
  • OGNL表达式:
    • Object Graphic Navigation Language对象图导航语言
    • 作用:通过对象的取值方法来获取数据,在写法上省略get
    • 如:获取用户名称
      • 类中写法:user.getUsername()
      • OGNL表达式写法:user.username
    • mybatis中可以直接写username,而不需要user.
      • 原因:在parameterType中已经提供了属性所属的类,不许写对象名,可以直接写属性名
package com.itcast.domain;

public class QueryVo {
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
} /**
* 根据queryVo中的条件查询用户
* @return
*/
List<User> findUserByVo(QueryVo vo); <!-- 根据queryVo的条件查询用户 -->
<!--根据名称模糊查询用户-->
<select id="findUserByVo" parameterType="com.itcast.domain.QueryVo" resultType="com.itcast.domain.User">
<!-- select * from user where username like '#{username}'; -->
select * from user where username like #{user.username};
</select> /**
* 测试使用QueryVo作为查询条件
*/
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("%刘%");
List<User> users = userDao.findUserByVo(vo);
for (User u : users) {
System.out.println(u);
}
}
4、调整实体类属性解决增和改方法的报错
  • 实体类属性和数据库列名不一致
 <!-- 设置属性名与列名的对应关系 -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
    • 解决方案
      • 起别名
      • 单独配置查询结果的列名和实体类的属性名之间的对应关系※
    <resultMap id="userMap" type="com.itcast.domain.User">
<!--主键字段的对应-->
<id property="id" column="id"></id>
<!--非主键字段的对应-->
<result property="username" column="username"></result>
<!--等-->
</resultMap>
<select id="findAll" resultMap="userMap">
select * from user;
</select>
四、编写DAO实现类
之前介绍的是使用代理dao方式,也可以自己实现dao
1、查询列表
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory; public UserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
} @Override
public List<User> findAll() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SQLSession中的方法实现查询列表
List<User> users = session.selectList("com.itcast.dao.IUserDao.findAll");//参数就是能获取配置信息的key
//3.释放资源
session.close();
return users;
}
2、保存操作
    @Override
public void saveUser(User user) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SQLSession中的方法实现查询列表
session.insert("com.itcast.dao.IUserDao.saveUser",user);
//3.提交事务
session.commit();
//4.关闭
session.close();
} /**
* 测试保存操作
*/
@Test
public void testSave() {
User user = new User();
user.setUsername("杨玉琼");
user.setAddress("云南省昭通市");
user.setSex("女");
user.setBirthday(new Date());
System.out.println("保存操作之前"+user);
//5.执行保存方法
userDao.saveUser(user);
System.out.println(user);
}
3、修改删除等其他操作
   @Override
public User findById(Integer userId) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SQLSession中的方法实现查询列表
User user = session.selectOne("com.itcast.dao.IUserDao.findById", userId);
//3.提交事务
session.commit();
//4.关闭
session.close();
return user;
} @Override
public List<User> findByName(String username) {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SQLSession中的方法实现查询列表
List<User> users = session.selectList("com.itcast.dao.IUserDao.findByName", username);
//3.提交事务
session.commit();
//4.关闭
session.close();
return users;
} @Override
public int findTotal() {
//1.根据factory获取SqlSession对象
SqlSession session = factory.openSession();
//2.调用SQLSession中的方法实现查询列表
Integer count = session.selectOne("com.itcast.dao.IUserDao.findTotal");
//3.提交事务
session.commit();
//4.关闭
session.close();
return count;
}
4、使用Dao实现类的执行过程分析-查询方法1
  • debug mybatistest
    • sqlsession实现类,选择diagram,显示implements
5、使用代理dao的方式
实际上实现dao的方法,所以不用再写dao实现类
五、标签使用
1、properties标签的使用及细节
支持写配置properties
        可以在标签内部配置连接数据库的信息
        也可以通过属性引用外部配置文件信息
        resource属性:
            用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在类路径下
            resource="jdbcConfig.properties"
        url属性:
            是要求按照url的写法来写地址
            URL:Uniform Resource Locator:统一资源定位符,可以唯一标识一个资源的位置
            写法:
                协议 主机 端口 URI
                http://localhost:8080/mybatisServer/demo1Servlet
                windows实际上就是使用了file协议,拖到浏览器file:///c:....
                不要写中文
            URI:Uniform Resource Identifier 统一资源标识符,可以在应用中唯一定位一个资源
  <properties resource="jdbcConfig.properties">
<!--<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>-->
</properties>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
2、typeAliases标签和package标签
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbcConfig.properties">
<!--<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>-->
</properties>
<!--使用typeAliases配置别名,只能配置domain中类的别名-->
<typeAliases>
<!--typeAliases配置别名,type指定全限定类名,alias指定别名,指定别名后不再区分大小写-->
<typeAlias type="com.itcast.domain.User" alias="user"></typeAlias>
<!--package用于指定要配置别名的包,当指定后,该报下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.itcast.domain.User"></package>
</typeAliases> <mappers>
<mapper resource="com/itcast/dao/IUserDao.xml"></mapper>
<!--用于指定dao接口所在的包,当指定完成之后就不需要再写mapper、resource或class了-->
<package name="com.itcast.dao"/>
</mappers>
</configuration>

MyBatis02:流程分析、注解、代理dao实现CRUD、参数深入、传统DAO、配置的更多相关文章

  1. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入

    Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...

  2. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...

  3. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

  4. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  5. 01-MyBatis启动流程分析

    目录 MyBatis简单介绍 启动流程分析 简单总结 附录 MyBatis内置别名转换 参考 MyBatis简单介绍 MyBatis是一个持久层框架,使用简单,学习成本较低.可以执行自己手写的SQL语 ...

  6. springboot 事务执行全流程分析

    springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...

  7. ios NSURLSession(iOS7后,取代NSURLConnection)使用说明及后台工作流程分析

    NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...

  8. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  9. HDFS2.x之RPC流程分析

    HDFS2.x之RPC流程分析 1 概述 Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信.R ...

  10. hadoop运行流程分析源代码级

    前言: 最近一直在分析hadoop的运行流程,我们查阅了大量的资料,虽然从感性上对这个流程有了一个认识但是我总是感觉对mapreduce的运行还是没有一个全面的认识,所以决定从源代码级别对mapred ...

随机推荐

  1. Elasticsearch中text与keyword的区别

    text类型 1:支持分词,全文检索,支持模糊.精确查询,不支持聚合,排序操作; 2:test类型的最大支持的字符长度无限制,适合大字段存储: 使用场景: 存储全文搜索数据, 例如: 邮箱内容.地址. ...

  2. EFK-4::ElasticSearch集群TLS加密通讯

    转载自:https://mp.weixin.qq.com/s?__biz=MzUyNzk0NTI4MQ==&mid=2247483822&idx=1&sn=6813b22eb5 ...

  3. SkyWalking 6.x 的架构图

    可以看到主要由四部分组成: Agent(也叫Probe):代理或者探针,集成在被监测的应用中(SDK形式或者动态注入),采集应用的数据发送给后端(OAP). UI:自带的Web页面. OAP:后端,接 ...

  4. Portainer实用教程

    Portainer使用 Nginx 容器实现端口转发 在 WordPress 部署完成后,需要在浏览器内输入 IP:端口或域名:端口 的形式访问网站,但我们一般访问应用的时候都是希望不加端口就能访问域 ...

  5. 第三周python作业

    import datetime mot = ["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择.", "今天星期二:\n含泪播种的人一定会笑着收." ...

  6. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  7. centos7系统资源限制整理

    概述 在linux系统使用过程中,默认的系统设置足够使用,但是对于一些高并发高性能的程序会有瓶颈存在,这些限制主要通过ulimit查看和修改. 环境 centos:CentOS  release 7. ...

  8. C++ 右值引用与一级指针

    将右值引用用于一级指针,在初始化时等号右边必须为右值,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * &&rrpa = &a; //右值 ...

  9. C# 基础 之:Task 用法

    参考来源:https://www.cnblogs.com/zhaoshujie/p/11082753.html 他介绍的可以说是非常详细,附带Demo例子讲解 1.入门 Task看起来像一个Threa ...

  10. AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。

    查表算法,无疑也是一种非常常用.有效而且快捷的算法,我们在很多算法的加速过程中都能看到他的影子,在图像处理中,尤其常用,比如我们常见的各种基于直方图的增强,可以说,在photoshop中的调整菜单里8 ...