ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MyBatis学习一

2020-12-14 14:04:07  阅读:130  来源: 互联网

标签:xml String 学习 session student reader MyBatis public


MyBatis

概念:

  • Myabtis是一款优秀的持久层框架,它支持自定义SQL、存储过程、以及高级映射。MyBatis几乎除去了所有JDBC的代码以及设置参数和获取结果集的工作。

  • MyBatis可以通过简单的XML或注解来映射原始数据类型、接口和JavaPOJO(Plain Old Java Object,普通老式Java对象)为数据库中的记录。

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

  • 2013年11月迁移到Github。

如何获得Mybatis?

1、maven仓库

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
</dependency>

2、Github : https://github.com/mybatis/mybatis-3/releases

3、中文官网:https://mybatis.org/mybatis-3/zh/index.html

4、官网:https://mybatis.org/mybatis-3/

持久化

数据持久化

1、持久化就是将程序在持久状态瞬时状态转换的过程

2、内存:断电即失

3、数据库(JDBC)、IO持久化

为什么需要持久化?

  • 有一些东西太重要了,不能让它保存在内存中

  • 内存太贵了

持久层

Dao层、Service层、Controller层....

  • 完成持久化工作的代码块

  • 层界十分明显

为什么需要使用MyBatis?

  • 帮助开发者将数据存入数据库中

  • 传统的JDBC代码台复杂,有冗余、mybatis具有简单、自动化的操作

  • 方便,简洁

优点

  • 简单易学

  • 灵活

  • SQL语句和代码块的分离,提高了可维护性

  • 提供映射标签,支持对象与数据库的ORM字段关系映射

  • 提供对象映射标签,支持对象关系组建维护

  • 提过xml标签,支持编写动态SQL

最重要的一点:使用的人多!

Spring SpringMVC SpringBoot

开发Mybatis

本程序是Java程序,没有涉及到Web模块

jar包 与数据库连接的jar包 mybatis.jar包

1、配置MyBatis

  • confi.xml 配置数据库信息 和 需要加载的映射文件

  • 写一个表 -----> 类

<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/test" />
      <property name="username" value="root" />
      <property name="password" value="1234" />
    </dataSource>
  </environment>
</environments>

<mappers>
  <!-- 加载映射文件 -->
  <mapper resource="com/xingwei/entity/personMapper.xml" />
</mappers>

2、写一个映射文件(XXXMapper.xml) 增删改查标签

<select id="queryPersonById" resultType="com.xingwei.entity.Person" parameterType="int">
		select * from person where id=#{id}
</select>

3、写测试类 (session.selectOne("需要查询的namespace.id","SQL的参数值"))

   public static void main(String[] args) throws IOException {
      //加载MyBatis配置文件(为了访问数据库)
      Reader reader = Resources.getResourceAsReader("conf.xml");
      //SqlSessionFactory - connection
      SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
      //session -connection
      SqlSession session = sessionFactory.openSession();
  
      String statement = "com.xingwei.entity.personMapper.queryPersonById";
      Person person = session.selectOne(statement,1);
      System.out.println(person);
      session.close();
  }

CRUD

1、namespace

namespace中的包名要和 Dao/mapper 接口的包名一致!

2、select

选择,查询语句;

  • id : 就是对应的namespace中的方法名;

  • resultType:Sql语句执行的返回值!

  • parameterType : 参数类型!

基础方式的增删改查

MyBatis约定:输入参数 parameterType和 输出参数 resultType 在形式都只能有一个

如果输入参数:

  • 是简单类型(8个基本类型+String)是可以使用任何占位符,#{xxxxx}

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

  • 输出参数:如果返回值类型只是一个对象(如Student),则无论返回一个还是多个

resultType="com.xingwei.entity.Student"

注意事项

1、如果使用的视为为JBDC,则需要手工提交事务 session.commit()

2、所有的标签select update等,都必须有SQL语句 但是SQL参数可选

  • SQL有参数 session.insert(statement, 参数值);

  • SQL无参数 session.insert(statement);

具体实现

1、conf

