我的mybatis学习笔记之一

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>
	
	<!-- 读取配置文件的位置 -->
    <properties resource="org/cosolas/cn/dao/impl/jdbc.properties"/>

     <environments default="oracle">
     <!-- ******************** -->
         <environment id="oracle">
            <transactionManager type="JDBC"></transactionManager>
            <!-- 声明使用连接池,不用UNPOOLED,下边是连接数据库的信息 -->
            
            <dataSource type="POOLED">
              <property name="driver" value="${driver}"/>
              <property name="url" value="${url}"/>
              <property name="username" value="${username}"/>
              <property name="password" value="${password}"/>
            </dataSource>
            			
         </environment>
     </environments>
     
     <!-- 6,将sql映射注册到全局配置中 -->
     <!-- 注册各种映射文件 -->
     <mappers>
     
       <mapper resource="org/cosolas/cn/dao/impl/BankDaoImpl.xml"/>
       <mapper resource="org/cosolas/cn/testdao/impl/AddressDao.xml"/>
       <mapper resource="org/cosolas/cn/testdao/impl/StuDao.xml"/>
       <!-- 使用注解的方式执行sql -->
       <mapper class="org.cosolas.cn.dao.impl.BankDaos"/>
     </mappers>
     
</configuration>

BankDaoImpl.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "../mybatis-3-mapper.dtd" >

