Java框架(七)之Mybatis(简介、mybatis开发dao的方式)

一、Mybatis简介

1.定义

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层(dao)框架。MyBatis 消除 了几乎所有的 JDBC代码和 参数的手工设置 以及对 结果集的检索。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

2.环境搭建

(1)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">
			<!-- 使用jdbc方式控制事务 -->
			<transactionManager type="JDBC"/> 
			<!-- mybatis提供的连接池链接数据
			  未来:mybatis+spring+sprignmvc  这一步交给spring
			 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/> 
				<property name="url" value="jdbc:mysql:///mystu?unicode=true&amp;characterEncoding=utf-8"/>
				<property name="username" value="root"/> 
				<property name="password" value="111"/>
			</dataSource> 
		</environment>
	</environments>
	<!-- mapper配置 -->
	<mappers>
		<mapper resource="com/qf/bean/UserMapper.xml"></mapper>
	
	</mappers>
</configuration>

(2)映射文件

<!-- namespace指定的实体类的全路径 -->
<mapper namespace="com.qf.bean.User">
       <!--根据id查询用户的方法 
       id="selectById"  在同一个文件中唯一
       parameterType="int"  参数类型
       resultType="com.qf.bean.User" 返回值类型
        --> 
	<select id="selectById" parameterType="int" resultType="com.qf.bean.User">
		select * from user where id=#{id}
	</select>
	<!-- 全查 
		resultType:指定该 sql语句的结果集(每一行对应的)
	-->
	<select id="findAll" resultType="com.qf.bean.User" >
		select * from User
	</select>
	<!-- 新增 
		如果参数为对象的话,sql语句中的占位变量应该与数据库中的保持一致
	-->
	<insert id="saveUser" parameterType="com.qf.bean.User">
		insert into User(username,password) values(#{username},#{password})
	</insert>
	<!-- 修改 -->
	<update id="updateUser" parameterType="com.qf.bean.User">
		update User set password=#{password} where id=#{id}
	</update>
	<!-- 删除 -->
	<delete id="deleteById">
		delete from User where id=#{id}
	</delete>
	<!-- 新增+返回自增主键 -->
	<!-- <insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User">
		配置返回自增主键 
		方法一:使用selectKey节点配置
			keyProperty="id":实体类中主键的属性名
			keyColumn="id" :数据库中为主键的列名
			order="AFTER" :执行该sql语句的时机
			resultType="int":该sql语句的返回值类型
		
		<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
			select last_insert_id()
		</selectKey>
		insert into User(username,password) values(#{username},#{password})
	</insert> -->
	<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User" useGeneratedKeys="true"
	keyProperty="id" keyColumn="id">
		insert into user(username,password) 
		values(#{username},#{password})
	</insert>
</mapper>

(3)测试类

public class TestMybatis {
	public static void main(String[] args) {
		//1.指定配置文件
		String Config="MybatisConfig.xml";
		
		try {
			//2.读取配置文件
			Reader reader=Resources.getResourceAsReader(Config);
			//3.构建SqlSessionFactory对象
			SqlSessionFactory  sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
			//4.通过SqlSessionFactory获得SqlSession
			SqlSession sqlSession=sqlSessionFactory.openSession();
			//5.通过SqlSession调用映射文件中的sql文件
			User user=sqlSession.selectOne("selectById", 2);
			System.out.println(user);
			sqlSession.commit();
			sqlSession.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

3.执行流程

在这里插入图片描述

4.插入数据

  • 主键返回之自增主键

第一种:

<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User">
		<!--使用selectKey节点配置
			keyProperty="id":实体类中主键的属性名
			keyColumn="id" :数据库中为主键的列名
			order="AFTER" :执行该sql语句的时机
			resultType="int":该sql语句的返回值类型-->
		
		<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
			select last_insert_id()
		</selectKey>
		insert into User(username,password) values(#{username},#{password})
	</insert>

第二种:

<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User" useGeneratedKeys="true"
	keyProperty="id" keyColumn="id">
		insert into user(username,password) 
		values(#{username},#{password})
	</insert>
  • 主键返回值UUID
    UUID函数是mysql的函数

      <insert id="saveUsersReturnId" parameterType="cm.itqf.pojo.Users">
         		<!-- 
         		select uuid():mysql的函数  能够生成一个随机字符串
         		keyColumn="id"   表中为主键的列名
         		keyProperty="id"  表中为主键的属性名
         		resultType="String"  主键的类型
         		order="BEFORE" 执行时机  在新增语句的前执行
         		 -->
         		<selectKey keyColumn="id" keyProperty="id" resultType="String" order="BEFORE">
         			select UUID()
         		</selectKey>
         		insert into users(id,username,password) values(#{id},#{username},#{password})
          </insert>
    

二、mybatis开发dao的方式

  • 原始dao层开发方式(例)

MybatisUtils工具类

public class MybatisUtils {
	static SqlSession sqlSession;
	static SqlSessionFactory sqlSessionFactory;
	static{
	try {
		sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MybatisConfig.xml"));
		
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	}
	public static SqlSession getSqlSession(){
		return sqlSessionFactory.openSession();
		
	}
}

UserDaoimpl实现类

public class UserDaoImpl implements UserDao{
	public void saveUser(User u) {
		// TODO Auto-generated method stub
		SqlSession sqlSession=MybatisUtils.getSqlSession();
		sqlSession.insert("saveUser",u);
		sqlSession.commit();
		sqlSession.close();
	}
	public User selectById(int id) {
		SqlSession sqlSession=MybatisUtils.getSqlSession();
		User user=sqlSession.selectOne("selectById",id);
		sqlSession.commit();
		sqlSession.close();
		return user;
	}
}

UserMapper 映射文件

 <!-- namespace指定的实体类的全路径 -->
<mapper namespace="com.qf.bean.User">
       <!--根据id查询用户的方法 
       id="selectById"  在同一个文件中唯一
       parameterType="int"  参数类型
       resultType="com.qf.bean.User" 返回值类型
        --> 
	<select id="selectById" parameterType="int" resultType="com.qf.bean.User">
		select * from user where id=#{id}
	</select>
	<!-- 全查 
		resultType:指定该 sql语句的结果集(每一行对应的)
	-->
	<select id="findAll" resultType="com.qf.bean.User" >
		select * from User
	</select>
	<!-- 新增 
		如果参数为对象的话,sql语句中的占位变量应该与数据库中的保持一致
	-->
	<insert id="saveUser" parameterType="com.qf.bean.User">
		insert into User(username,password) values(#{username},#{password})
	</insert>
</mapper>

注意:

SqlSessionFactory,它的生命周期,应该是应用范围,全局范围只有一个工厂,使用单例模式来实现这个功
能。与spring集成之后,由spring来对其进行单例管理。
SqlSession,它内部含有一块数据区域,存在线程不安全的问题,所以应该将sqlsession声明到方法内部。

猜你喜欢

转载自blog.csdn.net/xueer_z/article/details/82899996