Mybatis学习-day01基础入门

0Mybatis介绍

  Mybatis是一个优秀的持久层框架,对jdbc操作数据库的过程进行封装,开发者只需要关注SQL语句本身,不需要花费精力去处理注册驱动、创建connection、创建Statement、手动设置参数、结果集检索等繁杂的过程代码。

 Mybatis通过XML或注解的方式将要执行的statement(statement、preparedstatement、callableStatement)配置起来,通过Java对象和statement中的sql语句映射生成最终要执行的sql语句,最后由Mybatis框架执行sql并将结果映射成java对象返回

 

Mybatis的2个主要配置文件:SqlMapconfig.xml     mapper.xml

       SqlMapconfig.xml是mybatis的全局配置文件,配置了mybatis的运行环境等信息

       mapper.xml sql映射文件,文件中配置了操作数据库的sql语句,此文件需要在SqlMapconfig.xml文件中加载进来

1 mybatis使用步骤

   1.1 导入jar包  mybatis  jar    mybatis-3.2.7

         相关依赖包    asm-3.3.1

                               cglib-2.2.2

                               commons-logging-1.1.1

                              javassist-3.17.1-GA

                              log4j-1.2.17

                              slf4j-log4j12-1.7.5

2 配置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="user">
    <!-- id是sql语句的id   
         parameterType sql语句中参数的类型
         resultType 查询结果的类型
    -->
	<select id="getUserById" parameterType="int" resultType="entity.User">
		SELECT id,username,sex,birthday,address
		FROM
        `user`  
		WHERE id=#{id}
	</select>

	<!-- 根据姓名模糊查询 -->
	<select id="getUserByName" parameterType="string" resultType="entity.User">
		SELECT id,username,sex,birthday,address
		FROM
		`user`
		WHERE username LIKE '%${value}%'
	</select>
</mapper>

$和#的区别

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型或pojo属性值。如果parameterType传输单个简单类型值,#{}中可以是value或其他类型

${}表示拼接sql串,通过${}可以将parameterType中传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型或pojo属性值。如果parameterType传输单个简单类型值,${}中只能是value

3 一般在数据库表设计时,数据库表的列名和对应类的属性相同,但当不相同时,需要在Mapper映射文件里用<resultMap>标签来建立对应关系

<!-- 
  1. type 对应的返回类型,可以是javabean, 也可以是其它
  2. id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id引用
  3. extends 继承其他resultMap标签
 -->
<resultMap type="" id="" extends="">  
  <!-- 
    1. id 唯一性,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键)
    2. property 属性对应javabean的属性名
    3. column 对应数据库表的列名

       (这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)
   -->
  <id property="" column=""/> 
  <!-- 
    result 与id相比,对应普通属性
   -->    
  <result property="" column=""/>
  <!-- 
    constructor 对应javabean中的构造方法
   -->
  <constructor>
    <!-- idArg 对应构造方法中的id参数 -->
       <idArg column=""/>
       <!-- arg 对应构造方法中的普通参数 -->
       <arg column=""/>
   </constructor>
   <!-- 
    collection 为关联关系,是实现一对多的关键 
    1. property 为javabean中容器对应字段名
    2. ofType 指定集合中元素的对象类型
    3. select 使用另一个查询封装的结果
    4. column 为数据库中的列名,与select配合使用
    -->
  <collection property="" column="" ofType="" select="">
    <!-- 
      当使用select属性时,无需下面的配置
     -->
    <id property="" column=""/>
    <result property="" column=""/>
  </collection>
  <!-- 
    association 为关联关系,是实现一对一的关键
    1. property 为javabean中容器对应字段名
    2. javaType 指定关联的类型,当使用select属性时,无需指定关联的类型
    3. select 使用另一个select查询封装的结果
    4. column 为数据库中的列名,与select配合使用
   -->
  <association property="" column="" javaType="" select="">
    <!-- 
      使用select属性时,无需下面的配置
     -->
    <id property="" column=""/>
    <result property="" column=""/>
  </association>
</resultMap>

3 在congfig中导入SqlMapConfig.xml配置文件,此配置文件有2个作用

       a  配置数据库相关设置

       b  引入sql语句的映射配置文件

<?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>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加载sql映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
	</mappers>
</configuration>

4  写MybatisUtil工具类,来获得SqlSessionFactory

package util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtil {
	
	 private static SqlSessionFactory sqlSessionFactory;
	 static{
		 
		 //创建核心配置文件的输入流
		 InputStream inputStream;
		try {
			SqlSessionFactoryBuilder ssbf=new SqlSessionFactoryBuilder();
			inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
			//通过输入流创建SqlSessionFactory
			 sqlSessionFactory= ssbf.build(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
	 }
	 
	 public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
}

5 写Test测试文件

   

package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import util.MybatisUtil;
import entity.User;
public class MybatisTest {
	//根据id查询
	@Test
	public void testGetUserById() throws Exception{
		  SqlSessionFactory factory= MybatisUtil.getSqlSessionFactory();
		   SqlSession sqlSession=factory.openSession();
		   //执行查询,第一个参数:映射的sql id,第二个参数:要执行的sql语句里的参数
		   User user=sqlSession.selectOne("user.getUserById", 1);
		   System.out.println(user);
		   sqlSession.close();
	}
	
	
	//根据姓名模糊查询
	@Test
	public void testGetUserByName() throws Exception{
		
		  SqlSessionFactory factory= MybatisUtil.getSqlSessionFactory();
		   SqlSession sqlSession=factory.openSession();
		   //执行查询,第一个参数:映射的sql id,第二个参数:要执行的sql语句里的参数
		  List<User> userList=sqlSession.selectList("user.getUserByName", "aa");
		  for(User user:userList){
			  System.out.println(user);
		  }
		  //关闭sqlSession
		   sqlSession.close();
	}
	
}

进行数据的增删改时要记得提交事务,否则数据不会改变

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值