MyBatis学习(二)

MyBatis

MyBatis中主要对象的介绍

  • Resources:mybatis中的一个类,主要负责通过文件位置读取主配置文件
    InputStream ins = Resources.getResourceAsStream(String path);

  • SqlSessionFactoryBuilder:用于创建SqlSessionFactory对象,使用build方法创建
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build();

  • SqlSessionFactory:重量级对象,程序创建该对象耗时较长,使用资源较多。因此在整个mybatis项目中,有一个SqlSessionFactory对象就足以满足使用需求。SqlSessionFactory是一个接口,有着许多的实现类如DefaultSqlSessionFactory等。
    openSession()方法一般用于获取SqlSession对象,如:SqlSession sqlSession = factory.openSession();
    无参的openSession方法表明使用该SqlSession执行数据库操作时需要手动提交事务,即sqlSession.commit()
    有参的openSession(boolean b)表示使用该SqlSession执行数据库操作时是否为自动提交事务,参数为true为自动提交事务

  • SqlSession:是一个定义了很多数据库操作方法的接口,由defaultSqlSession等实现类提供实现。方法具体有:
    select()selectList()update()insert()delete()commit()rollback()close()等。
    注意,sqlSession并不是线程安全的,需要在方法内部使用。因此在使用openSession获取SqlSession对象执行完sql语句后,需要使用sqlSession.close()来关闭资源,以保证sqlSession是线程安全的。

//由SqlSession等对象的特性创建MyBatisUtils类
public class MyBatisUtils{
	private static SqlSessionFactory factory = null;
	static{
		String config = "mybatis.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(config);
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
	}

	//创建获取SqlSession对象的方法
	public SqlSession getSqlSession(){
		SqlSession sqlSession = null;
        if (factory != null){
            sqlSession = factory.openSession();
        }
        return sqlSession;
	}
}

MyBatis中的动态代理

  • MyBatis中传统的DAO操作为

    1. 使用sqlMapper文件和DAO接口结合,用来存放sql语句
    2. 创建DAO接口的实现类,在实现类中使用SqlSession对象来调用方法,执行数据库操作。
  • 使用动态代理的前提条件

    1. 在sqlMapper文件中,mapper标签的namespace保存了对应DAO接口的全限定名称。通过反射可以获取到Class对象。
    2. 在sqlMapper文件中,select等标签的id属性保存了对应DAO接口中对应方法的名称,通过反射也可以获取到该方法。
      因此可以使用动态代理的方式实现DAO操作,从而取代DAO实现类的创建
  • MyBatis的动态代理
    mybatis根据dao的方法调用获取到执行sql语句的信息,并动态创建出DAO接口的实现类。从而创建出该实现类的对象来完成sqlSession的方法,从而完成数据库的操作。

  • 使用MyBatis的动态代理机制,可以代替DAO接口的实现类声明
    sqlSession.getMapper(StudentDao.class);,该方法用于获取DAO接口的实现类对象

MyBatis中的参数传递

传入参数指的是从java代码中将数据传入sqlMapper文件中的sql语句中。(如把student对象作为参数,将其中的id属性值传递给sql语句中)

  • parameterType
    是写在sqlMapper文件中的一个属性,用于表示DAO接口中方法参数的数据类型。值为java数据类型的全限定名称或者mybatis定义的别名。(一般来说参数可以被mybatis识别,因此parameterType属性可以不写)
    public Student selectStudentById(Integer id);对应的sql映射文件:
<mapper namespace="com.jarvis.dao.StudentDao">
	<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.jarvis.entity.Student">
		select id,name from student where id = #{id}
	</select>
</mapper>
  • 传入一个简单类型的参数
    包括java的基本数据类型、包装类和String。将简单类型的参数传递给mapper文件中的sql语句可以使用#{任意字符}。使用#{}后,mybatis会使用preparedStatement对象来执行sql语句,即使用占位符来实现。

  • 命名参数(用于传入多个参数)
    使用注解@Param来命名参数,在sql映射文件的sql语句中使用@Param的value值。如public Student selectStudent(@Param("stuname")String name , @Param("stuId")Integer id);

<mapper namespace="com.jarvis.dao.StudentDao">
	<select id="selectStudent" resultType="com.jarvis.entity.Student">
		select id,name from student where name = #{stuName} and id = #{stuId}
	</select>
</mapper>
  • 使用对象传参
    使用java对象传递参数,java对象的属性值就是sql需要的参数值,每一个属性就是一个参数,语法格式为
    #{property , javaType="java中的数据类型名称" jdbcType=“数据库中的数据类型名称”}。但是MyBatis可以检测到javaType和jdbcType,可以省略不写,因此只需要使用格式#{property}即可。(即方法中虽然传入的是对象,但是sql语句中只要使用对象中的属性名称就可以识别)

  • 按位置传值
    参数位置从0开始,引用参数语法#{arg位置},如public Student selectStudent(String name , Integer id);:

