MyBatis框架的使用(入门)

MyBatis前述

原生JDBC编程存在的问题

JDBC程序

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", "mysql");
				//定义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) {
						e.printStackTrace();
					}
				}
				if(preparedStatement!=null){
					try {
						preparedStatement.close();
					} catch (SQLException e) {
						 
						e.printStackTrace();
					}
				}
				if(connection!=null){
					try {
						connection.close();
					} catch (SQLException e) {
						 
						e.printStackTrace();
					}
				}

			}

		}

上边使用JDBC的原始方法(未经封装)实现了查询数据库表记录的操作。

JDBC编程步骤

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 创建JDBC statement对象
  4. 设置sql语句
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. 对sql执行结果进行解析处理
  8. 释放资源(resultSet、preparedstatement、connection)

JDBC存在问题

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

MyBatis简介

MyBatis

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

MyBatis特点

  • MyBatis是一个半自动化的持久化层框架;
  • 对开发人员而言,核心sql还是需要自己优化
  • sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

JDBC

  • SQL夹在Java代码块里,耦合度高导致硬编码内伤
  • 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

Hibernate和JPA

  • 长难复杂SQL,对于Hibernate而言处理也不容易
  • 内部自动生产的SQL,不容易做特殊优化。
  • 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难,导致数据库性能下降。

MyBatis使用

第一个MyBatis项目

  • 基本步骤
  1. 创建项目
  2. 构建路径(build path),添加mybatis及mysql相关jar包
  3. 创建数据库及数据表
  4. 创建mybatis核心配置文件
  5. 创建对应的JavaBean和SQL映射文件
  6. 创建测试类

运行环境

  • eclipse 2019 版
  • Windows10系统

创建步骤

解压缩

在这里插入图片描述

再将压缩中DTD文件复制到桌面

在这里插入图片描述
通过压缩软件打开

打开eclipse

在这里插入图片描述

添加对应DTD文件

找到preferences->XML->XML Catalog ->add
location 写自己存放的dtd文件路径,key就写
http://mybatis.org/dtd/mybatis-3-config.dtd
点击OK
在这里插入图片描述
再add另一个DTD文件,location写存放文件路径。key写mybatis.org/dtd/mybatis-3-mapper.dtd
最后点击OK,再点击Apply and Close
在这里插入图片描述

创建Java项目

在这里插入图片描述
添加相关的jar包(相关jar包资源
提取码:u5bm

在这里插入图片描述
设置JUnit
在这里插入图片描述
根据自己的JUnit版本来设置

自己创建过后,如图
在这里插入图片描述

Mybatis使用

//实体类
package lab_mybatis2.mybatis.bean;

public class Teacher {
	
	private int id;
	private String name;
	private String email;
	private String gender;
	private int age;
	
	
	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;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age=age;
	}
	@Override
	public String toString() {
		return "Teacher [id=" + id + ", name=" + name + ", email="
				+ email + ", gender=" + gender +",age"+age+ "]";
	}
	
	

}

//接口类
package lab_mybatis2.mybatis.dao;

import lab_mybatis2.mybatis.bean.Teacher;

public interface TeacherMapper {
	
	public Teacher getTeacherById(int id);
	public int addTeacher(Teacher newnoe);
	public int updateTeacher(Teacher updatenoe );
	public int deleteTeacherById(Integer id);

}

//测试类
package lab_mybatis2.mybatis.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 lab_mybatis2.mybatis.bean.Teacher;
import lab_mybatis2.mybatis.dao.TeacherMapper;

/**
 * 1、SqlSession代表和数据库的一次会话;用完必须关闭;
 * 2、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
 * 3、两个重要的配置文件:
 * 		mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
 * 		sql映射文件:保存了每一个sql语句的映射信息:
 * 			将sql抽取出来。	
 *
 */

