Mybatis 对原生态JDBC程序优化;
一、开发DAO开发(接口和类)
二、Mybatis 的mapper 接口(代理开发)
mybatis 核心:
Mybatis 输入映射
Mybatis输出映射
原始方法
导入两个jar包,mybatis-3.5.1.jar和mysql-connector-java-5.1.10-bin.jar
需要日志再导log4j-1.2.17.jar(一般可不用)
写bean类(与数据库相匹配的对象,Ps.名字不要写错,很麻烦)
public class user {int id;String name;int age;}get,set,tostring
一、写全局配置文件(数据源,运行环境)/Mybatis/src/conf/mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 将写好的sql映射文件注册到全局配置中 -->
<mappers>
<mapper resource="./conf/mapper.xml"/>
</mappers>
</configuration>
二、sql 映射文件配置了每个sql,封装规则/Mybatis/src/conf/mapper.xml
<?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.guan.Mapper">
<!--
id:唯一标识,相当于函数名
resultType:返回值类型
#{id} 从传递过来的参数中取出id值
-->
<select id="selectuser" resultType="com.guan.bean.user">
select * from users where id = #{id}
</select>
</mapper>
三、注册在全局配置文件中
<!-- 将写好的sql映射文件注册到全局配置中 (前面已加)-->
<mappers>
<mapper resource="./conf/mapper.xml"/>
</mappers>
四、根据全局配置文件得到sqlsessionfactory
import……
public class mbs_test {
//将映射提取为方法
private SqlSessionFactory getSqlsessionFatory() throws IOException {
String resource = "./conf/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
//测试类
@Test
public void test() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlsessionFatory();
//获取sqlSession对象 直接执行已经映射的sql语句
SqlSession session = sqlSessionFactory.openSession();
//第一个参:唯一标识 statement Unique identifier matching the statement to use.
//第二个参:编号 parameter A parameter object to pass to the statement.
try {
user user1=session.selectOne("com.guan.Mapper.selectuser", 1);
System.out.println(user1);}finally {
session.close();
}
}
}
五、用完一定session.close();
(前面已加)关闭
接口方式
导入两个jar包,
写mybatis-config.xml及(Mybatis_config.properties可在xml里直接实现)
写bean类(与数据库相匹配的对象,Ps.名字不要写错,很麻烦)
public class user {int id;String name;int age;}get,set,tostring
一、先写接口/Mybatis/src/com/guan/impl/mapper_impl.java
package com.guan.impl;
import com.guan.bean.user;
public interface mapper_impl {
public user getUserById(Integer id);
}
二、再写/Mybatis/src/conf/mapper.xml
<?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.guan.impl.mapper_impl">
<!--
id:唯一标识,相当于函数名
resultType:返回值类型
#{id} 从传递过来的参数中取出id值
-->
<!-- 接口版 ID换为接口名-->
<select id="getUserById" resultType="com.guan.bean.user">
select * from users where id = #{id}
</select>
<!-- 添加<insert id="名字" parameterType="可以省略" >sql语句</insert>
修改<update id="名字" >sql语句</update>
删除<delete id="名字">sql语句</delete>
-->
<!-- <sql>可以存储一些经常用的sql代码段 调用用 <include refid="userColumns"><property name="alias" value="t1"/></include>-->
<!-- selectKey::: -->
</mapper>
三、测试/Mybatis/src/com/guan/batistest/mbs_test.java
package com.guan.batistest;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.guan.bean.user;
import com.guan.impl.mapper_impl;
public class mbs_test {
private SqlSessionFactory getSqlsessionFatory() throws IOException {
String resource = "./conf/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
@Test
public void test1() throws IOException {
//获取sessionFactory对象
SqlSessionFactory sessionFactory= getSqlsessionFatory();
//获取SqlSession对象sessionFactory.openSession(true);自动提交
SqlSession openSession=sessionFactory.openSession();
//3\获取接口的实现对象,,,此处是Mybatis为接口创建的代理对象
try {
mapper_impl mapper=openSession.getMapper(mapper_impl.class);
user user=mapper.getUserById(1);
System.out.println(user);}finally {
openSession.close();
}
}
}
Mybatis的动态SQL
动态sql
一、如果<if test="条件语句"></if>
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
二、选择语句<choose><when>< otherwise>
<choose>
<when test="条件">
语句1
</when>
< otherwise test="条件">
语句2
</ otherwise>
</choose>
三、当条件满足时自动添加where
<where>
<if test="条件1"></if>
<if test="条件2"></if>
</where>
四、 当条件允许时set trim
<update>
<set>
<if></if>
</set>
</update>
五、遍历foreach输出item
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
六、绑定上下文
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
高级结果集映射
延迟加载
查询缓存(一级,二级)
框架整合
逆向工程
全局配置文件怎么写
一、/Mybatis/src/conf/mybatis-config.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="文件路径" url="网络路径"-->
<properties resource="./conf/Mybatis_config.properties" ></properties>
<!--settings 包含设置项 <settings> name="设置项名" value="值"<setting name="" value="" /></settings> -->
<!-- 别名处理器 为javabean类型起名<typeAliases>type="全名" alias="别名" <typeAlias type="" alias=""/>批量起名<package name="" /></typeAliases>-->
<!--plugins插件 拦截…… -->
<!--添加log4j -->
<settings><setting name="logImpl" value="LOG4J"/> <setting name="autoMappingBehavior" value="FULL"/> </settings>
<!-- environments环境门 environment 具体环境 development开发环境text测试环境
必须有transactionManager dataSource -->
<environments default="development">
<environment id="development">
<!-- transactionManager事务管理器 -->
<transactionManager type="JDBC" />
<!-- dataSource 数据源 -->
<dataSource type="POOLED">
<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>
<!--databaseIdProvider 数据库标识-->
<!-- 将写好的sql映射文件注册到全局配置中 -->
<!-- mappers url="网络文件"resource=“文件” class="引用接口" -->
<mappers>
<mapper resource="./conf/mapper.xml" />
</mappers>
</configuration>
二、/Mybatis/src/conf/Mybatis_config.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
log4j日志怎么写
一、/Mybatis/src/conf/log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
<!--输出到控制台-->
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<!--输出到文件(info)-->
<!--将生成“info.log.2014-06-11”这样的日志文件-->
<appender name="fileAppenderInfo" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/info.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<!--输出到文件(warn)-->
<appender name="fileAppenderWarn" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/warn.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<!--输出到文件(error)-->
<appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/error.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!--屏蔽所有org.springframework.*输出的Debug(及以下)信息-->
<logger name="org.springframework">
<level value="INFO"></level>
</logger>
<root>
<level value="ALL"/>
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppenderInfo" />
<appender-ref ref="fileAppenderWarn" />
<appender-ref ref="fileAppenderError" />
</root>
</log4j:configuration>
二、日志配置文件/Mybatis/src/conf/log4j.properties
#全局日志配置 代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
log4j.rootLogger=DEBUG,Console
# `MyBatis日志配置....代表特定包下的特定级别。log4j把日志分为ALL、TRACE&(跟踪)、DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)、FITAL(致命)、OFF等几个级别,级别依次升高。级别高的Level会屏蔽级别低的信息`。
log4j.logger.org.mybatis.example.BlogMapper=TRACE
#控制台输出.
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#代表配置布局。
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#代表自定义输出内容的格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#代表为特定的包(org.apache)配置特定的级别INFO,这样就把上面总的级别DEBU掩盖了,这样一来,这个包下的DEBUG信息就不会输出,就不会影响我们想要看的信息。
log4j.logger.org.apache=INFO
三在全局配置文件里添加log4j
<!--添加log4j -->
<settings><setting name="logImpl" value="LOG4J"/> <setting name="autoMappingBehavior" value="FULL"/> </settings>