<?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值和 environment的id值 来指定运行时的数据库环境-->
	<environments default="development">
		<environment id="development">
			<!-- 事务的提交方式
				JDBC:利用JDBC方式处理事务
				MANAGED:将事务交由  其他组件托管(spring jobss),默认会关闭连接
				<dataSource type="MANAGED">
						<property name="closeConnection" value="false"/>
			 -->
			<transactionManager type="JDBC" /> 
						
<!--
   数据源类型:
   UNPOOLED:传统的JDBC模式(每次访问均需要打开、关闭等数据库操作,但是打开、关闭数据库是比较消耗性能)
   POOLED:使用数据库连接池
   JNDI:从tomcat中获取一个内置的数据库连接池(数据库连接池->数据源)
-->
			<dataSource type="POOLED">
			<!-- 配置数据库信息 -->
				<property name="driver"	 	value="com.mysql.jdbc.Driver" />
				<property name="url" 		value="jdbc:mysql://localhost:3306/test" />
				<property name="username" 	value="root" />
				<property name="password" 	value="1234" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 加载映射文件 -->
		<mapper resource="com/xingwei/entity/studentMapper.xml" />
	</mappers>
</configuration>

2、实体类

package com.xingwei.entity;

public class Student {
	private int stuNo;
	private String stuName;
	private int stuAge;
	private String graName;
  
	public Student() {
	
	}
	public Student(int stuNo, String stuName, int stuAge, String graName) {
		this.stuNo = stuNo;
		this.stuName = stuName;
		this.stuAge = stuAge;
		this.graName = graName;
	}
	public int getStuNo() {
		return stuNo;
	}
	public void setStuNo(int stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public int getStuAge() {
		return stuAge;
	}
	public void setStuAge(int stuAge) {
		this.stuAge = stuAge;
	}
	public String getGraName() {
		return graName;
	}
	public void setGraName(String graName) {
		this.graName = graName;
	}
	
	@Override
	public String toString() {
		return this.stuNo+"-"+this.stuName+"-"+this.stuAge+"-"+this.graName;
	}
}

3、映射文件XXX.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">

<!-- namespace:该mapper.xml映射文件的唯一标识符 -->
<mapper namespace="com.xingwei.entity.studentMapper">	
	<!-- 后续通过namespace.id -->
	<!--parameterType:输入参数类型   resultType:查询返回结果类型 -->
	<select id="queryStudentByStuno" parameterType="int" resultType="com.xingwei.entity.Student">
		select * from student where stuno = #{stuno}	
	</select>
	
	<insert id="addStudent" parameterType="com.xingwei.entity.Student">
		insert into student(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})	
	</insert>
	
	<update id="updateStudentByStuno" parameterType="com.xingwei.entity.Student">
		update student set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
	</update>
		
	<delete id="deleteStudentByStuno" parameterType="int">
		delete from student where stuno=#{stuno}	
	</delete>
		
	<select id="queryAllStudents" resultType="com.xingwei.entity.Student">
		select * from student	
	</select>
	
</mapper>

4、接口: 操作mybatis接口

接口中的方法名就是xml中的id值

1.方法名和mapper.xml文件中标签的id值相同

2.该方法的输入参数和mapper.xml文件中标签的paramterType类型 一致

3.方法的返回值 和mapper.xml文件标签的resultType一致

package com.xingwei.mapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.xingwei.entity.Grade;
import com.xingwei.entity.Student;
import com.xingwei.entity.StudentBusiness;
import com.xingwei.entity.StudentClass;

//操作mybatis接口
public interface StudentMapper {
	/*
	 * 1.方法名和mapper.xml文件中标签的id值相同
	 * 2.该方法的输入参数和mapper.xml文件中标签的paramterType类型 一致
	 * 3.方法的返回值 和mapper.xml文件标签的resultType一致
	 */
	//public abstract 	Student  queryStudentByStuno(int stuno);
	
	//查询单个
	Student  queryStudentByStuno(int stuno);
	//查询全部
	List<Student> queryAllStudents();
	
	void addStudentWithConverter(Student student);
	//增加
	void addStudent(Student student);
	
