Mybatis demo

一、导入相关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>

八、测试结果图:
在这里插入图片描述

如有问题,希望各位大佬不吝赐教,谢谢各位大佬。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值