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

- 写pom.xml文件
 - 创建domain下的User
 - 创建dao下的IUserDao
 - 写SqlMapConfig.xml和IUSerDao.xml(逐级创建目录)
 - 放入log4j的配置文件
 
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);
    }
}
  <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);
        }
    }
- 增删改都有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>
- 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);
        }
    }
- 实体类属性和数据库列名不一致
 

 <!-- 设置属性名与列名的对应关系 -->
<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>
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;
    }
    @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);
    }
   @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;
    }

- debug mybatistest
 - sqlsession实现类,选择diagram,显示implements
 



  <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>
<?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、配置的更多相关文章
- Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入
		
Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...
 - 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
		
最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...
 - 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)
		
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...
 - SpringBoot启动流程分析(六):IoC容器依赖注入
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
 - 01-MyBatis启动流程分析
		
目录 MyBatis简单介绍 启动流程分析 简单总结 附录 MyBatis内置别名转换 参考 MyBatis简单介绍 MyBatis是一个持久层框架,使用简单,学习成本较低.可以执行自己手写的SQL语 ...
 - springboot 事务执行全流程分析
		
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
 - ios NSURLSession(iOS7后,取代NSURLConnection)使用说明及后台工作流程分析
		
NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...
 - Android7.0 Phone应用源码分析(一) phone拨号流程分析
		
1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...
 - HDFS2.x之RPC流程分析
		
HDFS2.x之RPC流程分析 1 概述 Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信.R ...
 - hadoop运行流程分析源代码级
		
前言: 最近一直在分析hadoop的运行流程,我们查阅了大量的资料,虽然从感性上对这个流程有了一个认识但是我总是感觉对mapreduce的运行还是没有一个全面的认识,所以决定从源代码级别对mapred ...
 
随机推荐
- Django 连接数据库 MySQL
			
一.Django 连接 MySQL 修改 settings.py 文件 # 默认用的是sqlite3 # Database # https://docs.djangoproject.com/en/4. ...
 - 3.使用nexus3配置maven私有仓库
			
配置之前,我们先来看看系统默认创建的都有哪些 其中圈起来的都是系统原有的,用不到,就全删掉,重新创建. 1,创建blob存储 2,创建hosted类型的maven 点击 Repository下面的 R ...
 - Fluentd部署:系统配置
			
Fluentd的全局配置项,诸如开启RPC.使用多worker模式等.可在配置文件中通过<system>进行配置,或通过命令行进行配置. 参数 workers:指定worker进程数,默认 ...
 - SQLyog企业版
			
一.下载与安装 1.SQLyog的下载 链接:https://www.aliyundrive.com/s/11ZuFqB1z4E提取码:63fu 2.SQLyog的安装 双击下载程序,可以选择默认安装 ...
 - 1_requests基础用法
			
requests模块的基本使用 什么是requests模块? Python中封装好的一个基于网络请求的模块 requests模块的作用? 用来模拟浏览器发请求 requests模块的环境安装: pip ...
 - js对象结构赋值const {XXX } =this
			
样例1: const { xxx } = this.state; 上面的写法是es6的写法,其实就相当于: const xxx = this.state.xxx 样例2: const {comment ...
 - CSP-J2020 洛谷P7072 直播获奖(Splay/桶排序)
			
题目描述 NOI2130 即将举行.为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线.本次竞赛的获奖率为 w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线. 更具体 ...
 - Spring bean装配流程和三级缓存
			
马士兵 源码方法论 不要忽略源码中的注释 先梳理脉络,再深入细节 大胆猜测.小心求证 见名知意 hold on 对源码有兴趣的都是变态 为了钱! Spring IoC Spring容器帮助管理对象,不 ...
 - 关于for循环当中发生强制类型转换的问题
			
Map map1 = new HashMap(); Map map2 = new HashMap(); Map map3 = new HashMap(); List<Map> list = ...
 - Mapper 实体转换Entiy to Dto
			
实际使用中发现很多问题 如果用EFcore 框架,这个表达式树生成一个新的实体导致EFcore 跟踪失败!/// <summary> /// 生成表达式目录树 泛型缓存 /// </ ...