	//删除
	void deleteStudentByStuno(int stuno);
	//修改
	void updateStudentByStuno(Student student);

}

5、测试类

package com.xingwei.entity;

import java.io.IOException;
import java.io.Reader;
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;

public class Test {
	// 查询单个学生
	public static void queryStudentByStuno() throws IOException {
		// Connection
		// 加载配置文件 conf.xml ->reader
		Reader reader = Resources.getResourceAsReader("conf.xml");
		// reader -> SqlSession操作MyBatis

		// 可以通过build第二参数来指定 数据库环境 建议默认值写死
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

		SqlSession session = sessionFactory.openSession();
		String statement = "com.xingwei.entity.studentMapper.queryStudentByStuno";
		Student student = session.selectOne(statement, 1);
		System.out.println(student);
		session.close();
	}

	// 查询全部学生
	public static void queryAllStudents() throws IOException {
		// Connection
		// 加载配置文件 conf.xml ->reader
		Reader reader = Resources.getResourceAsReader("conf.xml");
		// reader -> SqlSession操作MyBatis

		// 可以通过build第二参数来指定 数据库环境 建议默认值写死
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

		SqlSession session = sessionFactory.openSession();

		String statement = "com.xingwei.entity.studentMapper." + "queryAllStudents";
		List<Student> students = session.selectList(statement);
		System.out.println(students);
		session.close();
	}

	// 增加学生
	public static void addStudents() throws IOException {
		// Connection
		// 加载配置文件 conf.xml ->reader
		Reader reader = Resources.getResourceAsReader("conf.xml");
		// reader -> SqlSession操作MyBatis

		// 可以通过build第二参数来指定 数据库环境 建议默认值写死
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

		SqlSession session = sessionFactory.openSession();

		String statement = "com.xingwei.entity.studentMapper." + "addStudent";
		Student student = new Student(4, "xw", 25, "a1");
		int count = session.insert(statement, student); // statement:指定执行的SQL student SQL中需要的参数
		session.commit(); // 提交事务 DML语句需要提交事务
		System.out.println("增加" + count + "个学生");
		session.close();
	}

	// 删除学生
	public static void deleteStudents() throws IOException {
		// Connection
		// 加载配置文件 conf.xml ->reader
		Reader reader = Resources.getResourceAsReader("conf.xml");
		// reader -> SqlSession操作MyBatis

		// 可以通过build第二参数来指定 数据库环境 建议默认值写死
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

		SqlSession session = sessionFactory.openSession();

		String statement = "com.xingwei.entity.studentMapper." + "deleteStudentByStuno";
		int count = session.delete(statement, 3);
		session.commit(); // 提交事务
		System.out.println("删除" + count + "个学生");
		session.close();
	}

	// 根据学号修改学生
	public static void updateStudentByStuno() throws IOException {
		// Connection
		// 加载配置文件 conf.xml ->reader
		Reader reader = Resources.getResourceAsReader("conf.xml");
		// reader -> SqlSession操作MyBatis

		// 可以通过build第二参数来指定 数据库环境 建议默认值写死
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

		SqlSession session = sessionFactory.openSession();

		String statement = "com.xingwei.entity.studentMapper." + "updateStudentByStuno";
		// 修改的参数
		Student student = new Student();
		// 修改那个人 where stuno=?
		student.setStuNo(2);
		// 修改成什么样子
		student.setStuName("lxs");
		student.setStuAge(22);
		student.setGraName("c1");
		int count = session.update(statement, student);
		session.commit(); // 提交事务
		System.out.println("删除" + count + "个学生");
		session.close();
	}

	public static void main(String[] args) throws IOException {
		queryAllStudents();
//	addStudents();
//	deleteStudents();
		updateStudentByStuno();
		queryAllStudents();
	}
}

注意:如果mybatis的transactionManager使用的JDBC,则需要手工提交事务。 ===>session.commit();

标签:xml,String,学习,session,student,reader,MyBatis,public
来源: https://www.cnblogs.com/xingStudy/p/14132869.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有