Mybatis(1)---入门篇单表查询

1.Mybatis介绍

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2.Mybatis配置

1.创建工程配置pom.xml

首先在idea中创建Maven工程,构建好项目后会在项目的根目录发现一个叫做pom.xml的配置文件。
以下是pom.xml的配置
ps: 记得导入jar包哟

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.test</groupId><artifactId>day03_mybatis_many2many</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency></dependencies></project>

2. 创建全局配置文件SqlMapConfig.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 可以在该标签内配置连接数据库的信息,也可以通过属性引用外部配置文件信息resources属性 用于指定配置文件的位置,是按照类路径写法来写的,且必须存在于类路径下。url属性 是按照url的写法来写的 file:///c://xxx/xxx 类似这样--><properties resource="JDBC.properties"><!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->  <!--这种写法就是在标签内直接配置--><!--使用 resource属性这种的就是引用外部的配置文件 这里是用resource下的JDBC.properties文件--></properties><!--typeAliases 是取别名  typeAlias是为type属性的取一个alias中的别名--><typeAliases><!--        <typeAlias type="com.test.domain.User" alias="user"></typeAlias>--><!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写--><package name="com.test.domain"/></typeAliases><!--配置环境--><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"> <!--连接池配置  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="com/test/Dao/IUserDao.xml"></mapper> --><!-- 这里的package标签是用于指定dao接口的所在的包,当指定了之后就不需要再写mapper及其他的属性resource 或者 class --><package name="com.test.Dao"/></mappers></configuration>

在标签properties里可以导入外部的配置文件也可以直接用property标签进行设置属性,这边本人建议使用外部导入的配置文件 导入配置文件可以用url 属性或是resource属性 我建议用resource属性,因为把文件放入resources文件夹下的话,使用resource属性只需要写文件名就行了。

typeAliases标签可以设置别名,就是在一些sql标签中如果没有设置别名 ,在引入该类的时候就要写全限定类名,这样针对开发来说是比较麻烦的。typeAliases标签下的typeAlias标签的功能是设置别名的,type是要要设置别名的全限定类名,alias是别名。但是typeAliases标签有有个package标签 ,这个标签用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。强烈推荐使用package。

environments标签是用来配置sql环境的

<!--mybatis的主配置文件-->
<configuration><!--配置环境--><environments default="mysql"><!--配置mysql环境--><environment id="mysql"><!--配置事务类型--><transactionManager type="JDBC"></transactionManager><!--配置数据源(连接池)--><dataSource type="POOLED"> <!--连接池配置  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>

enviroment标签中的id属性的值要与environments标签中的default属性一致

mappers标签是用来指定映射配置文件的位置 , 映射配置文件指的是每个dao独立的配置文件

mappers标签下的mapper标签是用来映射配置文件的 ,resource用来映射dao的配置文件的位置 (这种是采用xml配置),还有一种是使用注解配置,该配置方式要使用class属性来配置-------对应dao的接口文件的全限定类名

当然这种映射对于开发来讲是比较麻烦的,不过我们可以采用mappers标签下的package标签 这个标签可以用于指定dao接口的所在的包,当指定了之后就不需要再写mapper及其他的属性resource 或者 class

3. 配置mapper映射文件

Ps:mapper映射文件的名称最好要和对应的DAO接口的名称一致。例如IUserDao.java接口,对应的mapper的文件名就是IUserDao.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="com.test.dao.IUserDao"><!--配置查询所有--> <!--有了它就有了执行的sql语句,就可以获取PreparedStatement对象--><select id="findAll" resultType="com.test.domain.User" >select *from user;</select><!--此配置中还有封装的实体类全限定类名-->
</mapper>

mapper标签中的namespace属性就是对应Dao的全限定类名

select标签的id属性就是对应Dao中的方法名称 resultType就是映射封装类型
Ps:当取了别名之后resultType这边就可以用别名来代替

3.入门案例

1.配置JavaBean

JavaBean得继承配置Serializable序列化接口,为了是接下来的Mybatis的使用

