Mybatis的介绍与单独使用

Mybatis的介绍

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

 

Mybatis的架构图

 

Mybatis的入门程序

首先导入mybatis的相关jar包及数据库驱动

创建数据库表

为该数据库表,创建一个javaBean,用于存储数据

package pojo;
import java.util.*;


public class user {
	private String Uname;
	private int Idcard;
	private String Usex;
	private Date Birthday;
	private String phone;
	private String state;
	private String cardid;
	public String getUname() {
		return Uname;
	}
	public void setUname(String uname) {
		Uname = uname;
	}
	public int getIdcard() {
		return Idcard;
	}
	public void setIdcard(int idcard) {
		Idcard = idcard;
	}
	public String getUsex() {
		return Usex;
	}
	public void setUsex(String usex) {
		Usex = usex;
	}
	public Date getBirthday() {
		return Birthday;
	}
	public void setBirthday(Date birthday) {
		Birthday = birthday;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getCardid() {
		return cardid;
	}
	public void setCardid(String cardid) {
		this.cardid = cardid;
	}
	@Override
	public String toString() {
		return "user [Uname=" + Uname + ", Idcard=" + Idcard + ", Usex=" + Usex + ", Birthday=" + Birthday + ", phone="
				+ phone + ", state=" + state + ", cardid=" + cardid + "]";
	}
	
	

}

根据架构图可知,首先需要的是sqlMapConfig.xml(Mybatis核心配置配置文件)还有各种映射文件

sqlMapConfig.xml的主要是拿来实现各种配置,可以拿来配置数据库连接,指定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>
    
    <!--用于引入外部文件
        比如:将数据库连接的配置信息放在db.properties
        通过properties标签进行引入
        再用el表达式从该引入文件里面取值
     -->
	<properties resource="db.properties" />
	

    
	<!-- 
        <typeAliases>


          <!--
              用于取别名,将pojo.user取名为user
              比如入参类型为pojo.user,引入这个标签后,就可以直接写user
           -->
		  <typeAlias type="pojo.user"  alias="user"/>

          <!--
              它会扫描pojo包及其子包
              比如入参类型为pojo.user,而如果我们写成user是找不到的
              但是如果引入这个标签,它就会去pojo包下扫描找到user
           -->
		  <package name="pojo" />  //扫描包


	    </typeAliases> 
    -->


    <!--1.1配置环境 ,默认的环境id为mysql -->
	<environments default="mysql">
		<!--1.2.配置id为mysql的数据库环境 -->
		<environment id="mysql">
			<!-- 使用JDBC的事务管理 -->
			<transactionManager type="JDBC" />
			<!--数据库连接池  默认使用Mybatis自带的连接池 -->
			<dataSource type="POOLED">
				<!-- 数据库驱动 -->
				<property name="driver" value="${jdbc.driver}" />
				<!-- 连接数据库的url -->
				<property name="url" value="${jdbc.url}" />
				<!-- 连接数据库的用户名 -->
				<property name="username" value="${jdbc.username}" />
				<!-- 连接数据库的密码 -->
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<!--2.配置Mapper的位置 -->
	<mappers>
		<mapper resource="map/user.xml" />
	</mappers>
</configuration>

而各个映射文件的作用主要是拿来写SQL语句,来对表进行相关的增删改查操作,由于我用的是user表,所以我就将这个映射文件取名为user.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">

——————————————————
写SQL语句

 

  • 入门级增删改查

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

<!--  
parameterType:输入参数类型

resultType:输出参数类型

#{}:占位符,自带引号
select * from users where id = 1  当条件是一个数字时,加引号跟不加引号就没什么区别
select * from users where name = 'zp',当条件是一个字符串时,不加引号就会报错。
所以加上引号便能实现通用的效果

如果传入的参数是基本数据类型,那么占位符可以任意写,可以写#{v},也可以写#{a},#{b}
如果传入的参数是pojo类型或者QueryVo等复杂数据类型,那么传入参数就必须是属性名

模糊查询的写法是"%"#{}"%"


${}:占位符,不带引号

如果传入的参数是基本数据类型,那么占位符必须写成${value}
如果传入的参数是pojo类型或者QueryVo等复杂数据类型,那么传入参数就必须是属性名

模糊查询的写法是'%${value}%'

-->  

<
<!-- 
     命名空间:主要是用来区别不同的mapper,比如在另外一个xml中,也有findUserById那么没有命名空
             间就很难去区分他们,但是有了命名空间,我们可以通过test.findUserById进行区分 

-->
<mapper namespace="test">

    <!-- 根据id查询用户 -->
	<select id="findUserById"  parameterType="Integer" resultType="pojo.user">
		select * from users where Idcard = #{v}
	</select>
	

