mybatis dao实现 || 接口代理方式实现

目录

    • 1、mybatis环境搭建
    • 2、mybatis dao接口实现
    • 3、动态代理方式,只实现Mapper接口

  • mybatis入门==单表操作demo
mybatis dao层实现1. 实现dao层接口
2. 接口代理方式实现dao代理开发要求:​	Mapper接口开发方法只需要编写Mapper接口(相当于dao接口),由mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体和dao方式实现的接口一样。1. mapper.xml 中namespace与mapper接口中全限定名相同
2. mapper接口方法名和mapper.xml中定义的每个statement的id相同
3. mapper接口方法入参类型,和 statement的paramType相同
4. mapper接口返回值类型,和statement的resultType相同

1、mybatis环境搭建

  • user-mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.bitqian.dao.UserMapper"><!-- resultType 引用别名user --><select id="queryAllUser" resultType="user">select * from users1</select><select id="queryUserByUserId" parameterType="int" resultType="user">select * from users1 where userid = #{id}</select></mapper>
  • mybatis-config.xml 核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="jdbc.properties"></properties><!-- user别名 --><typeAliases><typeAlias type="cn.bitqian.entity.User" alias="user"></typeAlias></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="cn\bitqian\mapper\user-mapper.xml"></mapper></mappers></configuration>

2、mybatis dao接口实现

  • 编写dao接口,同下面mapper接口
package cn.bitqian.dao;import cn.bitqian.entity.User;import java.io.IOException;
import java.util.List;/*** 注意 接口代理开发* 1. 接口类名与mapper中namespace对应* 2. 接口中方法名与statement中的id对应* 3. 接口中方法参数与statement中的parameterType对应* 4. 接口中方法返回值与statement中的resultType类型对应*/
public interface UserMapper {public List<User> queryAllUser() throws IOException;public User queryUserByUserId(int userId);}
  • dao接口实现
package cn.bitqian.dao.impl;import cn.bitqian.dao.UserMapper;
import cn.bitqian.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** 传统实现dao层接口 模板api* @author echo lovely* @date 2020/9/11 9:23*/
public class UserMapperImpl implements UserMapper {@Overridepublic List<User> queryAllUser() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();// namespace.idList<User> userList = sqlSession.selectList("cn.bitqian.dao.UserMapper.queryAllUser");sqlSession.close();return userList;}@Overridepublic User queryUserByUserId(int userId) {return null;}
}

3、动态代理方式,只实现Mapper接口

  • UserMapper 接口同上
优点分析:1. 只需实现mapper接口,定义对应的业务方法,注意接口名,
方法名,入参,返回的参数和mappers的配置一致2. 无需实现mapper接口,mybatis通过动态代理的方式进行实现了
只需用UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
getMapper api 来创建对象,进行数据库操作
package cn.bitqian.service;import cn.bitqian.dao.UserMapper;
import cn.bitqian.dao.impl.UserMapperImpl;
import cn.bitqian.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** @author echo lovely* @date 2020/9/11 9:29*/
public class DemoTest {public static void main(String[] args) {// 通过实现dao层接口UserMapper userMapper = new UserMapperImpl();try {System.out.println(userMapper.queryAllUser());} catch (IOException e) {e.printStackTrace();}// 编写mapper接口实现查询所有test1();// 根据id查询user对象test2();}private static UserMapper userMapper;static {try {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();// 使用getMapper api拿到接口对象,mybatis会通过动态代理进行底层实现userMapper = sqlSession.getMapper(UserMapper.class);} catch (IOException e) {e.printStackTrace();}}// 通过编写mapper接口实现查询static void test1() {try {List<User> userList = userMapper.queryAllUser();System.out.println(userList);} catch (IOException e) {e.printStackTrace();}}static void test2() {User user = userMapper.queryUserByUserId(1);System.out.println(user);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lvs-dr模式原理详解和可能存在的“假负载均衡”

原文地址&#xff1a; http://blog.csdn.net/lengzijian/article/details/8089661 lvs-dr模式原理 转载注明出处&#xff1a;http://blog.csdn.net/lengzijian/article/details/8089661 先附上一张原理图&#xff1a; 为了更清晰的表述lvs-dr原理&#xff0c;我们用tcpdump工具…

rem.js常用代码

rem.js (function flexible(window, document) {var docEl document.documentElement;var dpr window.devicePixelRatio || 1;// adjust body font size// 设置 em 默认字体所对应的大小function setBodyFontSize() {if (document.body) {document.body.style.fontSize 12 …

mybatis3 类型别名

目录问题描述解决方案方案二&#xff0c;直接扫描包问题描述 <!-- 插入操作 需要user参数 --><insert id"insertUser" parameterType"cn.bitqian.entity.User">insert into users1 values (#{userId}, #{userName}, #{userPassword})</inse…

vue-获取某个组件渲染的Dom根元素

function getComponentRootDom(comp, props){const vm new Vue({render: h > h(comp, {props})})vm.$mount();return vm.$el;}

动态sql (sql-if,sql-foreach)

目录1. UserMapper接口1. sql-if2. sql-foreach3. 多条件查询和根据多个id查询测试say sth.. 每当我回顾以前写jdbc分页&#xff0c;多条件查询时&#xff0c;我那是有多痛苦。 特别是当我拼接条件时&#xff0c;对象.getName 又是判断null&#xff0c;又是判断空字符串的。 还…

把一张合成图分拆出各个小图

反编译一个程序&#xff0c;看到一张合成图&#xff0c;想分拆出里面的每个小图&#xff0c;知道了各个图的坐标大小后&#xff0c;写了一个小方法&#xff0c;希望对大家有用哈 package com.bitimage;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStr…

6_js数组常用函数进阶与String

1 数组常用函数的应用 1.1 数组常用方法解析进阶 文档&#xff1a;const - JavaScript | MDN 课堂案例&#xff1a;01.find&Some方法的应用.html find() 从数组中找到满足条件的第一个元素并且并返回它。否则返回 undefined。 findIndex()*方法返回数组中满足提供的测试…

vue-快速原型开发

官方地址&#xff1a; https://cli.vuejs.org/zh/guide/prototyping.html

mybatis TypeHandler 类型处理器

目录1. 自定义日期类型处理器2. 配置自定义日期处理器3. 新增&#xff0c;查询1. 自定义日期类型处理器 继承mybatis提供的BaseTypeHandler覆写方法&#xff0c; 来转换Java和数据库中的字段package cn.bitqian.config;import org.apache.ibatis.type.BaseTypeHandler; import…

使用map递归树形结构

mapTree (data) {const reg /^e/;const regu /^u/;data.map(items > {if(items.children.length < 1){if(reg.test(items.userid)){items.disabled true //遍历树 拼入相应的disabled}else if(regu.test(items.userid)){items.children undefined }}else{this.mapTr…

分页查询插件PageHelper 5.x版本

目录1. jar包依赖2. mybatis核心文件配置3. 简简单单分页1. jar包依赖 <!--分页助手--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency&…

适用于ELment-UI级联多选框,数据回填,根据子节点的值查找完整路径

适用于ELment-UI级联多选框el-cascader&#xff0c;数据回填&#xff0c;根据子节点的值查找完整路径 已知子元素id,怎么获取它所有的父元素&#xff1f;用递归实现 /*** 查找匹配的完整路径* id: 匹配的值* data: 匹配的数组数据* prop: 匹配的字段名*/searchPath (id, …

多表操作查询 一对一

目录1. 一对一关系2. 一对一外键关联查询配置1. 一对一关系 数据库中的一对一关系 – 主键关联和外键关键 如person表和身份证表card 1、主键关联 create table person (pid int primary key auto_increment,pname varchar(40) not null,pgender varchar(10) not null )crea…

BZOJ-1045 糖果传递

先拆成链的情况来看。 设B[i]表示i要向i1拿糖果的数量&#xff0c;C为平均数&#xff0c;则B[i] C - A[i] B[i-1] Answer就是B的绝对值之和 现在来看环的情况&#xff0c;也就是说B[n]指的是n要向1拿糖果的数量。不妨设B[n]为K&#xff0c;则B[1] C - A[1] K………… 照着式…

一对多,多对多查询

1. 一对多配置 1. 什么是一对多 如用户表和订单表&#xff0c; 单个用户可能有多个订单&#xff0c;即一对多。如班级表和学生表 一个班级有多个学生&#xff0c;学生表的外键为 班级表的主键。如下面就是一对多&#xff0c;查询用户对应的订单配置 <?xml version"1…

优化JS代码的34种方法(上)

1. 含有多个条件的if语句 //longhand if(x abc || x def || x ghi || x jkl){//logic }//shorthand if([abc,def,ghi,jkl].includes(x)){//logic }2. if…else的缩写法 当我们在if-else条件下的逻辑比较简单时&#xff0c;我们可以使用三元条件运算符。 //longhand let …

稀疏表示

稀疏表示是近期几年信号处理领域的热点之中的一个&#xff0c;简单来说&#xff0c;它事实上是一种对原始信号的分解过程&#xff0c;该分解过程借助一个事先得到的字典&#xff08;也有人称之为过完备基&#xff0c;overcomplete basis&#xff0c;后面会介绍到&#xff09;&a…

一对一,一对多,多对多查询 (注解写法)

目录1、实体2、一对一3、一对多4、多对多5、测试核心&#xff1a; 一对一&#xff0c;注解&#xff1a;Select Results Result One 一对多 & 多对多&#xff0c;One改为Many共同的操作&#xff1a;查询多表时&#xff0c;先查一个表&#xff0c; 把这个实体属性作为查询条件…

Linux内核中影响tcp三次握手的一些协议配置

在Linux的发行版本中&#xff0c;都存在一个/proc/目录&#xff0c;有的也称它为Proc文件系统。在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数&#xff0c;它们可以通过 cat 工具进行读取&#xff0c;或使用 echo 命令进行修…

ssm整合 durid数据源 报错java.sql.SQLException: Access denied for user ‘xxx‘@‘localhost‘

目录1、报错原因2、如何解决1、报错原因 连接数据库账号密码错误… 但我在jdbc.properties中检查账号&#xff0c; 密码都是正确的呀&#xff0c;&#x1f623; drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis_study?serverTimezoneGMT usernamer…