MyBatis——(一)CRUD

2018-11-23 19:16:49     

一、摘要

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

二、快速入门

jar包准备:点击这里直接下载
  • mybatis-3.4.2.jar
  • mysql-connect-java-5.0.8-bin.jar

创建Java Project项目并且导入相关jar包,在【src/dao】目录下新建Teacher实体类,代码如下:

package dao;

public class Teacher {
	private int id;
	private String name;

	@Override
	public String toString() {
		return "Teacher [id=" + id + ", name=" + name + "]";
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

在【src/config】目录下新建db.properties件用于存放连接数据库的账号密码等信息,代码如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/transaction
username=root
password=123456

在【src/config】目录下新建mybatis配置文件mybatis-config.xml其作用主要是提供连接数据库用的驱动,数据库名称,编码方式,账号密码,加载sql,代码如下:

<?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文件 -->
	<properties resource="config/db.properties" />
	<!-- 自动扫描dao包下的类型,使得在后续配置文件Teacher.xml中使用resultType的时候
	可以直接使用Teacher,而不必写全dao.Teacher -->
	<typeAliases>
		<package name="dao" />
	</typeAliases>
	<!--和Spring整合后 environments 配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用JDBC事务管理 -->
			<transactionManager type="JDBC" />
			<!--数据库连接池 -->
			<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>
	<!-- 映射teacher.xml加载sql语句-->
	<mappers>
		<mapper resource="config/teacher.xml" />
	</mappers>
</configuration>

在【src/config】目录下新建Teacher.xml专门用于存放sql映射文件,代码如下:

<?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">

<!-- 表示命名空间是config,在后续调用sql语句的时候,会用到它 -->
<mapper namespace="config">
	<!-- resultType标签本应写dao.Teacher(包名+类名)  -->
	<!-- 因为在mybatis-config.xml里配置了typeAliases标签所以这里直接写类名就行 -->
	<select id="listTeacher" resultType="Teacher">
		select * from teacher
	</select>
</mapper>

在【src/test】目录下新建TestMybatis测试类,执行定义的select语句,如下代码:

package test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

import dao.Teacher;

public class TestMybatis {
	
	//运用log4j2日志框架
	Logger logger = LogManager.getLogger(TestMybatis.class.getName());

	@Test
	public void testOne() throws IOException {
		// 获取配置文件
		String resource = "config/mybatis-config.xml";
		// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
		InputStream is = Resources.getResourceAsStream(resource);
		// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		// 工厂生产产品
		SqlSession session = sessionFactory.openSession();
		// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
		List<Teacher> list = session.selectList("listTeacher");
		for (Teacher t : list) {
			logger.debug(t);
		}
		session.commit();
		//使用session执行完SQL之后需要关闭session
		session.close();
	}
}

执行结果:

14:32:49.748 [main] DEBUG config.listTeacher - ==>  Preparing: select * from teacher 
14:32:49.761 [main] DEBUG config.listTeacher - ==> Parameters: 
14:32:49.773 [main] DEBUG config.listTeacher - <==      Total: 2
14:32:49.773 [main] DEBUG test.TestMybatis - Teacher [id=1, name=Bounds]
14:32:49.773 [main] DEBUG test.TestMybatis - Teacher [id=2, name=Cubi]

三、CRUD

  • 增加(Create)
<!-- #{id},#{name}会自动获取并识别teacher对象中的id,name -->
<insert id="addTeacher" parameterType="Teacher">
	insert into teacher (id,name) values (#{id},#{name})
</insert>
// 插入一条数据
@Test
public void testTwo() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	Teacher teacher = new Teacher();
	teacher.setId(3);
	teacher.setName("Peter");
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	int result = session.insert("addTeacher", teacher);
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
	logger.debug(result);
}
19:06:05.457 [main] DEBUG config.addTeacher - ==>  Preparing: insert into teacher (id,name) values (?,?) 
19:06:05.472 [main] DEBUG config.addTeacher - ==> Parameters: 3(Integer), Peter(String)
19:06:05.488 [main] DEBUG config.addTeacher - <==    Updates: 1
  • 更新(Update)
<update id="modifyTeacher" parameterType="Teacher">
	update teacher set name=#{name} where id=#{id}
</update>
// 修改一条数据
@Test
public void testThree() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	Teacher teacher = new Teacher();
	teacher.setId(3);
	teacher.setName("Louis");
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	int result = session.update("modifyTeacher", teacher);
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
	logger.debug(result);
}
19:08:02.271 [main] DEBUG config.modifyTeacher - ==>  Preparing: update teacher set name=? where id=? 
19:08:02.286 [main] DEBUG config.modifyTeacher - ==> Parameters: Louis(String), 3(Integer)
19:08:02.288 [main] DEBUG config.modifyTeacher - <==    Updates: 1
  • 删除(Delete)
<!-- mybatis参数类型_int类似Java中的int -->
<!-- mybatis参数类型int类似Java中的Integer -->
<delete id="deleteTeacher" parameterType="_int">
	delete from teacher where id=#{id}
</delete>
// 删除一条数据
@Test
public void testFour() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	int result = session.delete("deleteTeacher", 3);
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
	logger.debug(result);
}
19:08:34.565 [main] DEBUG config.deleteTeacher - ==>  Preparing: delete from teacher where id=? 
19:08:34.578 [main] DEBUG config.deleteTeacher - ==> Parameters: 3(Integer)
19:08:34.579 [main] DEBUG config.deleteTeacher - <==    Updates: 1
  • 模糊查询
<!-- 这里的#{0}表示一个占位符 -->
<!-- 如果是oracle,写法是
	select * from   teacher  where name like '%'||#{0}||'%' -->
<select id="selectByName" parameterType="string" resultType="Teacher">
	select * from teacher where name like concat('%',#{0},'%')
</select>
// 模糊查询
@Test
public void testFive() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	List<Teacher> list = session.selectList("selectByName", "o");
	for (Teacher t : list) {
		logger.debug(t);
	}
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
}
19:09:20.522 [main] DEBUG config.selectByName - ==>  Preparing: select * from teacher where name like concat('%',?,'%') 
19:09:20.536 [main] DEBUG config.selectByName - ==> Parameters: o(String)
19:09:20.546 [main] DEBUG config.selectByName - <==      Total: 2
19:09:20.547 [main] DEBUG test.TestMybatis - Teacher [id=1, name=Bounds]
19:09:20.547 [main] DEBUG test.TestMybatis - Teacher [id=3, name=Louis]
  • 多条件查询
<!-- map对象作为参数传递进去 -->
<select id="selectByIdAndName" parameterType="map" resultType="Teacher">
	select * from teacher where id>#{id} and name like concat('%',#{name},'%')
</select>
// 多条件查询
@Test
public void testSix() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	//因为是多个参数,而selectList方法又只接受一个参数对象,所以需要把多个参数放在Map里,然后把这个Map对象作为参数传递进去
	Map<String, Object> map = new HashMap<>();
	map.put("id", 1);
	map.put("name", "o");
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	List<Teacher> list = session.selectList("selectByIdAndName", map);
	for (Teacher t : list) {
		logger.debug(t);
	}
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
}
19:09:45.914 [main] DEBUG config.selectByIdAndName - ==>  Preparing: select * from teacher where id>? and name like concat('%',?,'%') 
19:09:45.928 [main] DEBUG config.selectByIdAndName - ==> Parameters: 1(Integer), o(String)
19:09:45.939 [main] DEBUG config.selectByIdAndName - <==      Total: 1
19:09:45.940 [main] DEBUG test.TestMybatis - Teacher [id=3, name=Louis]

四、总结

  • 关于使用MyBatis对表执行CRUD操作的内容就这么多
  • 当遇到复杂一点的条件判断sql语句该怎么办呢?

ps:本篇博客源码下载链接:https://pan.baidu.com/s/1l8bGIpHLurTv366bM8smfQ 密码:5hu1
SpringMVC——(四)拦截器

一、前期准备jar包准备,前面的博客有提供,都导入就完事了二、拦截器实现登录验证1.在eclipse中新建项目【SpringMVCTest03】使用dynamic web project的方式,引入jar包到【lib】目录下,在【src/top.bounds.entity/】目录下新建User实体类如下代码:package top.bounds.entity; public class User { private String username; private String pwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd;

Spring思维导图

Spring如此博大精深,这里没有涉及到原理的东西。只是根据Spring的特性、核心容器、常用注解这些模块简单的介绍一下Spring。通过思维导图分析各个模块的知识点,可以随时开展头脑风暴,帮助我们快速理清思路并提高效率学习效率。

 发表评论