转载

MyBatis篇2-使用MyBatis映射器实现数据库操作

使用MyBatis映射器实现数据库操作,常用的三种方式

  1. 纯xml映射器,利用SqlSession的各种方法实现增删改查
  2. xml映射器+接口映射器的混合类型
  3. 注解+接口映射器的混合形式

xml+接口映射器,注解+接口映射器都是开发中常用的方法,具体区别如下:

  • xml映射器+接口映射器,SQL都写在xml中,整体的代码耦合度低,写起来麻烦

  • 注解+接口映射器,SQL写在注解中,整体代码简洁,开发方便,但代码的耦合度高

纯xml映射器

大致上分为四个文件:主配置文件、xml映射器、实体类、调用程序

MyBatis篇2-使用MyBatis映射器实现数据库操作

主配置文件

<?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/demo?useUnicode=true&characterEncoding=UTF-8" />
    				<property name="username" value="root" />
    				<property name="password" value="root" />
    			</dataSource>
    		</environment>
    </environments>
	
		<!-- 主配置文件引入映射器 -->
	<mappers>
		<!-- 
			resource属性,代表当前的 mapper配置是引入的xml映射器
			属性的值,就是把映射器所在的包名中的.替换成/,后面拼接映射器的文件名.后缀名
		-->
		<mapper resource="com/test/day38/StudentMapper.xml" />
	</mappers>
</configuration>
复制代码

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">

