zoukankan      html  css  js  c++  java
  • MyBatis学习一

    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();

    做的不好,多多指教
  • 相关阅读:
    分布式任务调度平台XXL-JOB搭建教程
    微服务跨域问题
    getway网关跨域问题记录
    MySQL-数据库简介及mysql5.7安装
    MongoDB-备份和恢复
    MongoDB-复制集rs及sharding cluster
    MongoDB
    Redis-API支持
    Redis-主从复制,哨兵机制及redis cluster
    Redis-简介及基本数据类型
  • 原文地址:https://www.cnblogs.com/xingStudy/p/14132869.html
Copyright © 2011-2022 走看看