【MyBatis】(一)MyBatis基础知识点(概念,Mybatis框架的优缺点,简单的Mybatis框架使用Demo,基本的增删改查操作案例)

一、概念

    简单的说:一款封装了数据库JDBC操作的ORM框架技术.(Apache(ibatis) --> Google(Mybatis))

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    ORM:Object Relation Mapping对象关系映射

ORM设计思想:将数据库中的一张表与java实体类关联起来,表中每一行记录映射成实体类对象,可以通过映射关系将实体类中数据存储到数据库中,也可以将数据库中一行记录映射成一个java实体类对象。ORM是一种设计思想,Hibernate和Mybatis都是实现了这种思想的框架。其中ORM映射分为四级:第一级别为手动连接的SQLutils.第二级别为半自动化的MyBatis框架.第四级便是持久性框架Hibernate,这个在之前的博客有详解.这里我们来详细学习一下MyBatis框架操作实体类数据库.

二、MyBatis框架的优缺点

    优点:

1.基于SQL语句的框架,可以实现对SQL语句的调优。

2.将SQL语句单独编写在xml配置文件中,方便统一管理和维护,降低程序之间的耦合度。

3.提供xml标签,支持动态SQL语句编写。

4.提供xml映射标签,支持表与表之间的关联查询。

    缺点:

1.需要自己编写SQL语句,对开发人员的能力有要求。

2.数据库移植能力较差。

3.不支持表与表之间级联增删改。

三、MyBatis的使用步骤

1.创建数据库

#创建数据库

create database mybatis default character set utf8;

#使用数据库

use mybatis;

#创建表

create table user(

id int primary key auto_increment,

username varchar(20),

password varchar(20),

age int,

gender char(1));

#插入数据

INSERT INTO user (username,password,age,gender) values

("张三","123",20,'男'),("李四","123",21,'男'),("王五","123",23,'男'),("赵六","123",24,'男');

2.创建项目,导入核心Jar包

    mybatis-3.4.5.jar 是mybatis核心API

    mysql.jar 是数据库操作Jar

3.编写Mybatis主配置文件:SqlMapConfig.xml

    主要编写数据库连接参数信息和其他配置.


	
	
		
	
	
	
		
		
	
	
	
		
		
	
	
	
		
			
			
				
				
				
				
			
		
	
	
	
		
	
 

4.根据表编写实体类.建议:实体类中属性名和表中字段名保持一致.(如果不一致请参考User1)

package com.hekaikai666.bean;

import java.io.Serializable;

/**
 * 
 * @author hekaikai666
 * @time 2018年9月17日上午11:24:57
 **/
public class User implements Serializable {
    private int id;
    private String username;
    private String password;
    private int age;
    private String gender;
    // 此处省略空参构造方法,不包含id的全参构造方法,全参构造方法,get set方法和toString方法
}
package com.hekaikai666.bean;

import java.io.Serializable;

/**
 * 
 * @author hekaikai666
 * @time 2018年9月17日下午4:49:40
 **/
public class User1 implements Serializable {
    private int u_id;
    private String u_username;
    private String u_password;
    private int u_age;
    private String u_gender;
    // 此处省略 空参构造方法,不包含id的全参构造方法,全参构造方法,以及get set方法和toString方法
}

 