<!-- 指定当前mapper文件需要实现的接口 -->
<mapper namespace="org.cosolas.cn.dao.BankDao">

	<!-- 1,多个参数传入的时候,在接口的参数类型前边加@Param("name")在配置文件中直接用@{name}直接可以取出 -->
	<!-- 2,进行模糊查询,在sql语句中写:  '%'||#{name}||'%' ,进行字符串的拼接-->
	<!-- 3,配置文件中的大于小于号,用 &gt;  &lt; 在执行sql语句的时候. 或者: <![CDATA[>]]>表示大于号,表示普通文本,脚本语言处理特殊符号的通用解决方案 -->
	<!-- 4,对象中的字段和实体的字段不一致,sql语句起别名或者用mybatis起别名 -->

	<!-- 接口里的查询 :方法,参数类型,返回类型-->
	<select id = "queryBankById" parameterType = "Integer" resultType = "org.cosolas.cn.entity.Bank">
		select * from bank where id = #{id}
	</select>
	
	<!-- 查询的集合 -->
	<select id = "queryAll"  resultType = "org.cosolas.cn.entity.Bank">
		select * from bank 
	</select>
   
   <!-- 添加 -->
	<insert id = "insertBank" parameterType = "org.cosolas.cn.entity.Bank">
		<!-- 给参数属性赋值, -->
		<selectKey resultType = "java.lang.Integer" keyProperty = "id" order="BEFORE">
			select s_bank.nextval from dual
		</selectKey>
		
		insert into bank values(#{id}, #{name}, #{balance}, #{day})
	</insert>

	<update id = "updataBank" parameterType = "org.cosolas.cn.entity.Bank">
		update bank set name = #{name} where id = #{id}
	</update>
	
	<delete id = "dateBank" parameterType = "Integer">
		delete * from bank where id = #{id}
	</delete>
</mapper>

StuDao.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="org.cosolas.cn.testdao.StuDao">
	
	<!-- 插入过程中的null值, #{属性名,jdbcType = DATE | VARCHAR NUMERIC } -->

	<!-- 1,多个参数进行处理,多个参数会被封装到一个map中,
		通过key进行取值,#{0},#{param1}...
		 2,在参数之前用@Param("id"),给map指定键,取的时候就用键
		  //尽量使用数据模型中的数据			 
		 3,通过直接传输对象进行传输, #{对象的属性}
		  //参数多,不是业务模型的数据,不经常使用,用map
		 4,通过map集合进行传输	值是对象#{对象的属性}
		  //经常使用的自定义实体,用来传输数据
		 5,定义一个数据传输对象,
		 6,传入的参数是list有特殊处理取值 #{list[0]}
	 -->

<!--	mybatis自增主键,利用statement.getGenreateKeys();	 
	添加的时候不需要关注主键,添加的时候返回主键,添加给对应的属性就可以
	<insert id="insertStu" parameterType="org.cosolas.cn.entity.T_Stu"" useGeneratedKeys="true"
		keyProperty = "id">
 -->
	
	
	<!-- oracle的主键自增策略 -->
	<insert id="insertStu" parameterType="org.cosolas.cn.entity.T_Stu">
		<selectKey resultType="Integer" keyProperty="id" order="BEFORE">
				select seq_t_stu.nextval from dual
		</selectKey>
			insert into t_stu values(#{id},#{name},#{age},#{address.id})
	</insert>
	
	<!-- 复杂的结果查询 ,定义一个手册说明复杂类型的封装过程-->
	<resultMap type="org.cosolas.cn.entity.T_Stu" id="T_Stu01">
		<!-- 主属性 -->
		<id column="id" property="id" />
		<!-- 业务属性 -->
		<result column="name" property="name"/>		
		<result column="age" property="age"/>		
		<!-- 关系属性 -->
		<association property="address" javaType="org.cosolas.cn.entity.T_Address">
			<result column="aid" property="id"/>
			<result column="shen" property="shen"/>
			<result column="shi" property="shi"/>
			<result column="xian" property="xian"/>
			<result column="cunzheng" property="cunzheng"/>
		</association>
	</resultMap>
	
	<!-- 连表查询,引入查询的手册 -->
	<select id="queryAll" resultMap="T_Stu01">
		select s.*,a.id aid,a.shen,a.shi,a.xian,a.cunzheng from t_stu s left join t_address a on s.t_address = a.id
	</select>
</mapper>

BankDaos[使用注解的类]

package org.cosolas.cn.dao.impl;

import java.util.List;

import org.apache.ibatis.annotations.Select;
import org.cosolas.cn.entity.Bank;

public interface BankDaos {	

	@Select("select * from bank where id = #{id} ")
	public Bank queryBankById(Integer id);
}

接口映射工厂和包装后的.

package org.cosolas.cn.dao.impl;

import java.io.Reader;
import java.util.Date;

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.cosolas.cn.dao.BankDao;
import org.cosolas.cn.entity.Bank;
import org.cosolas.cn.util.MybatisUtil;
import org.junit.jupiter.api.Test;

class BankDaosTest {

	@Test
	void testQueryBankById() throws Exception {

		SqlSessionFactoryBuilder build = new SqlSessionFactoryBuilder();
		//获取输入流,读取配置文件
		Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config.xml");
		//获取连接工厂
		SqlSessionFactory factory = build.build(resourceAsReader);
		//打开session,SqlSession和connection一样都是非线程安全的.不能做成员变量使用
		SqlSession sesson = factory.openSession();
		//获取接口实现类对象,会为接口创建一个代理对象,代理对象去执行增删改查.
		//接口式编程,解耦,类型检查.
		BankDaos mapper = sesson.getMapper(BankDaos.class);
		
		Bank q = mapper.queryBankById(1);
		System.out.println(q);
		
	}
	
	@Test
	void testQueryBankById1() throws Exception {
		
		BankDaos mapper = (BankDaos) MybatisUtil.getMapper(BankDaos.class);
		Bank queryBankById = mapper.queryBankById(1);
		System.out.println(queryBankById);
		
	}
}

Mybatis工具类

package org.cosolas.cn.util;

import java.io.IOException;
import java.io.Reader;

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 MybatisUtil {

	private static SqlSessionFactory factory = null;
	
	private static final ThreadLocal<SqlSession> tol = new ThreadLocal<SqlSession>();
	static {
		try {
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
			factory = builder.build(reader);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
	public static SqlSession openSession() throws Exception {
		SqlSession session = tol.get();
		if(session == null) {
			session = factory.openSession();
			tol.set(session);
			
		}
		
		return session;
	}
	
	/**
	 * 线程绑定后可以直接在工具类中移除
	 * @throws Exception
	 */
	public static void close() throws Exception{
		SqlSession session = openSession();
		session.close();
		tol.remove();
	}
	
	public static void commit() throws Exception {
		SqlSession session = openSession();
		session.commit();
		close();
	}
	
	public static Object getMapper(Class a) throws Exception {
		
		SqlSession session = openSession();
		Object mapper = session.getMapper(a);
		return mapper;
		
	}
	public static <T> T getMapper2(Class<T> a) throws Exception {
		
		SqlSession session = openSession();
		T mapper = session.getMapper(a);
		return mapper;
		
	}
			
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值