MyBatis学习笔记(一)

什么是MyBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息。

MyBatis的作用

平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。那么用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

JAR包下载

下载地址

使用

创建数据库
CREATE DATABASE mydatabase;
创建表
USE mydatabase;
CREATE TABLE users(
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(32) DEFAULT NULL,
PRIMARY KEY (id)
)CHARSET=utf8;
插入数据
USE mydatabase;
INSERT INTO users(name) VALUES('小明');
INSERT INTO users(name) VALUES('小红');
创建一个实体类(bean)
package com.my.bean.User

public class User{
	private Integer id;
	
	private String name;
	.
	.
	//Getter and Setter
	//Override toString()
}
配置Configration.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的核心配置文件-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--配置JDBC的加载驱动、url、用户名、密码-->
    <environments default="JDBC">
        <environment id="JDBC">
            <transactionManager type="JDBC"/>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydatabase?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载配置SQL语句的配置文件-->
    <mappers>
        <!--文件路径从src下开始-->
        <mapper resource="com/my/config/sqlxml/User.xml"/>
    </mappers>

</configuration>
配置SQL语句的User.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">

<!--命名空间,防止id冲突-->
<mapper namespace="User">

    <!--自动存入类对象,执行时直接返回一个装载着数据的对象,type是类名-->
    <resultMap type="com.my.bean.User" id="UserResult">
        <!--主键用id标签,普通属性用result标签-->
        <!--column对应数据库列名 property对应被装载对象的属性名-->
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
    </resultMap>

    <!--定义常量,可用include标签进行引用-->
    <sql id="colName">id,name</sql>

    <!--parameterType用来指定传参的类型-->
    <select id="getUserList" parameterType="com.my.bean.User" resultMap="UserResult">
        SELECT <include refid="colName"/> FROM users
    <!--使用OGNL表达式取user的属性和拼接sql语句-->
    <!--&quot;是"的转义字符&ndash;&gt;-->
    <!--where自动拼接成正确的sql语句-->
        <where>
            <if test="id != null and !&quot;&quot;.equals(id.trim())">
                AND id=#{id}
            </if>
            <if test="name != null and !&quot;&quot;.equals(name.trim())">
                AND name LIKE '%' #{name} '%'
            </if>
        </where>
    </select>

    <!--单个删除操作-->
    <delete id="deleteOne" parameterType="int">
        DELETE FROM users WHERE id=#{_parameter}
    </delete>

    <!--批量删除, 传入一个List作为参数-->
    <delete id="deleteBatch" parameterType="java.util.List">
        DELETE FROM users WHERE id in(
        <!--Separator用于分割-->
        <foreach collection="list" item="item" separator=",">
            #{item}
        </foreach>
            )
    </delete>
</mapper>

注:写在#{}中的表达式会被解析为预处理语句 如:DELETE FROM users WHERE id=?
而写在${}中的会直接写入 如 DELETE FROM users WHERE id=0
<where><set>标签内写入的sql语句会自动拼接,省去了写WHERE 1=1的麻烦
<result>中的column属性要根据查询语句的列名填写,可以为列名起别名,较为灵活
<if>中的test属性可以书写java语句,有些字符需要转义
需要在Configration.xml中注册该文件,才能调用

OGNL表达式

用于从传入的对象参数中取值
OGNL表达式
从集合中取出数据和用<foreach>循环历遍
ONGL取集合

加载Configration.xml,打开一个会话
package com.my.db;

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 java.io.IOException;
import java.io.Reader;

/*
 *通过MyBatis配置文件访问数据库类
 */
public class DBAccess {

    private static Reader reader;
    private static SqlSessionFactory factory = null;

    static{
        try {
            //通过配置文件获取连接数据库的信息,默认是resources目录下的
            reader = Resources.getResourceAsReader("Configuration.xml");
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //单例模式获取SqlSessionFactory
    private static SqlSessionFactory getSqlSessionFactory(){
        if(factory == null){
            factory = new SqlSessionFactoryBuilder().build(reader);
        }
        return factory;
    }

    //获取SqlSession
    public static SqlSession getSqlSession(){
        return getSqlSessionFactory().openSession();
    }
}
DAO层
package com.my.dao;

import com.my.bean.User;
import com.my.db.DBAccess;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;

/*
*从数据库查询
 */
public class UserDao {
    //查询
    public List<User> getUserList(Integer id, String name){
        SqlSession sqlSession = null;
        List<Message> messageList = null;
        try {
            //封装查询条件的对象,负责传入查询语句
            User user = new User();
            user.setId(id);
            user.setName(name);
            //获取sqlSession
            sqlSession = DBAccess.getSqlSession();
            //通过id找到配置文件里的SQL语句并执行,第二个参数是传入的对象
            messageList = sqlSession.selectList("User.getUserList", user);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //回收资源
            if(sqlSession != null)
                sqlSession.close();
        }
        return messageList;
    }

    //通过id删除数据
    public void deleteOne(int id){
        SqlSession sqlSession = null;
        try{
            sqlSession = DBAccess.getSqlSession();
            //SqlSession的删除方法,参数是需要传入的数据
            sqlSession.delete("User.deleteOne", id);
            //增删改需要手动提交
            sqlSession.commit();
        }catch (IOException ex){
            ex.printStackTrace();
        }finally {
            //回收资源
            if(sqlSession != null)
                sqlSession.close();
        }
    }

    //通过id数组批量删除数据
    public void deleteBatch(List idList){
        SqlSession sqlSession = null;
        try{
            sqlSession = DBAccess.getSqlSession();
            //调用删除SQL语句
            sqlSession.delete("User.deleteBatch", idList);
            //手动提交
            sqlSession.commit();
        }catch (IOException ex){
            ex.printStackTrace();
        }finally {
            if(sqlSession != null)
                sqlSession.close();
        }
    }
}
测试类
public class TestMyBatis{
	@Test
	public void testUser(){
		UserDao dao = new UserDao();
		List<User> userList = dao.getUserList(null, null);
		for(User user : userList){
			System.out.println(user);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值