package com.test.domain;import java.io.Serializable;
import java.util.Date;
import java.util.List;public class User implements Serializable {private Integer id;private String username;private String address;private String sex;private Date birthday;/*多对多的关系映射 :一个用户可以具有多个角色*//* private List<Role> roles; *//* public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}*/public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", address='" + address + '\'' +", sex='" + sex + '\'' +", birthday=" + birthday +'}';}
}

2.配置IUserDao.java

package com.test.Dao;import com.test.domain.QueryVo;
import com.test.domain.User;import java.util.List;/*** 用户的持久层接口*/
public interface IUserDao {/*** 查询所有用户* @return*/List<User> findAll();/*** 查询一个用户*/User findOne(Integer id);/*** 模糊查询*/List<User> findbyname(String username);/*** 通过QueryVo 模糊查询*/List<User> findbyVo(QueryVo vo);/*** 查询用户总条数*/int findTotal();/*** 保存用户*/void saveUser(User user);/*** 修改用户*/void updateUser(User user);/*** 删除用户*/void deleteUser(Integer id);}

3.配置IUserDao.xml

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.Dao.IUserDao"><!--resultType 是查询结果保存的类型--><select id="findAll" resultType="com.test.domain.User">select *from user;</select><!--parameType 是保存插入修改数据的类型--><insert id="saveUser" parameterType="com.test.domain.User"><!--在保存用户之后,获取用户的id keyProperty是指(属性名称)id在实体类中的名称 order是指该操作是在保存用户之前执行还是在之后执行 keyColumn(列名)是id在数据库里的名称 --><selectKey keyProperty="id" resultType="int" order="AFTER" keyColumn="id">select last_insert_id()</selectKey>insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})</insert><update id="updateUser" parameterType="com.test.domain.User">UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update><delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id=#{uid}</delete><!--查询单个用户--><select id="findOne" parameterType="java.lang.Integer" resultType="com.test.domain.User">select *from user where id=#{uid}</select><!--模糊查询--><select id="findbyname" parameterType="java.lang.String" resultType="com.test.domain.User">select *from user where username like #{uname}<!--select *from user where username like '%${value}%' --> <!--第二种方式  但是¥里面的名称必须是value  第一种好--></select><!--查询用户的总记录条数--><select id="findTotal" resultType="int" >select count(id) from user</select><select id="findbyVo" parameterType="com.test.domain.QueryVo" resultType="com.test.domain.User">select *from user where username like #{user.username}</select>
</mapper>

4.创建测试类使用Junit

由于该博客是为本人日后复习准备,所以有些知识就不再多说
毕竟今天是情人节,看不懂你咬我啊(来自单身狗的群嘲)