<!-- 命名空间可以任选命名,唯一,但最好要定义一定规则,便于后继的使用 -->
<mapper namespace="com.test.day38.StudentMapper">
 
     <!-- 定义插入的sql语句,通过命名空间+id方式被定位
       insert标签表示内容是“插入”的SQL
       id属性,当前这个insert标签唯一标识,这个值是惟一的(在当前的配置文件中)
       parameterType,这个属性表示SQL语句从哪个封装类获取了SQL语句中的参数
       #{id}表示从parameterType中对应的类对象中取id属性
      -->
	<insert id="insert" parameterType="com.test.day38.Student">
		insert into student(id,name) values (#{id},#{name});
	</insert>
	
</mapper>
复制代码

调用程序:测试使用xml映射器操作数据库

public class XmlMapperTest {
    	public static void main(String[] args) throws Exception{
    		//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
    		//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
    		Reader reader = Resources.getResourceAsReader("myBatis-config.xml");
    		
    		//创建SqlSessionFactory工厂
    		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    		
		//得到SqlSession对象,这个对象是操作映射器的对象
		SqlSession session = sqlSessionFactory.openSession();
		
		Student stu = new Student();
		stu.setId(37);
		stu.setName("xml映射器");
		
		/**
		 * session.insert来操作映射器的inset的SQL
		 * 参数1,定位映射器,映射器所在mapper的namespace和自己的id拼接。例如com.test.day38.StudentMapper.insert 
		 * 参数2,是要传递到映射器的参数
		 */
		int res = session.insert("com.test.day38.StudentMapper.insert", stu);//映射器中的parameterType参数指定了stu的来源
		System.out.println(res);
		
		//提交session
		session.commit();
		
		//关闭资源和session
		reader.close();
		session.close();
    }
}
复制代码

测试用的实体类

public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
        	private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
    	
        	public Integer id;
        	public String name;
    
        	public Integer getId() {
        		return id;
        	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
}
复制代码

接口与xml映射器混合

大致上分为五个文件:主配置文件、xml映射器、接口、实体类、调用程序

MyBatis篇2-使用MyBatis映射器实现数据库操作

主配置文件

<?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/demo?useUnicode=true&characterEncoding=UTF-8" />
    				<property name="username" value="root" />
    				<property name="password" value="root" />
    			</dataSource>
    		</environment>
    </environments>
	
		<!-- 主配置文件引入映射器 -->
	<mappers>
		<!-- 
			resource属性,代表当前的 mapper配置是引入的xml映射器
			属性的值,就是把映射器所在的包名中的.替换成/,后面拼接映射器的文件名.后缀名
		-->
		<mapper resource="com/test/day38/StudentMapperIn.xml" />
	</mappers>
</configuration>
复制代码

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">

<!-- 
    	接口与xml映射器混合使用
    	mapper标签的namespace属性值是接口的全名(包名.接口)
 -->
<mapper namespace="com.test.day38.StudentIn">

	<!-- 
    	insert标签代表要写的是插入的SQL
    	id属性,当前这个insert标签唯一标识,这个值是惟一的(在当前的配置文件中),在接口与xml映射器混合使用,标签的id值是与接口的方法名对应
    	parameterType,这个属性是传递到当前这个SQL中的参数的封装类的全名
	 -->
	<insert id="insert" parameterType="com.test.day38.Student">
		insert into student(id,name) values (#{id},#{name});
	</insert>
 
</mapper>
复制代码

接口

package com.test.day38;

public interface StudentIn {
	/**
	 * 接口和映射器混合使用
	 * 方法名与xml映射器中的id值对应
	 * @param stu
	 * @return
	 */
	public int insert(Student stu);
}
复制代码

调用程序:接口和映射器混合使用

public class XmlAndInMapperTest {
    	public static void main(String[] args) {
    		Reader reader = null;
    		SqlSessionFactory sqlSessionFactory = null;
    		SqlSession session = null;
    		try{
    			//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
    			//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
			reader = Resources.getResourceAsReader("myBatis-config.xml");
			
			//创建SqlSessionFactory工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
			
			//得到SqlSession对象,这个对象是操作映射器的对象
			session = sqlSessionFactory.openSession();
			
			Student stu = new Student();
			stu.setId(38);
			stu.setName("接口与xml映射器混合");
			
			//操作接口与xml混合映射器
			/** 这里是不同点
			 * getMapper(接口的class).调用的方法
			 * 纯xml映射器这里是使用session.insert来操作映射器的inset的SQL
			 * 接口和映射器混合使用,使用接口代替session.insert。这样更有利于解耦
			 */
			int res = session.getMapper(StudentIn.class).insert(stu);
			System.out.println(res);
			
			//提交session
			session.commit();
		}catch(Exception e){
			//如果发生异常回滚session
			session.rollback();
		}finally{
			//关闭资源
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			session.close();
		}
	}
}
复制代码

测试用的实体类

package com.test.day38;

public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
        
     	/**
        	 * 之前的java se,序列化
        	 * 一个类的对象,要进行网络传输或者存储,都是二进制的
        	 * 在mybatis中,为什么实体类要实现序列化
    	 * 我们在xml映射器中在做增删改的时候,使用的参数类型,很多时候使用的实体类对象parameterType="Student"
    	 * 增删改实际上就是修改数据库,数据库存在我们的硬盘上,要把一个对象在硬盘上做修改
    	 * 这个对象必须是实现了序列化的
    	 */
    	private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
	
    	public Integer id;
    	public String name;

    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
}
复制代码

注解与接口映射器混合

大致分为四个文件:主配置文件、带注解的接口、实体类、调用程序

MyBatis篇2-使用MyBatis映射器实现数据库操作

主配置文件

<?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/demo?useUnicode=true&characterEncoding=UTF-8" />
    				<property name="username" value="root" />
    				<property name="password" value="root" />
    			</dataSource>
    		</environment>
    </environments>
	
		<!-- 主配置文件引入映射器 -->
	<mappers>
        <!-- 方式一
			class属性,就引入的接口映射器,使用的是注解+接口映射器
			值是接口包名.接口名
		 -->
		<mapper class="com.test.day38.StudentIn2" />
		
		<!-- 方式二
			在使用注解+接口映射器的时候,可能有很多的接口
			如果每个接口都要使用class="xxx"的方式引入就会写好多这样的配置
			为了避免这种情况,可以直接配置包名,这样可以引入这个包下所有的带注解的接口
		 -->
		<package name="com.test.day38" /> 
	</mappers>
</configuration>
复制代码

带注解的接口

package com.test.day38;

public interface StudentIn2 {
    	/**
    	 * @Insert相对应xml映射器的insert标签
    	 * @Insert("")里面的 字符串参数就是insert标签的SQL语句
    	 * @param stu
    	 * @return
	 */
	@Insert("insert into student(id,name) values (#{id},#{name});")
	public int insert(Student stu);
}
复制代码

调用程序:接口和注解混合使用

public class XmlAndInMapperTest {
    	public static void main(String[] args) {
    		Reader reader = null;
    		SqlSessionFactory sqlSessionFactory = null;
    		SqlSession session = null;
    		try{
    			//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
    			//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
			reader = Resources.getResourceAsReader("myBatis-config.xml");
			
			//创建SqlSessionFactory工厂
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
			
			//得到SqlSession对象,这个对象是操作映射器的对象
			session = sqlSessionFactory.openSession();
			
			Student stu = new Student();
//			stu.setId(39);
//			stu.setName("接口与注解混合");
			stu.setId(40);
			stu.setName("测试通过包名引用接口映射器的方式");
			
			//操作接口与xml混合映射器
			/**
			 * getMapper(接口的class).调用的方法
			 * 这个地方调用的时候与操作接口与xml混合映射器一直
			 */
			int res = session.getMapper(StudentIn.class).insert(stu);
			System.out.println(res);
			
			//提交session
			session.commit();
		}catch(Exception e){
			//如果发生异常回滚session
			session.rollback();
		}finally{
			//关闭资源
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			session.close();
		}
	}
}
复制代码

测试用的实体类

package com.test.day38;

public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
        	private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
    	
        	public Integer id;
        	public String name;
    
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
}复制代码
原文  https://juejin.im/post/5e723126f265da576b5684fc
正文到此结束
Loading...