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&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/employee.xml"/>
</mappers>
</configuration>
configuration标签下能写很多其他子标签
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文件,里面的标签有以下几个
—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、如果主键不是自增的呢?
通过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属性:指定数据库字段名
通过resultMap属性引用那个自定义封装规则的id
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中的查询区别就是是为了应对某个字段是集合的情况