Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

MyBatis快速入门

夏天里的Jasmine 2019-02-01 18:13:00 阅读数:183 评论数:0 点赞数:0 收藏数:0

先说说缘由为啥今天才来学习和总结MyBatis。。

我自己学Springboot刚入门的时候,用SptingBoot+JdbcTemplate+Thymeleaf 搭建了一个bug管理平台

后来自己用自己的接口,测试DB连接数对性能的影响,TPS会特别受到程序中连接池的配置影响

后来DB中就涌现了很多数据,我的bug管理平台,有一个接口是列出所有的bug,这个页面就会特别特别地慢,于是想到分页。

 

在网上查找分页信息的时候,发现大多数都是针对MyBatis的,用JdbcTemplate的查询,将没有现成的分页插件,需要自己改写JdbcTemplate中的一些方法,要添加页码和每页的条数

 

每天依旧,工作依旧。

忽然一日得闲,又开始自学SpringBoot,于是根据教程先用springboot+MyBatis+MyBatis插件 自动生成了Mapper和实体类。

难道MyBatis必须在SpringBoot框架中? 忽然冒出这样的疑问之后,就开始搜索MyBatis的历史,也开始最简单的学习。

 

 

mybatis是什么?最初开发出来做什么的?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

 

http://blog.mybatis.org/        mybatis官方网站   ---   需要FQ

https://github.com/mybatis/mybatis-3/releases

 下载第一个zip格式的,解压后如下图,其中有个pdf文档,可以参考用来配置mapper以及配置config文件。 License和Notice只是一些证书说明等,可以忽略。lib目录下是一些常搭配的jar包。

mybatis-xx.xx.x.jar 可以放置到自己的项目源中。用了maven的话,可以自己去找maven的路径。

 

 

 

 

 

mybatis是怎么用的呢?

不管是何种程序,持久化的数据都是重中之重。不可能让前段用户直接去操作数据库吧,这样都不安全,而且也不是任何一个人都会的。

所以要用程序编写页面,编写后台接口,让mybaits操作对象,就像操作数据库这么简单。

user表, user对象,一一对应

想查看,想更新,想新增,直接操作对象,就能存入持久化数据DB中

use test
select * from user
create table user(
id INT NOT NULL auto_increment primary key,
name VARCHAR(20),
age int,
phone varchar(20),
password varchar(20)
)ENGINE=InnoDB AUTO_INCREMENT=300;
insert user(name,age,phone,password) values ("王族 ",33,"18962811111","12345") 

以上是创建了user表,接下来创建User对象

public class User {
private Integer id;
private String name;
private String phone;
private String password;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(){
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}

 

表和对象都有了,现在就是mybatis的作用了,首先要进行配置config.xml,然后配置映射文件UserMapper.xml.这些在刚下载的pdf中都有介绍,有例子。

上面是项目的目录结构,我创建的有点随意,下面l两个分别是config.xml 和UserMapper.xml映射文件

<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="useraaa">
<select id="selectById" parameterType ="int" resultType="com.test.mybatis.entity.User">
select * from user where id = #{id}
</select>
<select id="selectAll" resultType="com.test.mybatis.entity.User">
select * from user
</select>
<insert id="addUser" parameterType="com.test.mybatis.entity.User">
insert into user (name,age,phone,password) values(#{name},#{age},#{phone},#{password})
</insert>
<update id="updateUser" parameterType="com.test.mybatis.entity.User">
update user set name = #{name},age =#{age},phone =#{phone},password = #{password} where id = #{id}
</update>
<delete id="deleteUserById" parameterType ="int">
delete from user where id = #{id}
</delete>
</mapper>

 

下面是如何读取配置文件config.xml,如何将UserMapper中的查询语句打印出表中的信息

用了testNG来测试,具体测试内容如下

import com.test.mybatis.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 org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
public class TestMyBatis {
@Test(description = "通过InputStream读取配置config文件")
public void TestInputStream() throws IOException {
String resource = "config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectById";
User user = session.selectOne(statement,300);
System.out.println(user);
session.close();
}
@Test(description = "通过Reader读取配置config文件")
public void Reader() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectById";
User user = session.selectOne(statement,300);
System.out.println(user);
session.close();
}
@Test(description = "读取所有的对象")
public void selectAll() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectAll";
List<User> user = session.selectList(statement);
System.out.println(user);
session.close();
}
}

以下是新增,更新,删除的测试,注意事物的提交【当前config.xml中可以配置,目前是JDBC,需要手动提交】

 

import com.test.mybatis.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 org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
public class TestMyBatis02 {
@Test(description = "新增记录")
public void Add() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.addUser";
User user= new User();
user.setName("may");
user.setAge(20);
user.setPassword("12345678");
user.setPhone("18976532121");
int count = session.insert(statement,user);
System.out.println(count);
session.commit();
System.out.println(user);
session.close();
}
@Test(description = "更新记录")
public void Update() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.updateUser";
User user= new User();
user.setId(300);
user.setName("may");
user.setAge(20);
user.setPassword("12345678");
user.setPhone("18976532121");
int count = session.update(statement,user);
System.out.println(count);
session.commit();
System.out.println(user);
session.close();
}
@Test(description = "删除记录")
public void Delete() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.deleteUserById";
int count = session.delete(statement,307);
System.out.println(count);
session.commit();
session.close();
}
}

 

 

 

 

pom.xml

<?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>mybatis01</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

mybatis使用中要注意的地方?

1. config.xml 和 Mapper.xml 中的头部分要复制正确,是不一样的,config中是configration,后者是Mapper

2. config.xml中数据的连接url,驱动,用户名和密码要全部填写正确

3.UserMapper.xml中的namespace 要用到,之后读取的是namespace.select的id的值,如下

 

4. 有很多报错原因是两个xml中的路径没有写对,pay attention~

5. config.xml中有挺多可以讲的,

比如数据库的确定是由environments下的default值 与 enviroment下的id值来确定的,备注:也可以通过SqlSessionFactoryBuilder的第二个参数来强制指定

 

上图是缺省模式,默认config中的配置

上图进行了指定,要开发环境的数据库配置

比如 <transactionManager type="JDBC"/>表示事务提交方式是JDBC,即利用JDBC的方式处理事务,需要手动去commit,rollback和close操作

 <transactionManager type="MANAFED"/>表示将事务交给其他组件去托管,比如spring,jboss,默认会关闭连接等

 

比如 <dataSource type="POOLED">,POOLED是指用数据库连接池;

 <dataSource type="UNPOOLED">表示使用传统的JDBC模式,即每次访问数据库,均需要打开、关闭等数据库操作,每次打开关闭数据库通常比较消耗性能,一般不建议
 <dataSource type="JNDI">表示从tomcat中间件中获取一个内置的数据库连接,数据库连接池,数据源,可以认为是pooled方式相似

 

 6. mybatis的sql映射文件的UserMapper潜在约定:

1#  输入参数和输出参数,parameterType和resultType在形式上都只能是一个

2# 输入参数parameterType如果是简单类型,即8个基本类型+String,是可以使用任何占位符的, #{xxx}

如果是对象类型,则必须是对象的属性,#{属性名}

一般,为了可读性,都会尽量写成 #{属性名}

 3# 输出参数resultType,如果返回类型是一个对象,比如User对象,则无论返回一个还是多个,都写成User对象
比如resultType="com.test.mybatis.entity.User"

 


 

版权声明
本文为[夏天里的Jasmine]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/qianjinyan/p/10346569.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领