public class MyBatisTest {

	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
/**
	 * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
	 * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。 
	 * 3、将sql映射文件注册在全局配置文件中
	 * 4、写代码:
	 * 		1)、根据全局配置文件得到SqlSessionFactory;
	 * 		2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
	 * 			一个sqlSession就是代表和数据库的一次会话,用完关闭
	 * 		3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
	 * 
	 * @throws IOException
	 */
	
	
	@Test
	public void testselectTeacherById() throws IOException {
	// 2、获取sqlSession实例,能直接执行已经映射的sql语句
		// sql的唯一标识:statement Unique identifier matching the statement to use.
		// 执行sql要用的参数:parameter A parameter object to pass to the statement.
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			TeacherMapper mapper = openSession.getMapper(TeacherMapper.class);
			Teacher teacher = mapper.getTeacherById(1);
			System.out.println(mapper.getClass());
			System.out.println(teacher);
		} finally {
			openSession.close();
		}

	}
	
	@Test
	public void testAddTeacher() throws IOException{
		SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
		SqlSession openSession=sqlSessionFactory.openSession();
		try {
			TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
			Teacher teacher=new Teacher();
			teacher.setName("my");
			teacher.setAge(22);
			teacher.setGender("男");
			teacher.setId(123);
			teacher.setEmail("123@qq.com");
			int rows=mapper.addTeacher(teacher);
			openSession.commit();
			System.out.println(rows);
		}finally {
			openSession.close();
		}
	}
	
	@Test
	public void testUpdateTeacher() throws IOException{
		SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
		SqlSession openSession=sqlSessionFactory.openSession();
		try {
			TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
			Teacher teacher=new Teacher();
			teacher.setName("mmm");
			teacher.setAge(23);
			teacher.setGender("女");
			teacher.setId(123);
			teacher.setEmail("234@qq.com");
			int rows=mapper.updateTeacher(teacher);
			System.out.println(rows);
		}finally {
			openSession.close();
		}
	}
	
	@Test
	public void testDeleteTeacher() throws IOException{
		SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
		SqlSession openSession=sqlSessionFactory.openSession();
		try {
			TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
			int rows=mapper.deleteTeacherById(1);
			openSession.commit();
			System.out.println(rows);
		}finally {
			openSession.close();
		}
	}
	

}

配置文件

先创建文件file,命名为log4j.properties
在这里插入图片描述

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

创建xml文件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击finish,完成创建

配置mybatis-config.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.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/computer_dept" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
	<mappers>
		<mapper resource="TeacherMapper.xml" />
	</mappers>
</configuration>

再创建它的映射文件
在这里插入图片描述
同样选DTD file
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置TeacherMapper.xml文件

//根据自己所需要的数据库操作来写代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mybatis.org/dtd/mybatis-3-mapper.dtd" "mybatis-3-mapper.dtd" >
<mapper namespace="lab_mybatis2.mybatis.dao.TeacherMapper">
  <select id="getTeacherById" resultType="lab_mybatis2.mybatis.bean.Teacher">
  	select id,name,gender,age,email from teachers where id=#{id} 
  </select>
  
  <insert id="addTeacher" parameterType="lab_mybatis2.mybatis.bean.Teacher">
  	insert into teachers (id,name,gender,age,email) values(#{id},#{name},#{gender},#{age},#{email})
  </insert>
  
  <update id="updateTeacher" parameterType="lab_mybatis2.mybatis.bean.Teacher">
  	update teachers set id=#{id},name=#{name},gender=#{gender},age=#{age},email=#{email} where id=#{id}
  </update>
  
  <delete id="deleteTeacherById" parameterType="Integer">
  	delete from teachers where id=#{id}
  </delete>
</mapper>

最终效果

在这里插入图片描述
测试效果
在这里插入图片描述
数据库
在这里插入图片描述

测试中的问题

  • 数据中没有数据,但是数据操纵语言并没有出错。那么就会出问题在没有及时更新到数据库中。
openSession.commit();//commit() 手动提交		数据库操作完成之后,要提交事务,数据库才会更新数据
openSession.commit(true);	//自动提交
  • Unknown column ‘name’ in 'field list’

这个是跟自己的数据库表中的字段名有关系,要保证代码写的字段名数据库名一致
(记住字段名前面不要加空格,因为空格不好看出来)空格!!!

  • Mybatis 报错 java.io.IOException: Could not find resource mybatis-config.xml
    这个是自己在新建folder文件夹时,没有创建对。
    在这里插入图片描述
    修改一下:就OK了
    在这里插入图片描述
  • mybatis发现错误Error parsing SQL Mapper Configuration 和Unknown DataSource property
    这个错误大部分是自己的代码写错了,要不就是单词写错了。
    注意单词拼写!!!
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值