Administrator
发布于 2022-10-26 / 54 阅读
0
0

Mybatis 文件

Mybatis全局配置文件

mybatis-config.xml 就是mybatis的全局配置文件

<?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/mybatis?characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/employee.xml"/>
    </mappers>
</configuration>

configuration标签下能写很多其他子标签

image-1666755804180
 
1、properties(属性)

作用:通过properties标签引入外部内容,即通过${ }动态取出配置文件中的内容

properties标签:和Spring的context:property-placeholder;引用外部配置文件
resource属性:从类路径下引入
url属性:引用磁盘路径或网络路径

2、mapper映射器

 class属性:引用接口全类名
                可以将xml和dao接口放在同一个文件目录下,并文件名和接口名相同
             resource属性:在类路径下找sql映射文件
             url属性:从磁盘和网络路径引用sql映射文件
                        配合使用:重要的dao写配置;简单的用头注解搞定
    package标签:批量注册;要求xml和dao类接口在同一个文件夹下且名字相同(可以使用设置资源文件)
       name属性:dao所在的包名

其他的介绍在mybatis的官方文档都有,直接去看好了,没必要写太多

mybatis中文文档:https://mybatis.net.cn/configuration.html
 

SQL映射文件

即在写sql语句那个xml文件,里面的标签有以下几个

image-1666756331755
 

—cache –命名空间的二级缓存配置
—cache-ref – 其他命名空间缓存配置的引用。
—resultMap – 自定义结果集映射
—parameterMap – 已废弃!老式风格的参数映射,原本是做复杂参数映射的
—sql –抽取可重用语句块。
—insert – 映射插入语句
—update – 映射更新语句
—delete – 映射删除语句
—select – 映射查询语句

记录几个感觉重要一点的例子:

1、如果在插入数据的时候,想获取插入后的自增id是多少怎么办?

eg:useGeneratedKeys(仅适用于 insert 和 update)

</select>
<!--让MyBatis自动的将自增的id赋值给传入的employee对象的id属性
        useGeneratedKeys属性:开启自动赋值id功能
        keyProperty属性:将刚才自增的id封装给那个属性
-->
<insert id="insertEmp" useGeneratedKeys="true" keyProperty="id">
    insert into t_employee(empname,gender,email)values(#{empName},#{gender},#{email})
</insert>


在程序中甚至还可以通过传入的对象.id获取到id
eg:
在调用插入方法后可以---》employee.getid()获取

2、如果主键不是自增的呢?

image-1666766883526
 
通过order属性设置运行顺序,keyProperty属性来设置查询后结果赋值给javabean的哪个对象

3、参数(Parameters)传递

1、单个参数
    基本类型:
        取值:#{随便写}
2、多个参数:
        取值:#{参数名}是无效的的
            0,1(参数索引)或者param1,param2(第几个参数paramN)
    原因:
        只要传入多个参数,mybatis会自动的将这些参数封装到一个map中;封装时使用的key就是参数的索引和参数的第几个标识
        @param:为参数指定封装map时的key;命名参数
        我们可以告诉mybatis,封装参数map的时候别乱来
3、传入map
        封装多个参数为map,直接传递
4、传入bean
        取值:#{bean属性名}

4、#{}和¥{}的区别

•#{key}:获取参数的值,预编译到SQL中。安全。

•${key}:获取参数的值,拼接到SQL中。有SQL注入问题。
	 在不支持参数预编译的地方,需要取值的话可使用$.

5、多条记录返回Map

通过@MapKey()注解来告诉mybatis数据库中哪个字段作为key主键来,封装value

public interface EmployeeDao {

    //key是记录的主键,value就是记录封装好的对象
    //@MapKey根据数据库里面的哪个字段作为key来查询封装value
    
    @MapKey("id")
    public Map<Integer,Employee> getEmpsByIdReturnMap();
}
------------------------------------

<!--查询多个的情况下,resultType属性写value封装的元素类型-->
<select id="getEmpsByIdReturnMap" resultType="com.lly.pojo.Employee">
    select * from t_employee
</select>


6、自定义封装规则resultMap

reesultMap标签自定义封装
	type属性:指定引入哪个javabaen与数据库封装对应
	id属性:指定这个自定义封装的id,便于其他引用
		id标签:指定主键
		result标签:指定其他封装对象
			property属性:指定javabean属性名
			column属性:指定数据库字段名

image-1666769709457

通过resultMap属性引用那个自定义封装规则的id

image-1666769732750

7、级联查询

eg:pojo

public class Lock {
    private Integer id;//锁编号
    private String LockName;//锁名
    
}



public class Key {
    private Integer id;//钥匙编号
    private String keyName;//钥匙名
    private Lock lock;//当前钥匙能开哪把锁
    
}

eg:

//将钥匙和锁信息一起查出
    public Key getKeyById(Integer id);
    
    
    <select id="getKeyById" resultMap="myKey">
        select k.id,k.`keyname`,k.`lockId`,l.`id` lid,l.`lockName` from 
        t_key k left join t_lock l 
        on k.`lockId`=l.`id`where k.`id`=1
    </select>
    <!--自定义封装规则-->
    <resultMap id="myKey" type="com.lly.pojo.Key">
        <id column="id" property="id"/>
        <result column="keyname" property="keyName"/>
        <!--级联配置查询-->
        <result column="lid" property="lock.id"/>
        <result column="lock.LockName" property="lockName"/>
    </resultMap>
</mapper>

8、联合查询association

和7不同的是使用association标签

    <resultMap id="myKey" type="com.lly.pojo.Key">
        <id column="id" property="id"/>
        <result column="keyname" property="keyName"/>
        <!--若这个对象的属性是一个对象,自定义规则;可使用association标签定义联合查询

         private Integer id;//钥匙编号
         private String keyName;//钥匙名
         private Lock lock;//当前钥匙能开哪把锁

                property属性:指定要联合查询的对象
                javaType属性:指定这个javabean属性的类型的全类名
        -->

        <association property="lock" javaType="com.lly.pojo.Lock">
            <!--定义lock属性对于这个Lock对象如何封装
                property属性:指定对于javabean对象的属性
                column属性:指定数据库查询结果的字段名
            -->
            <id property="id" column="id"></id>
            <result property="LockName" column="lockName"></result>
        </association>
    </resultMap>

9、Collection查询

eg:pojo

public class Lock {
    private Integer id;//锁编号
    private String LockName;//锁名
    private List<Key> keys//很多把钥匙可以开这把锁
}


public class Key {
    private Integer id;//钥匙编号
    private String keyName;//钥匙名
    private Lock lock;//当前钥匙能开哪把锁
}


mapper.xml

    <resultMap id="myLock" type="com.lly.pojo.Lock">
        <id column="id" property="id"/>
        <result column="keyname" property="keyName"/>
        <!-- 
		collection:定义集合元素的封装
			property:指定bean对象属性中哪个集合对象
			ofType:指定bean对象属性的对象集合里面元素的类型
		-->
        <collection property="keys" ofType="com.lly.pojo.Key">
            <id property="id" column="kid"></id>
            <result property="keyName" column="keyname"></result>
        </collection>
    </resultMap>

Collection查询和7中的查询区别就是是为了应对某个字段是集合的情况


评论