package com.test.Test;import com.test.domain.QueryVo;
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 com.test.Dao.IUserDao;
import com.test.domain.User;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;public class MybatisTest {private InputStream in=null;private SqlSessionFactory factory=null;private SqlSession sqlSession=null;private IUserDao userDao=null;/***  @Before 在方法执行前执行* @throws IOException*/@Beforepublic void Init() throws IOException{//1.读取配置文件,生成字节输入流in= Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactory工厂
//        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//        /*因为SqlSessionFactory是一个接口不能直接实现所以通过SqlSessionFactoryBuilder对象*/SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对象sqlSession = factory.openSession();//4.获取dao的代理对象userDao=sqlSession.getMapper(IUserDao.class);}/*** @After 在方法执行之后执行* @throws IOException*/@Afterpublic void destroy() throws IOException{//提交事务sqlSession.commit();if(sqlSession!=null){sqlSession.close();}if(in!=null){in.close();}}/*** 测试查询所有*/@Testpublic void testFindAll() {List<User> users=userDao.findAll();for(User user : users ){System.out.println(user);}}/*** 测试查询一个用户信息*/@Testpublic void testFindOne() {User user=userDao.findOne(1);System.out.println(user);}/*** 模糊查询*/@Testpublic void testFindname() {List<User> users=userDao.findbyname("%王%");/*第一种 第一种好 因为第一种 是占位符方式*///List<User> users=userDao.findbyname("王"); /*第二种方式的写法*/for(User user : users ){System.out.println(user);}}/***  使用QueryVo封装user实现模糊查询*/@Testpublic void testFindVo() {QueryVo vo=new QueryVo();User user=new User();user.setUsername("%王%");vo.setUser(user);List<User> users=userDao.findbyVo(vo);for(User u : users ){System.out.println(u);}}/*** 用户总条数*/@Testpublic  void testFindTotal(){int cout=userDao.findTotal();System.out.println(cout);}/*** 保存用户*/@Testpublic void testSave(){User user=new User();user.setUsername("test two");user.setBirthday(new Date());user.setAddress("福建福州");user.setSex("女");System.out.println(user);//执行保存用户操作SaveuserDao.saveUser(user);
//        //提交事务
//        sqlSession.commit();System.out.println(user);}/*** 修改用户信息*/@Testpublic void testUpdate(){User user=new User();user.setId(15);user.setUsername("陈王");user.setBirthday(new Date());user.setAddress("福建宁德");user.setSex("女");//执行修改用户操作userDao.updateUser(user);}/*** 删除用户*/@Testpublic void testDelete(){//执行删除用户操作userDao.deleteUser(2);}}

5.入门案例查询结果展示

在这里插入图片描述

4.作者有话讲

今天是情人节,本人闲来无事在朋友圈里‘溜达’,哪曾想狗粮撒我一脸,心中悲愤无处宣泄,想到2020年年初的不堪,不敢多添事端,安心在家即可。又想到天天在csdn里白嫖大佬的成果,呸!成果(诸葛大力)是我的!!!内心忐忑不安,唯有将心比心,将近日所学奉献给如我这般的小白,顺便找点事做躲过这个该死的情人节!别说了,这一切要从…吃了…开始!武汉加油!中国加油!!

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

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

相关文章

Mybatis+Tomcat使用JNDI配置数据源入门

在我们已经有了Mybatis基础的情况下&#xff0c;我们可以使用Tomcat部署web项目1.创建Maven项目 选择webapp 2.配置pom.xml 在pom.xml中添加依赖 这里的依赖比单纯的Mybatis配置多了两个 一个是jsp的依赖&#xff0c;另一个是servlet <dependencies><dependency>&l…

Liferay开发学习Part6:Service Builder

2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Service Builder&#xff1f; Service Builder是liferay IDE提供的一种代码生成方案&#xff0c;开发人员只需编辑一个数据库实体的描述文件&#xff08;XML&#xff09;,即可根据XML文件生成Spring层代码、Hib…

html+css实现响应式布局入门

什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念&#xff0c;简而言之&#xff0c;就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互联网浏览而诞生的。响应式布局可以为不同终端的用户提供更加舒适的界面…

ajax入门篇

什么是ajax AJAX即“Asynchronous JavaScript and XML”&#xff08;异步的JavaScript与XML技术&#xff09;&#xff0c;指的是一套综合了多项技术的浏览器端网页开发技术。Ajax的概念由杰西詹姆士贾瑞特所提出[1]。 传统的Web应用允许用户端填写表单&#xff08;form&#…

BJRangeSliderWithProgress

2019独角兽企业重金招聘Python工程师标准>>> BJRangeSliderWithProgress 是一个带范围选择的进度条&#xff0c;我用它来做录音的进度指示&#xff0c;并可在选择的范围内进行回放。 转载:http://www.adobex.com/ios/source/details/00000865.htm 转载于:https://my…

servlet+JQuery ajax以json的形式的验证表单小实例

JQuery $.ajax() $.ajax({type: POST, //请求方式 一般是get&#xff0c;posturl: url , // 这是必需的&#xff0c;规定把请求发送到哪个 URLdata: data , //这个是可选。映射或字符串值。规定连同请求发送到服务器的数据。java中用request.getPara…

JSONObject与GSON的一些常用的方法的使用

通过学习ajax然后接触了Json最后通过json接触到了JSONObject和Google的GSON&#xff0c;下面来一起看看JSONObject和GSON吧。 先附上依赖 //JSONObject依赖<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId>&…

Mybatis(2)---多表查询

首先数据库表展示 User表 Role角色表 关联User表与Role表关系的user_role表 因为是要串联关系所以需要设置外键&#xff0c;以下是外键展示 工程目录展示 pom.xml依赖配置 <dependencies><dependency><groupId>junit</groupId><artifactId>…

JavaScript复习使用定时器的简易式诸葛大力轮播图

先上效果图 很简单的代码 先创建个文件夹保存成果的照片&#xff0c;然后通过更改src来用定时器循环这些照片 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"…

复习---使用基础语法实现栈及迭代

上图是最最基本的结构&#xff0c;这次我采用数组实现栈。使用数组实现栈&#xff0c;由于java的数组是固定长度的。所以我需要写一个增加长度的方法。然后就是迭代的问题了。使用数组实现栈的话&#xff0c;我们需要写一个迭代器。不过这个迭代器非常容易实现&#xff0c;只需…

复习----使用链表实现栈(后进先出)及迭代

使用链表进行模拟栈比用数组好用&#xff0c;考虑的要素也少还方便。 链表结构 private class Node{//链表结构Item item;Node next;}迭代器 private class Iterator implements java.util.Iterator<Item>{//迭代器private Node pfirst;Overridepublic boolean hasNex…

复习----使用链表实现队列(先进先出)及迭代

实现队列比实现栈的会多一点复杂&#xff0c;需要两个标记&#xff0c;first表示队头&#xff0c;last表示队尾。 链表结构 private class Node{Item item;Node next;}迭代器 与实现栈的迭代器一模一样 private class Iterator implements java.util.Iterator<Item>{p…

RedHat Enterprise AS4安装步骤

//因RDMS使用新版本CentOS6.2 有问题 &#xff0c; 没办法只有装低版本操作系统 &#xff01; 概述 Redhat公司的Enterprise Linux AS系列 &#xff08;以下简称AS系列&#xff09;&#xff0c;其中Fedora Core 是符合GPL协议的免费版本&#xff0c;使用范围广泛。AS是高性能的…

贪心---leetcode-376摆动序列

题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。少于两个元素的序列也是摆动序列。 例如&#xff0c; [1,7,4,9,2,5] 是一个摆动序列&#xff0c;因为差值 (6,-3,…

贪心---移掉K位数字

题目 给定一个以字符串表示的非负整数 num&#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。 示例 1 : 输入: num “1432219”, k 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2 形…

应用层——使用 Socket 通信实现 FTP 客户端程序

转自&#xff1a;http://blog.csdn.net/yixijide/article/details/8280263 简介&#xff1a; FTP 客户端如 FlashFXP&#xff0c;File Zilla 被广泛应用&#xff0c;原理上都是用底层的 Socket 来实现。FTP 客户端与服务器端进行数据交换必须建立两个套接字&#xff0c;一个作为…

Java-IO-对接流

不管是什么文件都可以用字节来表示&#xff0c;下面的例子是将图片解码成字节&#xff0c;然后再编码成图片。 过程 首先将图片解码&#xff0c;我们需要用文件字节输入流&#xff1a;FIleInputStream 用FIleInputStream可以将图片储存到字节数组中&#xff0c;我们通过read(…

蓝桥杯试题 算法提高 数组求和

题干 我人比较蠢想不出好的解决方案&#xff0c;只能采用暴力破解才能维持的了生活这样。。资源限制 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 输入n个数&#xff0c;围成一圈&#xff0c;求连续m&#xff08;m<n&#xff09;个数的和最大为多少&a…

一次较为完整的原生JavaScript AJAX与Java的前后端数据交互

效果 Maven 依赖 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>mysql</groupId><artifactId…

工厂模式解耦---控制反转

控制反转 是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&#xff0c;还有一种方式叫“依赖查找”&#xff08;Dependency Lookup&#xff09…