myBatis个人学习笔记

(仅学习过程的总结,仅供备忘,可能存在错误)

一、配置形式进行

1.导包:myBatis.jar和数据库的jar包(如mysql-connector-java-8.0.15.jar)

2.创建实体类(orm):如Person

3.在同路径下配置personMapper.xml(其实该xml文件是实现把sql语句从代码中抽离写在这里)
    namespace通常取 包名.该mapper名;
	配置sql语句时要写id,后面通过namespace+id唯一确定sql语句
		<?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="myBatisDemo.personMapper">  
				<select id="qureyPersonById" resultType="myBatisDemo.Person" parameterType="int">    
				   select * from person where id = #{id}  
				</select> 
				
				<insert id="insertImf" parameterType="myBatisDemo.Person">
				   insert into person value(#{id},#{name},#{age})	
				</insert>
				
				<delete id="deleteImf" parameterType="int">
				 delete from person where id = #{id}
				</delete>
				
				<update id="updateImf" parameterType="myBatisDemo.Person">
				  update person set name=#{name},age=#{age} where id = #{id}
				</update>
				
				<select id="selectAll" resultType="myBatisDemo.Person">
				
				  select * from person
				</select>
			</mapper>
4.配置myBatis配置文件conf.xml(src目录下)
    该配置文件配置连接数据库的用户名、密码、url等,
    以及引入mapper文件
			<?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.cj.jdbc.Driver"/>       
					   <property name="url" value="jdbc:mysql://localhost:3306/mysql_db?serverTimezone=UTC"/>        
					   <property name="username" value="root"/>        
					   <property name="password" value="1234"/>     
					 </dataSource>    
			   </environment>  
			  </environments>  
			  
			  <mappers>    
			   <mapper resource="myBatisDemo/personMapper.xml"/>     
			  </mappers> 
			</configuration>
5.进行数据库操作
	  //读入配置文件,放入SqlSessionFactoryBuilder工厂,获得SqlSession对象
	   Reader reader = Resources.getResourceAsReader("conf.xml");
	   SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);		
	   SqlSession	 session = sessionFactory.openSession();
	   
	   //根据namespace+id唯一确定sql语句,执行操作
	    String statement = "myBatisDemo.personMapper.qureyPersonById";
		Person person = session.selectOne(statement, 1);
	
	  //  session.insert(statement, person);
	  //  session.commit();

二、基于代理方式(约定由于配置)
具体步骤:

1.基础环境如上配置形式,导包、xml文件

2.不同之处:
不再用statement(即namespace+id),而是根据约定可直接定位出sql语句。
即编写一个接口,接口中:
1.接口的类名与mapper文件的namespace名一致(所以两个文件放一起)
2.接口的方法名与mapper文件的语句的id名一致
3.方法的返回值与resultType一致
4.方法的输入参数与parameterType一致

  1. //读入配置文件,放入SqlSessionFactoryBuilder工厂,获得SqlSession对象
	   Reader reader = Resources.getResourceAsReader("conf.xml");
	   SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);		
	   SqlSession	 session = sessionFactory.openSession();
	   PersonMapper sm = session.getMapper(PersonMapper.class);//利用反射调用接口(该接口不需要实现类)
	   sm.queryPersonById(1);//调用接口中的方法

三、设置别名
在conf.xml文件:

  <typeAliases>
  <!-- 单个设置别名 -->
  <typeAlias type="myBatisDemo.Person"  alias="person"/>
    <!-- 批量设置别名 ,自动设置-->
   <package name="myBatisDemo.Person" />
  </typeAliases>
	

四、输入参数parameterType(输入参数也可以是HashMap<>,key值与配置文件中的#{}对应)

  1. #{} 和 ${}

    1)区别:

        a.类型为 简单类型(8个基本类型+String):#{任意值},${vulue}
          类型为对象,#{属性值},${属性值}
    
        b.#{}自动给String类型加上'',${}则原样输出(适用于动态排序)
            例:String类型的value, #{value} = '${value}';
                动态排序:select  * from student order by ${value} asc
    	c.#{}可以防止sql注入,${}不防止
    

    2)相同:

      都可以获取对象的值(嵌套类型对象)
        a.获取对象的值
    	模糊查询 select stuno,stuname,stuage from student where stuage = #{stuage} or stuname like #{stuname}
                  Student student = new Student();
    			  student.setStuAge(24);
    			  student.setStuName("%w%");
    			      ......
                   或
    select stuno,stuname,stuage from student where stuage = #{stuage} or stuname like '%${stuname}%'
    
        b.嵌套类型对象
    	   #{address.homeAddress}
    	
    	   Student student = new Student();
    	   Address address = new Address();
           address.setHomeAddress("mm");
    	   address.setSchoolAddress("kk");
    	   student.aetAddress(address);
    	   session.query(student);
    

五、myBatis调用存储过程(代理方式)(输入参数是HashMap<>)

1.在数据库写好存储过程
create PROCEDURE pro1(in gname VARCHAR(255), out scount INT)
BEGIN
select count(*) into scount from  person where  name = gname;
END
在这里插入代码片	2.在mapper配置文件中调用
	   	<select id="callbackFn" statementType="CALLABLE" parameterType="HashMap">
	   	{CALL pro1(#{gname,jdbcType=VARCHAR,mode=IN},#{sCount,jdbcType=INTEGER,mode=OUT})}	   		   	
	   	</select>
		
		注:statementType="CALLABLE"     parameterType="HashMap"
	
	3.通过hashmap传参即获得返回结果
	
	                personMapper personMapper =   session.getMapper(personMapper.class);
			        Map<String, Object> param = new HashMap<String, Object>();
			        param.put("gname", "da");
			        personMapper.callbackFn(param);//传参
			       System.out.println(param.get("sCount")); //获得返回值
				   
	注:增删改需要提交事务session.commit();

六、输出参数resultType

1.简单类型(8个基本类型+String)
2.实体对象类型、实体对象类型(用lis接收)
3.HashMap


<select id="st" resultType="HashMap">
   <!-- 别名作为map的key-->
  select stuno "no",stuname "name" from student where stuno = 1
</select>

注:HashMap虽然是一个集合,但他仅获得一个数据项的多个元素(如一个学生的学号、姓名),若要
获得多个,可以List<HashMap<String,Object>> resultList = studentMpapper.queryBy…();

注:当数据库表的字段名与实体类的属性名不一致时,可以通过resultMap来实现映射

<select id="st" resultMap="mapId"  >
  select id ,name from student where id = 1
</select>

<resultMap type="student" id="mapId">
   <id property="stuNo" column="id" />//主键用id
   <result property="stuName" column="name"/>
	
</resultMap>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值