您的位置:首页 > 其它

mybatis 学习笔记 -详解mybatis 及实例demo

2018-03-01 11:33 686 查看
快速入门1 要点:

首先明白mybatis 是什么

这是一个持久层的框架。之前叫做ibatis。所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶。不是写错了,它确实就是这个样子的。

首先,我们来看看mybatis是个什么东西,它有什么用?我们为什么要学习它。mybatis是一个持久层的框架。所谓的持久层,就是我们三层中的dao层。主要负责跟数据库进行交互。可以建立数据库表和系统中的对象的一对一映射关系。这种框架我们称之为orm框架。但是mybatis框架需要自己写sql语句,且不能像hibernate那样自动生成sql语句,并且建立实体类和数据库的映射。所以我们说它是不完全的orm框架。

首先导入mybatis 的jar 数据库的驱动包。

创建myBatis.config.xml配置

首先配置数据库连接,数据库连接可以单独创建一个db.config.properties 文件进行单独存放

创建一个properties 文件,取名为db.config 里面配置好数据库连接

#oracle连接字符串定义
pacsdb.type=oracle #数据库指定类型
pacs.driverClassName:oracle.jdbc.driver.OracleDriver #连接数据库要加载驱动.前面oracle.jdbc.driver是包名,类名是OracleDriver
pacs.url:CWUiPEP9glDkHFwo1E8OOD4cWwdkfTiG9eNGROvijF+jYFm6rPzK9kUW5hod/OUz #数据库的地址 例如:10.68.4.29:8020/oracl
pacs.username:UiA8nxqOjyo=  #用户名
pacs.password:9sFRpfIc/oAcWr8+zX5Q6g==


下一步:需要把刚才创建的数据库连接配置文件加载进来

<!--数据源配置----->
<bean id="propertyconfigurer" class="com.msunsoft.rmtdx.security.EncryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.config.properties</value>
</list>
</property>
</bean>


数据库的配置文件加载进来之后,在当前的配置文件里面就可以取到配置文件里面配置的一些变量了。配置如下

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${pacs.url}"/>
<property name="username" value="${pacs.username}"/>
<property name="password" value="${pacs.password}"/>
<property name="connectionProperties" value="${pacs.driverClassName}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="20"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="validationQuery" value="select 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatenents" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
!-- 配置监控统计拦截的filters --通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall-->
<property name="filters" value="stat"/>
<!---https://www.cnblogs.com/wuyun-blog/p/5679073.html--这个网站提供了DRUID连接池的实用 配置详解 及全部的配置参数详解--->
</bean>


想在程序运行时输出一些日志信息,那么我们就需要配置日志包

下面配置日志包log4j

配置log4j 有两种方式,一种是log4jproperties 另一种是log4j.xml的方式。我们这里用配置xml的方式来配

下面附上配置代码,这个配置的时候直接复制就可以

<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<configuration status="warn">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout   pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/remote_diagnosis_pacs/info.log"
filePattern="${sys:user.home}/logs/remote_diagnosis_pacs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout  pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileDebug" fileName="${sys:user.home}/logs/remote_diagnosis_pacs/debug.log"
filePattern="${sys:user.home}/logs/remote_diagnosis_pacs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="DEBUG"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout  pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/remote_diagnosis_pacs/error.log"
filePattern="${sys:user.home}/logs/remote_diagnosis_pacs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR"/>
<PatternLayout   pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<!-- 第三方的软件日志级别 -->
<AsyncLogger name="org.springframework" level="info" additivity="true">
<AppenderRef ref="RollingFileInfo"/>
</AsyncLogger>
<asyncRoot level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileError"/>
</asyncRoot>
</loggers>
</configuration>


下面这个配置是可配,如果集成的是spring 则需要配上mybatis的一个sqlsession工厂

Mybatis 的sqlsession工厂
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource"/> 因为数据源已经写好所以这个地方用ref引用 。指定数据源
<property name="typeAliasesPackage" value="com.msunsoft.rmtdx.entity"/> 这个是类型别名包 默认是类的名称
<property name="configLocation" value="classpath:mybatis.config.xml"/>
<property name="mapperLocations" value="classpath*:mapper/${pacsdb.type}/*.xml"/>
</bean>

