MyBatis ---入门

MyBatis简介

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

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

MyBatis源码下载地址

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

准备数据库

导入数据库脚本mybatis.sql

jdbc缺点示例展示

先建立一个存放工程的文件夹:
在这里插入图片描述
在这里插入图片描述
工程架构:
在这里插入图片描述

package cn.ccnuacmhdu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class jdbcDemo {
	public static void main(String[] args) {
			Connection connection = null;
			PreparedStatement preparedStatement = null;
			ResultSet resultSet = null;

			try {
				// 加载数据库驱动
				Class.forName("com.mysql.jdbc.Driver");

				// 通过驱动管理类获取数据库链接
				connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456");
				// 定义sql语句 ?表示占位符
				String sql = "select * from user where username = ?";
				// 获取预处理statement
				preparedStatement = connection.prepareStatement(sql);
				// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
				preparedStatement.setString(1, "王五");
				// 向数据库发出sql执行查询,查询出结果集
				resultSet = preparedStatement.executeQuery();
				// 遍历查询结果集
				while (resultSet.next()) {
					System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				// 释放资源
				if (resultSet != null) {
					try {
						resultSet.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (preparedStatement != null) {
					try {
						preparedStatement.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if (connection != null) {
					try {
						connection.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
}

缺点:
1、数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。
2、Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
3、使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

MyBatis架构

在这里插入图片描述

MyBatis入门程序

环境搭建

导入核心包和MyBatis本身依赖的包还有jdbc驱动包:
在这里插入图片描述

导入JavaBean

书写核心配置文件

SqlMapConfig.xml

导入控制台打印日志的配置文件

log4j.properties

书写Mapper.xml配置文件并在核心配置文件中SqlMapConfig.xml引入

里面书写的是sql语句

编码完成增删改查基本功能

方式一:直接写测试类完成

方式二: 原始dao完成

在这里插入图片描述

方式三: Mapper动态代理

解决原始dao有很多重复代码的问题。只需要写一个如下的接口即可。然后把相应的东西和对应的Mapper.xml配置一致即可。

package cn.ccnuacmhdu.mapper;

import cn.ccnuacmhdu.pojo.User;

public interface UserMapper {
	//使用Mapper动态代理实现原始dao
	/*
	 * 只需要写一个接口,且满足如下四个条件:
	 * 1.把该接口与对应的Mapper.xml配置文件绑定,即把Mapper.xml中的namespace的值写成该接口的全限定名
	 * 2.接口中的方法名字、返回值类型、参数类型与Mapper.xml中配置情况相同。
	 */
	public User findUserById(Integer id);
}

在这里插入图片描述

package test;

import java.io.IOException;
import java.io.InputStream;

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.Test;

import cn.ccnuacmhdu.mapper.UserMapper;
import cn.ccnuacmhdu.pojo.User;

public class MapperTest {
	
	@Test
	public void test() throws IOException{
		//1.加载核心配置文件(参看MyBatis架构)
		String resource = "SqlMapConfig.xml";
		InputStream resourceAsStream = Resources.getResourceAsStream(resource);
		//2.创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
		//3.获得SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		User user = userMapper.findUserById(10);
		System.out.println(user);
	}
}

SqlMapConfig.xml配置

在这里插入图片描述

properties属性

把数据库连接信息单独放在db.properties中,然后从SqlMapConfig.xml文件中读取:
db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

SqlMapConfig.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>

	<properties resource="db.properties">
		<!-- 下面的属性首先被读取,之后再读取db.properties中配置的,覆盖掉下面的property
			下面虽然随便配置值,但由于db.properties中配置对了,所以是能正常运行的
		 -->
		<property name="driver" value="f"/>
	</properties>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
	</mappers>
	
</configuration>

在 properties 元素体内定义的property属性首先被读取,然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

typeAliases属性

SqlMapConfig.xml如下配置:

<typeAliases>
		<!-- 单个别名定义 -->
		<typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
		<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
		<package name="cn.itcast.mybatis.pojo" />
	</typeAliases>

User.xml可以如下配置了:
在这里插入图片描述

mappers

Mapper配置的几种方法:

方式一:

 <mapper resource="sqlmap/User.xml"/>

方式二:

<mapper class="cn.ccnuacmhdu.mapper.UserMapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
在这里插入图片描述
方式三:

<package name="cn.ccnuacmhdu.mapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
在这里插入图片描述

点我进行工程源码及相关资料免费下载

参考资料

黑马程序员官方资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值