【Mybatis框架】从零开始学Mybatis框架——使用示例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_42483341/article/details/100129158

一、数据库SQL 命令

1、创建数据库,并指定编码

Create database ssm default character set utf8

2.创建表

Create table 表名(
	列名类型约束auto_increment comment ‘备注’,
);

在这里插入图片描述
3、添加数据

INSERT INTO `ssm`.`flower` (`id`, `name`, `price`, `production`) VALUES ('2', '栀子花', '5.1', '山东');

二、Eclipse 使用

  1. 创建项目
    选择target runtime,否则出现新建jsp 报错,如果忘记选择,右键项目–> build path中添加library
  2. Eclipse 默认会自己下载所需tomcat 最简单结构。

三、框架是什么

  1. 框架:软件的半成品.未解决问题制定的一套约束,在提供功能基础上进行扩充。
  2. 框架中一些不能被封装的代码(变量),需要使用框架者新建一个 xml 文件,在文件中添加变量内容。
    比如:需要建立特定位置和特定名称的配置文件;需要使用xml 解析技术和反射技术。
  3. 常用概念
    类库:提供的类没有封装一定逻辑。(类库就是名言警句,写作文时引入名言警句)
    框架:区别与类库,里面有一些约束。(框架是填空题)

四、MyBatis 简介

  1. Mybatis 开源免费框架。原名叫iBatis,2010 在google code,2013 年迁移到github。
  2. 作用: 数据访问层框架。
    底层是对JDBC 的封装。
  3. mybatis 优点之一:
    使用mybatis 时不需要编写实现类,只需要写需要执行的 sql 命令。

五、环境搭建

目录结构:
在这里插入图片描述

  1. 导入jar
    在这里插入图片描述
  2. 在src 下新建全局配置文件(编写JDBC 四个变量)
    2.1 没有名称和地址要求例如,路径/mybatis0(项目名)/src/myabtis.xml即可
    2.2 在全局配置文件中引入DTD 或schema
    2.2.1 如果导入dtd 后没有提示:
    点击Window--> preference --> XML --> XMl catalog --> add 按钮(课件资料中,包含所有需要用到的dtd文件)
    在这里插入图片描述
    2.3 全局配置文件内容
<?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>
	<!-- default引用environment的id,当前所使用的环境 -->
	<environments default="default">
		<!-- 声明可以使用的环境 -->
		<environment id="default">
			<!-- 使用原生JDBC事务 -->
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/bjsxt/mapper/FlowerMapper.xml"/>
	</mappers>
</configuration>
  1. 新建以mapper 结尾的包,在包下新建:实体类名+Mapper.xml例如FlowerMapper.xml
    3.1 文件作用:编写需要执行的SQL 命令
    3.2 把xml 文件理解成实现类.
    3.3 xml 文件内容
<?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">
<!-- namesapce:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b" >
	<!-- id:方法名 
		parameterType:定义参数类型
		resultType:返回值类型.
		
		如果方法返回值是list,在resultType中写List的泛型,因为mybatis
		对jdbc封装,一行一行读取数据
	-->
	<select id="selAll" resultType="com.bjsxt.pojo.Flower">
		select id,name name123,price,production from flower
	</select>
	
	<select id="selById" resultType="int">
		select count(*) from flower
	</select>
	
	<select id="c" resultType="com.bjsxt.pojo.Flower">
		select id,name name123,price,production from flower
	</select>
	
</mapper>
  1. 测试结果(只有在单独使用 mybatis 时使用,最后 ssm 整合时,下面代码不需要编写)
package com.bjsxt.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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 com.bjsxt.pojo.Flower;

public class Test {
	public static void main(String[] args) throws IOException {
		InputStream is = Resources.getResourceAsStream("myabtis.xml");
		// 使用工厂设计模式
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		// 生产SqlSession
		SqlSession sqlSession = factory.openSession();

		List<Flower> list = sqlSession.selectList("a.b.selAll");
		for (Flower flower : list) {
			System.out.println(flower.toString());
		}

		int count = sqlSession.selectOne("a.b.selById");
		System.out.println(count);

		// 把数据库中哪个列的值当作map的key
		Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
		System.out.println(map);

		sqlSession.close();
	}
}