Mybatis 自动扫描加载sql映射文件、接口:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>引用上面配好的sqlSessionFactory
<property name="basePackage" value="com.msunsoft.rmtdx.mapper"/>自动扫描加载sql文件映射文件,包括接口
</bean>


以上咱们的mybatis 配置就算完成了。

下面就是Mybatis 的用法,

mybatis 主要的就是两个文件一个是mapping.xml 文件 这个文件里面主要就是sql语句,注意,所有的sql都存在这个文件里面,我觉得这是mybatis的一个特性,特别容易方便管理,代码里压根就不体现sql语句了。 。另一个就是mapping的接口文件。我的个人理解以上就是

下面弄一个实例demo

首先建造数据库表的model类文件 用于映射数据库表

public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+  "]";
}

}


接着创建一个mapping.xml文件

注意:mapping.xml里面的namespace 必须是与之对应的接口的全路径。

下面标签里面的属性可以自行百度下,这里就不详解了。

<?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.msunsoft.rmtdx.mapper.UserMapping">
<resultMap id="BaseResultMap" type="com.msunsoft.rmtdx.entity.po.User">
<id column="ID" jdbcType="DECIMAL" property="id" />
<result column="username" jdbcType="VARCHAR" property="name" />

</resultMap>
<select id="selectBlApplyAll" resultMap="BaseResultMap"  parameterType="com.msunsoft.rmtdx.entity.vo.getUser">
select ID, username    from User
</select>

</mapper>


在创建mapping.xml 对应的一个接口

public interface UserMapper {
/**
* 获取数据列表
* @param
* @return
* 添加标识:2018-01-03 10:55 赵成伟
*/
List<PacsConsultationApply> selectBlApplyAll();

}


以上mybatis的环境全部配置完毕,下面就可以去程序里面跑了。

下面记录下个别的用法resultMap 是个键值对的接口。 定义个别名

<resultMap id="BaseresultMap" type="指向model类文件的全路径">

<id property=”id” jdbcType=”string” column=”order_id”/>

注释,这个id是专门用来针对主键的。

result 是针对一般字段的。

<result peoperty=”name” column=”myname”/>

<Association property=’’另一个表名” >

<id property=”id” jdbcType=”string” column=”order_id”/>

</Association >

</resultMap>

resultMap 用来封装一些映射关系,键值对。

Association 关联的意思。一对一查询

一级缓存与二级缓存

二级缓存,是一个映射文件级的缓存

只需要要在mapper里面加个标签就可以

<cache>

里面一些配置属性。

</cache>

练习。

Spring 集成mybatis

首先添加jar包 最重要的是mybatis-spring -1.1.1.jar

数据库的驱动包等等。。。

创建实体类

User

创建 mapper接口

Interface userMapper

创建userMapper..xml

创建Spring的配置文件beans.xml

Beans.xml 里面首先配置数据源

所有的配置都是在bean标签里面配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${pacs.url}"/>
<property name="username" value="${pacs.username}"/>
<property name="password" value="${pacs.password}"/>
<property name="connectionProperties" value="${pacs.driverClassName}"></property>

<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="20"/>

<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>

<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>

<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20"/>

<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat"/>
</bean>

Mybatis 的sqlsession工厂

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource"/> 因为数据源已经写好所以这个地方用ref引用 。指定数据源
<property name="typeAliasesPackage" value="com.msunsoft.rmtdx.entity"/> 这个是类型别名包 默认是类的名称
<property name="configLocation" value="classpath:mybatis.config.xml"/>
<property name="mapperLocations" value="classpath*:mapper/${pacsdb.type}/*.xml"/>
</bean>

Mybatis 自动扫描加载sql映射文件、接口:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>引用上面配好的sqlSessionFactory
<property name="basePackage" value="com.msunsoft.rmtdx.mapper"/>自动扫描加载sql文件映射文件,包括接口
</bean>

事物管理

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dynamicDataSource"/> 引用之前配置的数据源

</bean>

使用声明式事物

<!-- 全注解方式 需加上@Transactional -->
<tx:annotation-driven transaction-manager="transactionManager"/>

这个配置引用上面定义好的事物管理器

创建一个mybatis,xml

里面不需要写啥了,但是得有
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: