转载

MyBatis入门学习笔记

SqlMapConfig.xml下的配置:

配置内容和顺序:

  • properties(属性)
    • property
  • setting(全局参数设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境信息集合)
    • environment(单个环境信息)
      • transactionManager(事务)
      • dataSource(数据源)
  • mappers(映射器)

properties:属性

  1. 可用于加载配置文件
    • 属性:
      • resource:配置文件地址
  2. 可修改某个配置属性
    • property
      • name:属性名称
      • value:属性值
  3. 加载的顺序
    • 先加载properties中property标签声明的属性
    • 再加载properties标签引入的配置文件中的属性,覆盖与property标签中相同的属性
    • parameterType的值会和properties的属性值发生冲突(最后读取parameterType传递的属性?)
  • 建议:如果引入配置文件,就尽量不要再property中声明属性

typeAliases:类型别名

  1. 在SqlMapConfig的xml中可以为某个类的全限定名设置一个别名,在设置完之后可以使用别名而不使用全限定名称。
  2. 此处的别名可按单个类进行定义,也可按一个包进行定义,按包定义后,默认的别名是类名,首字母大小写均可

MyBatis自带支持的别名:

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal

mappers:映射

  1. 属性:
    • resource:使用相对于类路径的资源
    • url:使用完全限定路径
    • class:使用mapper接口的全限定名。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
  2. 标签:
    • package:注册指定包下的所有映射文件。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
  3. 完成mapper文件的编写后,必须要在SqlMapConfig.xml下进行加载

Mapper代理:

在使用MyBatis的命名sql时 除了用字符串调用指定名称的sql外,还可以通过mapper代理的方式来调用sql,但是需要按照规范进行开发:

  1. mapper接口的全限定名要和mapper映射文件的命名空间一致
  2. mapper接口的方法名要和mapper映射文件的statement的id一致
  3. mapper接口的传入参数要和mapper映射文件的statement中的parameterType的值一致,且它的参数是一个
  4. mapper接口的方法返回值要和mapper映射文件的statement中的resultType的值一致(如果返回的是集合 则泛型要一致)

注意:Mapper代理使用的是jdk的代理策略

映射文件下的配置

基本语句

select

  1. parameterType: 传入参数 可以为基本类型也可以为Bean类型
  2. parameterMap: 传入映射参数,过时了 官方文档都表示将来可能删除
  3. resultType: 传出参数 可以为基本类型
  4. resultMap: 传出结果映射,当查询结果有多个对象时使用,可以将查询结果封装为对象,需要先声明一个resultMap的配置

insert

  • selectKey标签:查询主键,在标签内需要输入查询主键的sql。(用处:可以编写在insert语句发生后回传主键的sql,也可以编写在insert语句发生前传入主键的sql)
    • 属性:
      1. order:相对于insert语句来说,指定查询主键的sql和insert语句的执行顺序
      2. resultType:该标签下sql的返回类型

#{}和${}区别

  • #{}表示占位符?,#{}接收简单类型时,大括号内的变量可以是任意值
  • ${}表示拼接符,${}接收简单类型时,大括号内的变量必须是value,且传入的值会原样输出,但是存在sql注入风险

动态SQL

标签

sql

表示sql片段。可以让代码有更高的复用性,需要先定义后使用。在需要使用时 引用以下代码:

<include refid="sql片段id"></include>

foreach

可以循环传入参数值(传入值应为一个集合)

where

默认去掉后面第一个AND,如果没有参数会自动删除WHERE关键字

if

可以对输入的参数进行判断

实际运行Demo

主运行程序

public static void main(String[] args) {
    //获取配置文件的路径
    String resource="SqlMapConfig.xml";
    //加载配置文件
    InputStream inputStream = Resource.getResourceAsStream(resource);
    //创建session工厂 工厂建议只创建一次
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().builder(inputStream);
    
    //打开session
    SqlSession session = sqlSessionFactory.openSession();
    //通过Mapper代理方式,根据用户id查询用户信息
    Mapper userMapper = session.getMapper(User.class);
    User userByMapper = userMapper.findUserById(1);
    //通过字符串调用指定sql语句的方式
    User userByStr = session.selectOne("com.mybatis.mapper.UserMapper.findUserById", "1");
    System.out.println(userByMapper);
    //关闭session
    session.close();
}

SqlMapConfig.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="db.properties">
	</properties>
	<!-- 配置别名 -->
	<typeAliases>
		<typeAlias alias="User" type="com.mybatis.domain.User"></typeAlias>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${db.driver}" />
				<property name="url" value="${db.url}" />
				<property name="username" value="${db.username}" />
				<property name="password" value="${db.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/mybatis/mapper/UserMapper.xml" />
	</mappers>
</configuration>

db.properties配置文件

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/ee19_crmdb
db.username=root
db.password=8469

UserMapper.xml配置文件 (需与UserMapper.java放在同一包下)

<?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="com.mybatis.mapper.UserMapper">
	<select id="findUserById" parameterType="string"
		resultType="com.mybatis.domain.User">
		select * from user where id = #{id}
	</select>
	<select id="findUsersByCondition" parameterType="User"
		resultType="User">
		select * from user
		<where>
			<if test="user != null">
				<if test="username != null and username != ''">
					AND username LIKE '%${username}%'
				</if>
				<if test="sex != null and sex != ''">
					AND sex = #{sex}
				</if>
			</if>
		</where>
	</select>
	<insert id="insertUser" parameterType="User">
		<!-- 如果没有这段代码 则不会将id设置给插入的user对象 -->
		<selectKey keyProperty="id" resultType="int" order="AFTER">
			SELECT
			LAST_INSERT_ID()
		</selectKey>
		INSERT INTO USER
		(username,birthday,sex,address)
		VALUES(#{username},#{birthday},#{sex},#{address})
	</insert>
</mapper>

MyBatis与Hibernate对较

Mybatis技术特点:

  1. 通过直接编写SQL语句,可以直接对SQL进行性能的优化;
  2. 学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
  3. 由于直接编写SQL语句,所以灵活多变,代码维护性更好。
  4. 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。

Hibernate技术特点:

  1. 标准的orm框架,程序员不需要编写SQL语句。
  2. 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
  3. 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
  4. 程序员不能自主的去进行SQL性能优化。

转载于:https://www.cnblogs.com/runningRookie/p/11108782.html

正文到此结束
本文目录