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 ...
随机推荐
- 第二章:视图层 - 7:HttpResponse对象
类定义:class HttpResponse[source] HttpResponse类定义在django.http模块中. HttpRequest对象由Django自动创建,而HttpRespons ...
- Winsw将jar包部署为windows服务
1. 下载Winsw https://github.com/winsw/winsw/releases 下载winsw官网上的xml文件和.exe文件 2. 编辑配置文件 创建一个文件夹demo,将所需 ...
- 延申三大问题中的第一个问题处理---原先shell脚本中启动jar文件命令的配置,附加参数等
经过一系列的试错,最终采用的解决办法如下: 采用的配置文件 附加的启动参数 或者把这些都给统一添加到ConfigMap中
- 项目的依赖包(node_modules)删除
快速删除依赖包一共分为三部 1.打开命令行(管理员身份),执行 npm i -g npkill 2.cd 进入到想删除的项目中,执行 npkill 3.执行完成会进入到npkill页面,等待搜索完成, ...
- 了解Pytorch|Get Started with PyTorch
一个开源的机器学习框架,加速了从研究原型到生产部署的路径. !pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple import ...
- 洛谷P1725 琪露诺 (单调队列/堆优化DP)
显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...
- 220514 T1 查询 (二分查找+vector)
用vector记录每个数出现的位置,对于要查询的X,要找他落在L~R的个数有几个,用lower_bound和upper_bound查找,相减就是答案. 1 #include<bits/stdc+ ...
- Vue学习之--------计算属性(2022/7/9)
文章目录 1.计算属性 1.1 计算属性实现 1.1.1 基础知识 1.1.2 代码实例 1.1.3 测试效果 1.2 计算属性简写 1.2.1 简写代码 1.3 使用插值语法实现 1.3.1 代码实 ...
- 22.通用视图GenericAPIView、属性和方法
generics.ListCreateAPIView #源码 class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixi ...
- 实战进阶 Vue3+Axios+pinia
实战进阶 Vue3+Axios+pinia 创建文件utils/request.js import Axios from 'axios'; export const request = Axios.c ...