    <!-- 根据姓名模糊查询用户 -->	
	<select id="findUserByUsername" parameterType="String" resultType="pojo.user">
		select * from users where Uname like "%"#{v}"%"
	</select>
	

    <!-- 增加用户 -->
	<insert id="insertUser" parameterType="pojo.user">
        
                <!-- mysql提供的,在用户id自增的情况下,在增加用户后,需要获取用户id -->		
                <selectKey keyProperty="Idcard" resultType="int" order="AFTER">
			select LAST_INSERT_ID()  
		</selectKey>


		insert into users(Uname,Usex,Birthday,phone,state,cardid) 
		values(#{Uname},#{Usex},#{Birthday},#{phone},#{state},#{cardid})
	</insert>
	

    <!-- 更新用户信息 -->
	<update id="updateUser" parameterType="pojo.user">
		update users
		set Uname = #{Uname},Usex=#{Usex}
		where Idcard = #{Idcard}
	</update>
	

    <!-- 删除用户 -->
	<delete id="deleteUser" parameterType="Integer">
		delete from users
		where Idcard = #{v}
	</delete>
	
</mapper>

    由于现在只是单独使用Mybatis,所以只能通过单元测试来进行调用,新建一个测试类MybatisTest.java

public class MybatisFirstTest {
	
	 //根据id查询用户
         public void testMybatis() throws Exception{
	    //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	   //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    //执行sql
	    user user1 = sqlSession.selectOne("test.findUserById",5555562);
	    System.out.print(user1);
	}

	

    
	//根据姓名模糊用户
	public void testfindUserByUsername() throws Exception{
	    //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	    //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    //执行sql
	    List<user> selectList = sqlSession.selectList("findUserByUsername","z");
	    for(user user1 :selectList){
	    	System.out.println(user1.getCardid());
	    }
	}
	
	
      //增加用户
	  public void testInsertUser() throws Exception{
        //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	    //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    //执行sql
	    user user = new user();
	    user.setUname("qwe");
	    user.setCardid("445121199806284533");
	    user.setBirthday(new Date());
	    user.setPhone("Aaa");
	    user.setUsex("男");
	    int insert = sqlSession.insert("test.insertUser", user);
	    sqlSession.commit();
	    System.out.println(user.getIdcard());
	}
	
	
    //更新用户
	public void updateUser() throws Exception{
	    //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	    //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    //执行sql
	    user user = new user();
	    user.setUname("曾琪");
	    user.setCardid("445121199806284533");
	    user.setBirthday(new Date());
	    user.setPhone("Aaa");
	    user.setUsex("男");
	    user.setIdcard(5555561);
	    int insert = sqlSession.update("test.updateUser", user);
	    sqlSession.commit();
	}
	

	
    //删除用户
	public void deleteUser() throws Exception{
	    //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	    //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    //执行sql
	    int insert = sqlSession.delete("test.deleteUser", 5555561);
	    sqlSession.commit();
	}

}
  • Mapper实现动态代理

     创建一个UserMapper接口

public interface UserMapper {
	//遵循四个原则
	//接口 方法名 = user.xml中的id
	//返回值类型 与 Mapper.xml文件中返回值类型要一致
	//方法的入参类型与Mapper.xml中的入参类型要一致
	public user findUserById(Integer id);
}

   修改user.xml的命名空间,实现user.xml与UserMapper之间的一一对应

<mapper namespace="map.UserMapper"></mapper>

  再新建一个测试类进行测试

public class MybatisMapperTest {
	
	
	public void testMapper() throws Exception{
	    //加载核心配置文件
	    String resource = "sqlMapConfig.xml";
	    InputStream in = Resources.getResourceAsStream(resource);
	    //创建SqlSessionFactory
	    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	    //创建Sqlsession
	    SqlSession sqlSession = sqlSessionFactory.openSession();
	    
	    //sqlSession帮我生成一个实现类(给接口),得到一个代理对象
	    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	    
	    user user = mapper.findUserById(5555557);
	    System.out.print(user.getBirthday()+user.getPhone());
	}
}

 

Mybatis的优点

  • 在sqlMapConfig.xml中配置数据连接池,使用数据池管理数据库链接,避免频繁的创建和释放连接
  • mapper.xml文件与java代码分离,有利于后期的维护
  • Mybatis自动将java对象映射至sql语句,也就是将java对象作为输入参数类型(原生jdbc只能一个一个参数输入)
  • Mybatis自动将sql执行结果映射到java对象,也就是将java对象或者java对象集合作为输出参数类型(原生jdbc只能一个一个参数输出)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值