一、导入相关jar包
二、写个pojo类
package com.cwnu.pojo;
public class Book {
private Integer id;
private String name;
private String author;
private String press;
private Integer amount;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
public Book(Integer id, String name, String author, String press, Integer amount) {
super();
this.id = id;
this.name = name;
this.author = author;
this.press = press;
this.amount = amount;
}
public Book() {
super();
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author + ", press=" + press + ", amount="
+ amount + "]";
}
}
三、配置全局配置文件 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就是选择你所使用的环境的id。
environment
这就是配置环境的标签,在environments标签下可以有多个environment,代表不同的环境,有一个属性id,唯一标识符。在选择环境的时候使用。
transactionManager
事务管理器,它的type属性指定它所使用的事务,有JDBC和MANAGED两种
JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
所以我们在选择上通常都是JDBC。
dataSource
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
许多 MyBatis 的应用程序会按示例中的例子来配置数据源。虽然这是可选的,但为了使用延迟加载,数据源是必须配置的。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)
不同的数据源使用了不同的连接技术。
mappers
映射器,告诉mybatis去哪里找SQL映射文件。
有三种方式:
<mapper resource=“org/mybatis/builder/AuthorMapper.xml”/>
相对于类路径的资源引用
<mapper url=“file:///var/mappers/AuthorMapper.xml”/>
使用完全限定资源定位符(URL)这个就是在磁盘上的路径
<mapper class=“org.mybatis.builder.AuthorMapper”/>
使用映射器接口实现类的完全限定类名
<package name=“org.mybatis.builder”/>
将包内的映射器接口实现全部注册为映射器
个人比较喜欢第三种方式,快捷,简单
typeAliases
给类型起别名,这样在使用一些类的时候不需要写完整的类资源路径
-->
<configuration>
<!-- 错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)".
解法:每个标签的顺序不要乱,否则会报DTD约束错误 -->
<settings>
<!-- 是否开启驼峰匹配 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="development">
<environment id="development">
<!-- 事物管理,一般交由spring完成 -->
<transactionManager type="JDBC" />
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/liyuan" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 注册dao接口映射 -->
<!--
通过resource属性引入classpath路径的相对资源
通过url引入网络资源或者本地磁盘资源
通过class属性指定mapper接口名称,此时对应的映射文件必须与接口位于同一路径下,并且名称相同
package标签,通过name属性指定mapper接口所在的包名 ,此时对应的映射文件必须与接口位于同一路径下,并且名称相同 -->
<mappers>
<mapper resource="BookStoreMapper.xml" />
</mappers>
</configuration>
四、写个dao,需要完成的业务
package com.cwnu.dao;
import java.util.List;
import com.cwnu.pojo.Book;
public interface BookDao {
public Book getBookById(Integer id);
public Book updateBookByBookById(Integer id);
public List<Book> getBookByCondition(Book book);
}
五、写个dao接口的映射
<?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">
<!-- namespace:名称接口,告知要实现的哪个接口 -->
<!--
resultType属性:用于指定结果集的类型。
parameterType属性:用于指定传入参数的类型。
sql语句中使用#{}字符:它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
具体的数据是由#{}里面的内容决定的。
#{}中内容的写法:由于数据类型是基本类型,所以此处可以随意写。
还有${}适用于非sql语句参数类型的传值,eg表名。
#{}需要预编译,而${}不需要预编译,且只有sql语句的参数支持预编译。
区别:1.
#它可以取任意类型的参数
$只能取对象中的值,不能取普通类型的值
2.
#取值可以有效防止sql注入
$符号取值它是sql拼接,不能有效防止sql注入
3.
#取值让sql语句支持预编译的功能
$符号是不支持的,所以在性能上来说 #取值性能要高于 $符号
-->
<!-- 动态sql:
if(条件)
trim(去除关键字)
where(用于简化条件判断)
set(于数据更新时设值)
choose(选择)
foreach(通常用于迭代集合)
单条件判断:
if通过test进行判断,看是否采用这个语句
处理sql语句拼接问题:
where标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
trim是更灵活的去处多余关键字的标签,
多条件分支判断:
choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
循环:
foreach主要是迭代一个集合,通常是用于IN 条件。List 实例将使用“list”做为key,数组实例以“array” 做为key。
-->
<mapper namespace="com.cwnu.dao.BookDao">
<!-- 自定义结果类型 -->
<resultMap type="com.cwnu.pojo.Book" id="BookMap">
<!-- id表示主键类型
property对应pojo类
column对应数据库字段名
-->
<id property = "id" column = "id"/>
<!-- result表示非主键类型 -->
<result property = "name" column = "bk_name"/>
<result property = "author" column = "bk_author"/>
<result property = "press" column = "press"/>
<result property = "amount" column = "amount"/>
</resultMap>
<select id="getBookById" resultMap = "BookMap" >
select * from bookstore where id= #{id}
</select>
<update id="updateBookId" >
update Book set amount = 999 where id = #{id}
</update>
</mapper>
六、测试
package com.cwnu.test;
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.After;
import org.junit.Before;
import org.junit.Test;
import com.cwnu.dao.BookDao;
import com.cwnu.pojo.Book;
public class TestMybatis {
/* 无论是mybatis帮我们创建代理对象还是直接是mybatis提供的crud方法,其本质都是要得到jdbc的connection对象,执行sql语句,最后封装结果集.
* (注解和xml配置,在sql语句和返回值类型上存在着差异)
* */
/*
* 1.运行报错java.lang.Exception: Method getBookById should have no parameters:这个错误指测试的junit函数方法有参数输入,类似于 void getBookById(Integer id)就不可以 需要变为void getBookById();
2.org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.cwnu.dao.BookStoreDao.getBookById:错因配置mappers映射错误,详见mappers。
*/
InputStream inputStream ;
SqlSessionFactoryBuilder builder;
SqlSessionFactory sqlSessionFactory;
SqlSession sqlSession;
BookDao bookDao ;
@Before//在执行方法前操作
public void init() throws IOException {
//指定全局配置文件
String resource = "mybatis_config.xml";
//获取配置文件
inputStream = Resources.getResourceAsStream(resource);
//创建构建者对象
builder = new SqlSessionFactoryBuilder();
//创建sqlsessionfactory
sqlSessionFactory = builder.build(inputStream);
//创建sqlsession
sqlSession = sqlSessionFactory.openSession();
//提交sql
// sqlSession.commit();
//创建dao的代理对象
bookDao = sqlSession.getMapper(BookDao.class);
}
/*public BookStore getBookById(Integer id);*/
@Test
public void getBookById() throws IOException {
Book book = bookDao.getBookById(5);
System.out.println(book);
}
@After//执行操作后执行
public void destory() throws IOException {
inputStream.close();
sqlSession.close();
}
}
七、如需查看与数据库操作的日志,需导入log4j的jar包,和xml配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false" >
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n"/>
</layout>
<!--过滤器设置输出的级别-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="debug" />
<param name="levelMax" value="debug" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/dubbo/logs/provider/rollingLog/dubbo.log" /><!-- 设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/dubbo/logs/provider/dailyLog/dubbo.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />
</layout>
</appender>
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name="com.runway.bssp.activeXdemo" additivity="false">
<appender-ref ref="activexAppender" />
</logger>
<!-- 根logger的设置-->
<root>
<priority value ="debug"/>
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile"/>
</root>
</log4j:configuration>
八、测试结果图:
如有问题,希望各位大佬不吝赐教,谢谢各位大佬。