输出

Flower [id=1, name=向日葵, price=2.05, production=江西]
Flower [id=2, name=栀子花, price=5.1, production=山东]
2
{栀子花=Flower [id=2, name=栀子花, price=5.1, production=山东], 向日葵=Flower [id=1, name=向日葵, price=2.05, production=江西]}

六、环境搭建详解

1.全局配置文件中内容

(1) <transactionManager/> type 属性的可取值包括:
JDBC,事务管理使用JDBC 原生事务管理方式
MANAGED 把事务管理转交给其他容器.原生JDBC 事务setAutoMapping(false)

(2) <dataSouce/>type属性
POOLED 使用数据库连接池
UNPOOLED 不实用数据库连接池,和直接使用JDBC 一样
JNDI :java 命名目录接口技术.


七、数据库连接池

  1. 在内存中开辟一块空间,存放多个数据库连接对象.
  2. JDBC Tomcat Pool,直接由tomcat 产生数据库连接池.
  3. 图示
    active 状态:当前连接对象被应用程序使用中
    Idle 空闲状态:等待应用程序使用
    在这里插入图片描述
  4. 使用数据库连接池的目的
    在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率.
    小型项目不适用数据库连接池。
  5. 实现JDBC tomcat Pool 的步骤.
    在web 项目的META-INF 中存放context.xml,在context.xml 编写数据库连接池相关属性。把项目发布到tomcat 中,数据库连接池产生了。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource
		driverClassName="com.mysql.cj.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
		username="root"
		password="123456"
		maxActive="50"
		maxIdle="20"
		name="test"
		auth="Container"
		maxWait="10000"
		type="javax.sql.DataSource"
	/>
</Context>
  1. 可以在java 中使用jndi 获取数据库连接池中对象
    Context:上下文接口.context.xml 文件对象类型
    当关闭连接对象时,把连接对象归还给数据库连接池,把状态改变成Idle
    代码示例:
package com.bjsxt.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

@WebServlet("/pool")
public class DemoServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		try {
			Context cxt = new InitialContext();
			DataSource ds = (DataSource) cxt.lookup("java:comp/env/test");
			Connection conn = ds.getConnection();
			PreparedStatement ps = conn.prepareStatement("select * from flower");
			ResultSet rs = ps.executeQuery();
			res.setContentType("text/html;charset=utf-8");
			PrintWriter out = res.getWriter();
			while(rs.next()){
				out.print(rs.getInt(1)+"&nbsp;&nbsp;&nbsp;&nbsp;"+rs.getString(2)+"<br/>");
			}
			out.flush();
			out.close();
			rs.close();
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

八、三种查询方式

1.selectList() 返回值为List<resultType 属性控制>
适用于查询结果都需要遍历的需求

List<Flower> list = sqlSession.selectList("a.b.selAll");
		for (Flower flower : list) {
			System.out.println(flower.toString());
		}

2.selectOne() 返回值Object
适用于返回结果只是变量或一行数据时

int count = sqlSession.selectOne("a.b.selById");
		System.out.println(count);

3.selectMap() 返回值Map
适用于需要在查询结果中通过某列的值取到这行数据的需求.
Map<key,resultType 控制>

		// 把数据库中哪个列的值当作map的key
		Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
		System.out.println(map);

4.三种查询方式的完整代码示例

package com.bjsxt.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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 com.bjsxt.pojo.Flower;

public class Test {
	public static void main(String[] args) throws IOException {
		InputStream is = Resources.getResourceAsStream("myabtis.xml");
		// 使用工厂设计模式
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		// 生产SqlSession
		SqlSession sqlSession = factory.openSession();

		List<Flower> list = sqlSession.selectList("a.b.selAll");
		for (Flower flower : list) {
			System.out.println(flower.toString());
		}

		int count = sqlSession.selectOne("a.b.selById");
		System.out.println(count);

		// 把数据库中哪个列的值当作map的key
		Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
		System.out.println(map);

		sqlSession.close();
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/100129158