Mybatis笔记
1.搭建Mybatis
导入关键jar包
- log4j-api-2.11.2.jar
- log4j-core-2.11.2.jar
- log4j-slf4j-impl-2.11.2.jar
- slf4j-api-1.7.30.jar
配置db.properties
jdbc.url=jdbc:mysql://localhost:3306/book
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.userName=root
jdbc.passWord=123456
导入xml文件
<properties resource="db.properties"></properties>
导入log4j2.xml文件(详细)
<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="warn" monitorInterval="30">
<!--全局参数-->
<Properties>
<!--<Property name="logPath">/export/Logs/bt-middle-data-main</Property>-->
<Property name="logPath">/Users/lihongxu6/log/bt-middle-data-main</Property>
</Properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<!--<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--输出日志的格式-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}-%t] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<!--<File name="log" fileName="log/test.log" append="false">-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
<!--</File>-->
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,
则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${logPath}/info.log"
filePattern="${logPath}/info_%d{yyyy-MM-dd}.log">
<!--<Filters>-->
<!--<!–控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)–>-->
<!--<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--<!–<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>–>-->
<!--</Filters>-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}-%t] [%p] - %l - %m%n"/>
<Policies>
<!--按照filePattern 时间单位 interval 间隔生成文件-->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<!--定了当日志文件达到了指定的size时,触发rollover操作。size参数可以用KB、MB、GB等做后缀来指定具体的字节数-->
<!--<SizeBasedTriggeringPolicy size="1G"/>-->
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和hibernate的一些无用的debug信息-->
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.elasticsearch" level="INFO">
</logger>
<logger name="com.jd.jsf.gd" level="warn">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<!-- 将业务dao接口填写进去,并用控制台输出即可 -->
<logger name="com.jd.bt.middle.data.repository" level="debug" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>
</loggers>
</configuration>
配置下划线,如果value="false",Mapper.xm文件的select语句中若不是返回ResultMap而是ResultType则返回字段不会进行驼峰命名,javabean中的属性必须与其对应。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
起别名
<!-- 起别名-->
<typeAliases>
<!-- <typeAlias type="com.lanou.mybatis.pojo.Employee" alias="emp"></typeAlias>-->
<!-- 默认小写-->
<typeAlias type="com.lanou.mybatis.pojo.Employee"></typeAlias>
<!--<package name="com.lanou.mybatis.pojo.Employee"/>-->
</typeAliases>
一般会设置两个environment一个用户开发环境,使用id为development,一个用于正式环境使用id为final,那么通过配置,environments的default属性就能选择使用对应的environment了
JDBC – 声明使用jdbc方式来提交和回滚事务,依赖于从数据源得到的连接来管理事务范围。
POOLED – 声明使用数据库连接池,从而避免频繁的创建和销毁链接造成资源的浪费
<environments default="development">
<environment id="development">
<!-- 事务管理器-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/book?useSSL=false"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="123456"/>-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.passWord}"/>
</dataSource>
</environment>
</environments>
mapper配置的几种方式:resource、url、class、package
resource形式:路径为xml映射文件的路径包名+文件名。
url形式:路径对应的是网络上了某个文件,注意file:// 前缀 +路径+文件名
class形式:class实际上是接口,写的是接口的全名。
package形式:扫描包的形式
<mappers>
<mapper resource="EmployeeMapper2.xml"/>
<!-- <mapper resource="com/lanou/mybatis/dao/EmployeeMapper2.xml"/>-->
<!-- <mapper class="com.lanou.mybatis.dao.EmployeeMapper"/>-->
<mapper resource="com/lanou/mybatis/dao/EmployeeMapper.xml"/>
<mapper resource="com/lanou/mybatis/dao/EmployeeMapperPlus.xml"/>
<!-- 批量注册-->
<!-- <package name="com.lanou.mybatis.pojo"/>-->
</mappers>
测试类(controller层)
private SqlSession getSqlSession() throws IOException {
//根据全局配置文件 利用SqlSessionFactoryBuilder创建SqlSessionFactory
//mybatis的配置文件
String resource = "mybatis-config.xml";
// 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)TestHotel.class.getClassLoader()
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession
//建立会话
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
public void addMybatis() {
SqlSession openSession = null;
try {
openSession = getSqlSession();
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = new Employee("测试","121","女");
// Employee employee = new Employee();
// employee.setLastName("测试");
// employee.setEmail("121");
// employee.setGender("女");
mapper.addEmp(employee,1);//执行方法 传入did
System.out.println(employee);
openSession.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
} finally {
openSession.close();//关闭会话
}
}
接口(dao层接口)
@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。
Integer addEmp(@Param("emp") Employee employee,@Param("did")Integer id);
Mapper
useGeneratedKeys=true表示使用数据库自动增长的主键,keyColumn用于指定数据库table中的主键,keyProperty用于指定传入对象的成员变量(要明确指定id,尤其多表!)
<insert id="addEmp" parameterType="com.lanou.mybatis.pojo.Employee" useGeneratedKeys="true" keyColumn="id" >
insert into t_employee(last_name,email,gender,d_id) value (#{emp.lastName},#{emp.email},#{emp.gender},#{did})
</insert>
xml多表查询映射设置
<resultMap id="MySimpleEmp" type="com.lanou.mybatis.pojo.Employee">
<!-- columb指定哪一列
property对应javaBean属性
-->
<id column="id" property="id"/>
<!-- 定义普通列封装规则-->
<result column="last_name" property="lastName"/>
<!-- 其他不指定会自动 -->
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="d_id" property="dept.id"/>
<result column="dept_name" property="dept.name"/>
<!-- 映射,autoMapping="true"开启自动映射-->
<!-- <association property="t_dept" javaType="com.lanou.mybatis.pojo.Department" autoMapping="true">-->
<!-- <id column="d_id" property="dept.id"/>-->
<!-- <result column="dept_name" property="dept.name"/>-->
<!-- </association>-->
</resultMap>
<!-- resultMapd自定义结果集映射规则-->
<select id="getEmpById" resultMap="MySimpleEmp">
select id,last_name,email,gender from t_employee where id=#{id}
</select>
resultType:
1、基本类型 :resultType=基本类型
2、List类型: resultType=List中元素的类型
3、Map类型
-
单条记录:resultType =map
返回单条记录的map,key为属性,值为属性值。resultType为map
-
多条记录:resultType =Map中value的类型
返回多条记录的map,key为任意一属性,值为对象类型。如Map<String,Employee>,resultType为Employee
返回多条记录的map时,key为任意一属性,值为对象类型,不过key需要通过@MapKey("lastName")指定对象中一个属性名为key
//多条记录封装一个map Map<String,Employee>键是这条记录的主键,值是记录封装后javaBean //@MapKey 告诉mybatis封装这个的时候使用哪个属性作为map的key @MapKey("lastName") Map<String,Employee> getEmpBylastNameReturnMap(String lastName);
<select id="getEmpBylastNameReturnMap" resultType="com.lanou.mybatis.pojo.Employee">
select id,last_name,email,gender from t_employee where last_name like #{lastName}
</select>

浙公网安备 33010602011771号