5.编写SQL映射文件,主要编写SQL语句,让主配置文件关联加载映射文件



	
	SELECT * FROM user
	
        
	
	
	
	
	
	
	INSERT INTO user
		(username,password,age,gender) VALUES
		(#{username},#{password},#{age},#{gender})
	
	
	DELETE FROM user WHERE id=#{id}
	
	UPDATE user SET username=#{username},password=#{password},age=#{age},gender=#{gender} WHERE id=#{id}
	
	
	
	
	
	
	
	
	
	
	
    
	
	
	
	
	
	
	
	
	
		
		
		
		
		
		
		
	
	
	

6.通过mybatis中的API获取到SqlSession对象.

获取sessionFactory对象可以封装为util方法,无需重复写

// 获取sessionFactory对象

public static SqlSessionFactory getFactory() {

// 获取SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

// 加载mybatis配置文件

// 通过类加载器对象来加载文件获取一个流

String resource = "SqlMapConfig.xml";

InputStream is = TestUser.class.getClassLoader().getResourceAsStream(resource);

// 使用session工厂对象加载文件(每个应用程序能够对应一个SqlSessionFactory)

// 可以用于构建你SqlSession对象和充当二级缓存

SqlSessionFactory factory = builder.build(is);

return factory;

}

User对象和User1对象的十三种基本增删改查操作.
     * 查找单个User对象
     * 查找所有User对象并风格到List集合中
     * 给输入库中添加一个User对象
     * 根据id删除一个User对象
     * 根据id修改一个对象
     * 根据名字进行模糊查询
     * 根据账号密码查询一个账户
     * 根据id只查询账号和密码
     * 查询所有用户的账号和密码
     * 当实体类中属性名和表中字段名不一致时查询
     * 根据账号和密码查询一个用户的 信息进行登录 如果能查到 成功 如果查不到 失败 模拟JdbcSQL注入
     * mybatis分页查询
     * 根据名字查找一个User对象
     * 根据账号和密码进行查询
     * 传入数据表名进行查询

package com.hekaikai666.Test;

import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Before;
import org.junit.Test;

import com.hekaikai666.bean.User;
import com.hekaikai666.bean.User1;
import com.hekaikai666.util.MyBatisUtil;

import jdk.nashorn.internal.ir.ForNode;

/**
 * 
 * @author hekaikai666
 * @time 2018年9月17日上午11:42:16
 **/
public class TestUser {
    SqlSessionFactory factory;

    @Before
    public void init() {
	factory = MyBatisUtil.getFactory();
    }

    /**
     * 查找单个User对象
     * 
     * @throws FileNotFoundException
     */
    @Test
    public void test1() {
	// 使用session工厂打开session
	SqlSession session = factory.openSession();
	// 通过session对象执行映射文件中的SQL语句
	String statement = "findUserById";
	// 第一个参数 Sql定义的id 第二个参数 占位符的参数值
	// 1.查询SQL语句
	User user = session.selectOne(statement, 1);
	System.out.println(user);
	session.close();
    }

    /**
     * 查找所有User对象并风格到List集合中
     */
    @Test
    public void test2() {
	SqlSession session = factory.openSession();
	// 如果多个映射文件有相同的sql定义id可以使用namespace.id名来
	List users = session.selectList("user.findAll");
	for (User user : users) {
	    System.out.println(user);
	}
	session.close();
    }

    /**
     * 给输入库中添加一个User对象
     */
    @Test
    public void test3() {
	SqlSession session = factory.openSession();
	User user = new User("宋豪", "123456", 80, "男");
	int rows = session.insert("saveUser", user);
	// 提交事务
	session.commit();
	System.out.println("成功插入数据的行数:" + rows);
	// 关闭对象
	session.close();
    }

    /**
     * 根据id删除一个User对象
     */
    @Test
    public void test4() {
	SqlSession session = factory.openSession();
	int rows = session.delete("user.deleteUserById", 6);
	System.out.println("删除记录行数:" + rows);
	session.commit();
	session.close();
    }

    /**
     * 根据id修改一个对象
     */
    @Test
    public void test5() {
	SqlSession session = factory.openSession();
	// 先根据id获取一个user对象
	User user = session.selectOne("findUserById", 3);
	user.setUsername("哈哈哈");
	user.setPassword("呵呵呵");
	user.setAge(18);
	user.setGender("女");
	int rows = session.update("user.updateUser", user);
	System.out.println("修改记录行数:" + rows);
	session.commit();
	session.close();
    }

    /**
     * 根据名字进行模糊查询
     */
    @Test
    public void test6() {
	SqlSession session = factory.openSession();
	List users = session.selectList("findThem", "%张%");
	for (User user : users) {
	    System.out.println(user);
	}
	session.close();
    }

    /**
     * 根据账号密码查询一个账户
     */
    @Test
    public void test7() {
	SqlSession session = factory.openSession();
	// 传入一个User对象
	User user = new User("张三", "123", 0, "");
	List u = session.selectList("findOneByUAP", user);
	System.out.println(u);
	session.close();
	 // 传入一个map集合
	
	 Map map = new HashMap();
	 map.put("username", "张三");
	 map.put("password", "123");
	 User user1 = session.selectOne("findOneByUAP2", map);
	 System.out.println(user1);
	 session.close();
    }

    /**
     * 根据id只查询账号和密码
     */
    @Test
    public void test8() {
	SqlSession session = factory.openSession();
	List> user = session.selectList("findOneById", 1);
	for (Map map : user) {
	    System.out.println(map);
	}
	session.close();
    }

    /**
     * 查询所有用户的账号和密码
     */
    @Test
    public void test9() {
	SqlSession session = factory.openSession();
	List> users = session.selectList("findAllUAP");
	for (Map map : users) {
	    System.out.println(map);
	}
	session.close();
    }

    /*
     * 当实体类中属性名和表中字段名不一致时查询
     */
    @Test
    public void test01() {
	SqlSession session = factory.openSession();
	List user1s = session.selectList("findUser1");
	for (User1 user1 : user1s) {
	    System.out.println(user1);
	}
    }

    /**
     * 根据账号和密码查询一个用户的 信息进行登录 如果能查到 成功 如果查不到 失败 模拟JdbcSQL注入
     * 
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    @Test
    public void testJDBC() throws ClassNotFoundException, SQLException {
	String username="宋豪";
	String password="1234' or '1=1";
	Class.forName("com.mysql.jdbc.Driver");
	Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8",
		"root", "123456");
	String sql = "SELECT * FROM user WHERE username='"+username+"' and password='"+password+"';";
	Statement stmt = con.createStatement();
	PreparedStatement pstmt = con.prepareStatement(sql);
	ResultSet rs = pstmt.executeQuery();
	// ResultSet rs = stmt.executeQuery(sql);
	if (rs.next()) {                 
	    System.out.println("登陆成功");
	} else {
	    System.out.println("登陆失败");
	}
    }
    /**
     * mybatis分页查询
     */
    @Test
    public void test10() {
	SqlSession session = factory.openSession();
	HashMap maps = new LinkedHashMap();
	maps.put("page", 2);
	maps.put("pageSize", 3);
	List lists = session.selectList("user.getUserByLimit", maps);
	for (User user : lists) {
	    System.out.println(user);
	}
    }
    /**
     * 根据名字查找一个User对象
     */
    @Test
    public void test11() {
	SqlSession session = factory.openSession();
	User user = session.selectOne("u.findUserByName","'张三'");
	System.out.println(user);
	session.close();
    }
    /**
     * 根据账号和密码进行查询
     */
    @Test
    public void test12() {
	SqlSession session = factory.openSession();
	HashMap map = new HashMap();
	map.put("username", "'张三'");
	map.put("password", "'12345' or '1=1'");
	User user = session.selectOne("u.findUserByNameAndPsw",map);
	System.out.println(user);
	session.close();
    }
    /**
     * 传入数据表名进行查询
     */
    @Test
    public void test13() {
	SqlSession session = factory.openSession();
	String table = "user";
	User user = session.selectOne("u.findAll",table);
	System.out.println(user);
	session.close();
    }
}

 

 

 

你可能感兴趣的:(Java初学)