Mybatis简单梳理

Mybatis学习笔记

author:木子六日

DAY1

mybatis是一个持久层框架,是为了简化dao层开发的一个框架。

基本配置

注意原来的com.dao和com.dao.impl这两个包都不用存在了,新建一个包叫做com.mapper的。

mybatis的config文件,随便取个什么名字,就叫mybatis.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="default">
		<environment id="default">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
				<property name="username" value="root"/>
				<property name="password" value="lijingjing"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
        <!-- resource这里写的是映射文件的全限定路径 -->
		<mapper resource="com/mapper/FlowerMapper.xml"/>
	</mappers>
</configuration>
映射文件的配置

一般来说这个文件的命名都是什么什么Mapper

<?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.mapper.FlowerMapper">
	<!-- 
		select标签表示这是查询语句;
		id里面写的是方法名;
		parameterType里面写的是参数;
		resultType里面写的是结果的全限定路径(包名+类名)
	 -->
	<select id="selAll" resultType="com.pojo.Flower">
		select * from flower
	</select>
</mapper>

DAY2

数据库连接池的配置文件

在META-INFO中建立content.xml文件,如下

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<!-- 这个xml文件存在的意义是配置数据库连接池的一些参数 -->
	<Resource 
		driverClassName = "com.mysql.jdbc.Driver"
		url = "jdbc:mysql://localhost:3306/ssm"
		username = "root"
		password = "lijingjing"
		maxActive = "50"
		maxIdle = "20"
		name = "test"
		auth = "Container"
		maxWait = "10000"
		type = "javax.sql.DataSource"
	/>
</Context>
log4j的配置文件

在src下创建log4j.properties文件,内容如下:

# 这一行代表输出的级别为DEBUG,还有INFO、WARN、ERROR、FATAL四个级别,依次递增,若指定级别为INFO,则DEBUG消息无法输出
# 这一行同时指定了输出位置为控制台和文件
log4j.rootCategory=INFO,CONSOLE

log4j.logger.com.mapper.FlowerMapper=DEBUG


# 这两行是固定格式
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 这一行指定了输出时的信息:l表示发生位置(行数),d表示时间,m表示消息,n是换行,p表示输出级别
log4j.appender.CONSOLE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n


log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# 指定文件位置,根目录为项目根目录
log4j.appender.LOGFILE.File=C:\\coding\\logFiles\\login.log
# 表示追加
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n

使mybatis开启log4j日志功能(实测不开启也会自动输出日志)

<settings>
    <!-- 设置开启log4j,亲测不设置也是默认开启的 -->
    <setting name="logImpl" value="log4j"/>
</settings>
给pojo类设置别名
<typeAliases>
	<typeAlias type="com.pojo.Flower" alias="flo"/>
</typeAliases>
简单的查询与插入使用

mapper文件:

<?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.mapper.FlowerMapper">
	<!-- 
		select标签表示这是查询语句;
		id里面写的是方法名;
		parameterType里面写的是参数;
		resultType里面写的是结果的全限定路径(包名+类名)
	 -->
	<select id="selAll" resultType="flo">
		select * from flower
	</select>
	<select id="selById" resultType="flo" parameterType="int">
		select * from flower where id=#{0}
	</select>
	<!-- insert方法包括还有delete和update方法都没有resultType属性,应为返回值都是int -->
	<insert id="ins" parameterType="flo">
		insert into flower values(default,#{name},#{price},#{production})
	</insert>
</mapper>

java测试文件:

package com.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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 com.pojo.Flower;



public class Test {
	public static void main(String[] args) throws IOException {
		//打开SqlSession
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session= factory.openSession();
		
		List<Flower> list = session.selectList("com.mapper.FlowerMapper.selAll");
		for(Flower flower:list) {
			System.out.println(flower);
		}
		Flower flower = session.selectOne("com.mapper.FlowerMapper.selById",2);
		System.out.println(flower);
		
		//可以直接把返回的结果集转为map,第二个参数是指定那一列当做key
		Map<Integer,Flower> map = session.selectMap("com.mapper.FlowerMapper.selAll", "id");
		for(int key:map.keySet()) {
			System.out.println(map.get(key));
		}
		
		//插入记录
		Flower flower2 = new Flower();
		flower2.setName("新增花卉");
		flower2.setPrice(12.56);;
		flower2.setProduction("南非");
		try {
			//第二个参数为要插入的数据
			int res = session.insert("com.mapper.FlowerMapper.ins",flower2);
			if(res>0) {
				System.out.println("插入成功");
			}else {
				System.out.println("插入失败");
			}
		}catch (Exception e) {
			//回滚
			session.rollback();
		}
		//提交(默认不开启自动提交,所以手动提交)
		session.commit();
		session.close();
	}
}

DAY3

Mapper的接口绑定

对于一个mapper.xml文件,里面写了一堆sql语句,调用的时候很麻烦,我们可以创建一个接口来跟它绑定,以后直接调用接口的方法即可。

注意该接口的全限定路径即为mapper.xml文件中的namespace。

package com.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.pojo.Flower;

public interface FlowerMapper {
	public List<Flower> selAll();
	public List<Flower> selByIdPrice(int id,double price);
	public List<Flower> selByIdNamePricePriduction(@Param("id")int id,@Param("name")String name,@Param("price")double price,@Param("production")String production);
	public int upd(@Param("id")int id,@Param("name")String name);
}


注意方法的名称应与xml文件中定义的id相同,方法的调用如下

FlowerMapper flowerMapper = session.getMapper(FlowerMapper.class);
List<Flower> list = flowerMapper.selAll();

还有一个点需要注意,如果使用接口了,需要改动全局配置文件mybatis.xml中的mapper,改动如下:

<mappers>
	<!-- 
	<mapper resource="com/mapper/FlowerMapper.xml"/>
	-->
	<package name="com.mapper"/>
</mappers>

多参数

当有多个参数时,xml中不用再写parameterType,示例如下:

<!-- 
利用接口使用多参数时,不需要写parameterType 
此处还要注意参数写成arg0和arg1,不要直接写成0和1,这跟mybatis的版本有关。
小于号和大于号不能直接使用,小于号可用转义字符&lt;  大于号为&gt;
arg0也可以写成param0,当然仅限于参数为基本数据类型。
 -->
<select id="selByIdPrice" resultType="flo">
    select * from flower where id &lt; #{arg0} and price &lt; #{arg1}
</select>

同时注意xml文件中小于号和大于号是不被允许的,解决方案见代码注释。

但是一般不使用arg0这种写法,为了可以直接写成#{id}这样的形式,在mapper接口的方法中可以添加@Param注解,例如:

public int upd(@Param("id")int id,@Param("name")String name);

当然如果参数本身不是基本数据类型,而是对象的话,可以直接写成#{对象属性名称}。

动态sql

简化大量类似的sql语句的编写(这个真是好东西,深有体会),主要就是通过一些标签来做,示例如下:

<!-- 动态sql示例1:注意动态sql不支持#{arg0}的写法,所以接口中的方法要加注解 -->
<select id="selByIdNamePricePriduction" resultType="flo">
    select * from flower
    <where>
        <if test="id!=0">
            and id&lt;#{id}
        </if>
        <if test="price!=0">
            and price&lt;#{price}
        </if>
        <if test="name!=null and name!=''">
            and name=#{name}
        </if>
        <if test="production!=null and production!=''">
            and production=#{production}
        </if>
    </where>
</select>
<!-- 动态sql示例2 update -->
<update id="upd">
    update flower
    <set>
        <!-- 为防止set为空值,一般都会固定写下面这句话 -->
        id=#{id},
        <if test="name!=null and name!=''">
            name=#{name},
        </if>
    </set>
    <where>
        and id=#{id}
    </where>
</update>

还有一些其他标签,但我感觉用处不大,就不一一列举了,以后用到的时候百度一下就行了。

补充
  • 昨天说到了一种给pojo类起别名的方法,是直接给类起别名,但是如果实体类太多的话,不如直接使得pojo那个包能被直接识别,在mapper.xml中resultType可以直接写类名的纯小写形式,一样能够识别,以后尽量用这种方式吧。

    <typeAliases>
        <!-- 各类起别名 -->
        <typeAlias type="com.pojo.Flower" alias="flo"/>
        <!-- 使得此包被识别,mapper.xml中直接写类名小写(例如:flower)使用该类 -->
        <package name="com.pojo"/>
    </typeAliases>
    
    
  • 数据库的中文识别问题,这个之前没注意到,其实和直接使用jdbc的时候差不多,全局配置中把url写成以下这样既可:

    <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;characterEncoding=UTF-8"/>
    
    

    注意使用原生jdbc写java代码的时候是没有amp;这个的,现在需要这个是因为在xml中&需要被转义成&amp;才能被解析,道理和上面的> <一样。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值