<mapper namespace="com.jarvis.dao.StudentDao">
	<select id="selectStudent" resultType="com.jarvis.entity.Student">
		select id,name from student where name = #{arg0} and id = #{arg1}
	</select>
</mapper>
  • 使用map传值
    map集合可以存储多个值,这样就可以使用map集合一次性给sql映射文件传递多个值。Map集合使用String为key,Object为value来存储键值对。mapper文件使用#{key值}来引用参数值。如:public Student selectStudent(Map<String , Onbject> map);(map中键值对为myname=value,myid=value):
<mapper namespace="com.jarvis.dao.StudentDao">
	<select id="selectStudent" resultType="com.jarvis.entity.Student">
		select id,name from student where name = #{myname} and id = #{myid}
	</select>
</mapper>
  • #和$的区别
  • #为占位符标志,表示告知MyBatis使用PreparedStatement来执行sql语句,并使用实际参数值填充。执行效率高,还可以避免sql注入,更加安全。
  • $为字符串替换标志,即告诉MyBatis使用实际参数替换实际位置,使用Statement把sql语句和参数值进行内容连接。多用于替换表名或者列名等操作(order by ${colName})。不使用占位符,是字符串连接的方式,效率比较低,还有sql注入的风险。

MyBatis的输出结果

mybatis执行sql语句可以得到java对象或者集合。

  1. resultType结果类型
    指的是sql语句在执行完毕后数据转为的java对象。mybatis执行sql语句,然后调用类的无参构造方法创建对象;随后将ResultSet的指定列值付给对象的指定属性。
    • 返回简单类型(如COUNT(*)时):resultType="java.lang.Integer"或使用别名resultType="int"
    • 返回自定义类型:resultType="com.jarvis.entity.Student"
      当然自定义的类也可以使用别名,只需要在主配置文件中进行配置即可,有两种配置方式:
      • 在主配置文件中使用<typeAliases><typeAlias>结合配置
      • 在主配置文件中使用<typeAliases><package>结合配置

<configuration>
	<typeAliases>
		<!-- 这样就可以在mapper文件中使用别名了-->
		<typeAlias type="com.jarvis.entity.Student" alias="student">

		<!-- 或者也可以使用package标签,表示包下的所有类的类名即为该类的别名,可以在mapper文件中直接使用,无需区分大小写 -->
		<package name="com.jarvis.entity">
	</typeAliases>
</configuration>
  1. 查询返回Map类型
  • sql的查询结果作为map的key和value,推荐使用Map<Object , Object>。但是需要注意的是,Map作为接口的返回值,只能够存储一条查询结果,大于一条时就会出错,因为返回的Map其实是以<列名,列值>的形式存在的,因此只能够存放表中的一行数据。如Map<Object , Object> selectMap(Integer id);,mapper文件中的resultType属性为map。
<mapper namespace="com.jarvis.dao.StudentDao">
	<select id="selectMap" resultType="com.jarvis.entity.Student">
		select id,name from student where id = #{id}
	</select>
</mapper>
  • 使用resultMap
    resultMap叫做结果映射。可以自定义sql语句查询到的结果和java对象属性的映射关系。这样能够更加灵活的将列值赋给对象的参数值。常用于库表列名和对象属性名不一致的情况。
    使用方式为:
    - 在mapper文件中先定义resultMap,用来指定列名和属性名之间的映射关系。使用id标签进行主键映射,使用result标签进行非主键映射。
    - 然后在select标签内使用resultMap代替resultType即可
<resultMap id="studentMap" type="com.jarvis.entity.Student">
        <id column="id" property="stuId"></id>
        <result column="name" property="stuName"></result>
</resultMap>

<select id="selectStudent" resultMap="studentMap">
        select id, name from student    
</select>
  • 当列名和对象属性名不一样时,应该使用resultMap。并且在使用时resultMap和resultType不能够同时出现。当然也可以使用在sql语句中定义别名的方法来代替resultMap:
<select id="selectStudent" resultType="student">
        select id as stuId, name as stuName from student   
</select>
  • MyBatis中的模糊查询
    当sql语句需要使用到模糊查询时,如select * from table where name like "%琳%",如何将%琳%这样的参数传递进sql语句呢?
    • 直接在DAO中传入参数,在java层面直接解决。即sql语句写为select * from table where name like #{name},将“%lin%”作为参数传入即可
    • 在mapper文件中拼接like后的内容,如sql语句写为select * from table where name like "%" #{name} "%",将lin作为参数传入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值