您现在的位置是:网站首页>javajava

Mybatis的CRUD和动态代理开发CRUD

deling2019年9月22日java138人已围观

简介Mybatis的CRUD和动态代理开发CRUD

说明

本例子是在Eclipse+mybatis3.4.2+jdk8的基础上写的,如果版本问题,请与博主的版本一致。谢谢合作

普通的xml配置方法开发CRUD

一、数据库设计

1、创建数据库
create database student;
2、创建表
create table student(	
        id int(11) NOT NULL AUTO_INCREMENT,	
        name varchar(32)  default null,
	age int(11),
	primary key(id)
	)default charset=utf8;

二:创建java项目

New--->java Project--->Project name--->Finish
所有目录结构

mybatis-crud1.png

1、将mysql驱动包和mybatis3.4.2的jar导入到java项目的Build Path里面

mybatis-crud2.png

2、创建cn.delingw.pojo包然后在下面创建Student.java(实体类)

Student.java类

package cn.delingw.pojo;
public class Student {    
        //学号
	private int id;	
	// 名字
	private String name;	
	// 年龄
	private int age;    
	// 提供公共的set方法和get方法
	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 int getAge() {		
	        return age;
	}	
	public void setAge(int age) {		
	        this.age = age;
	}    
	// 重写toString方法
	@Override
	public String toString() {		
	        return "id:" + this.id + "---" + "name:" + this.name + "---" + "age:" + this.age;
	}
}

3、在src目录下面创建mybatis-config.xml文件,并创建外部文件db.properties

db.properties外部文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/student?characterEncoding=UTF-8
usename=root
password=123456

db.properties外部文件的导入:

引入外部文件 
	1、查找外部文件的路径
	2、利用el表达式获取外部文件 
	
	<properties resource="db.properties" />
		 <dataSource type="POOLED">
			<!-- 利用el表达式获取外部文件 -->
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${usename}" />
				<property name="password" value="${password}" />
	    </dataSource>

mybatis-config.xml 定位哪个数据库

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
" 
<configuration>
	<!-- 引入外部文件 
	1、查找外部文件的路径
	2、利用el表达式获取外部文件 
	-->
	<properties resource="db.properties" />
	<!-- 配置单类别名 -->
	<typeAliases>
		<typeAlias type="cn.delingw.pojo.Student" alias="student" />
	</typeAliases>
	<!-- 配置多类别名 -->
	<!-- <typeAliases> <package name="cn.delingw.pojo" /> </typeAliases> -->
	<!-- 如果需要连接多个数据库信息,需要那个数据库 则default就等于那个 environment的标签id-->
	<environments default="development">
	<!-- 数据库信息的标签id -->
		<environment id="development">
		<!-- 事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据源 -->
			<dataSource type="POOLED">
			<!-- 利用el表达式获取外部文件 -->
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${usename}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 映射mapper的xml文件 -->
	<mappers>
		<!-- 映射student.xml文件 -->
		<mapper resource="cn/delingw/pojo/studentConfig.xml" />
		<!-- 映射StudentMapperConfig.xml文件 -->
		<mapper resource="cn/delingw/Mapper/StudentMapperConfig.xml" />
	</mappers>
	</configuration>

4、在cn.delingw.pojo下创建studentConfig.xml文件

studentConfig.xml.xml执行对应的select语句

<?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="cn.delingw.pojo.studentConfig">
	<!-- 通过id查询 -->
	<select id="selectStudentById" parameterType="int"
		resultType="student">
		select * from student where id=#{id}
	</select>
	<!-- 查询全部 -->
	<select id="listSelect" parameterType="student"
		resultType="student">
		select * from student	
	</select>
	<!-- 添加数据 -->
	<insert id="addStudent" parameterType="student">
		insert into
		student(name,age) values(#{name},#{age})
	</insert>
	<!-- 通过id删除 -->
	<delete id="deleteStudentById" parameterType="int">
		delete from student
		where id=#{id}
	</delete>
	<!-- 通过id更新 -->
	<update id="updateStudentById" parameterType="student">
		update student set
		name=#{name},age=#{age} where id=#{id}
	</update></mapper>

5、测试

在src下面创建cn.delingw.test包然后在下面创建StudentTest.java测试文件

package cn.delingw.test;
import java.io.Reader;
import java.util.List;
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 cn.delingw.Mapper.StudentMapper;
import cn.delingw.pojo.Student;

public class StudentTest {	
        // 通过id来查询
	public static void selectStudentById() throws Exception {	    
	        // 利用reader 来获取数据库xml文件
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");		
		//利用SqlSessionFactoryBuilder().build(reader)获取SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);		
		//利用SqlSessionFactory里面的openSession()方法来获取session
		SqlSession session = sqlSessionFactory.openSession();		
		// xml配置方法开发
		//StudentConfig.xml中的namespace+标签的id 
		String stement = "cn.delingw.pojo.studentConfig.selectStudentById";
		Student student = session.selectOne(stement, 1);		
		    System.out.println(student);
		    session.commit();
		    session.close();		
		
	}
		// 查询全部
	public static void selectStudentList() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// xml的配置方式
		String stement = "cn.delingw.pojo.studentConfig.listSelect";
		List<Student> student = session.selectList(stement);
		for (Student s : student) {		
		    System.out.println(s.getId() + "---" + s.getName() + "---" + s.getAge());
		}
		session.commit();
		session.close();		
		

	}
		// 添加
	public static void addStudent() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// xml配置方式
		String stement = "cn.delingw.pojo.studentConfig.addStudent";
		Student student = new Student();
		student.setName("王好的");
		student.setAge(19);		
		int count = session.insert(stement, student);		
		System.out.println("添加了" + count + "个学生!");		
		// 因为transactionManager的类型是jdbc需要自动提交
		session.commit();
		session.close();			
	}	
	// 通过id删除
	public static void deleteStudentById() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// xml配置方式
		String stement = "cn.delingw.pojo.studentConfig.deleteStudentById";
		session.delete(stement, 13);
		session.commit();
		session.close();		

	}
		// 通过id更新
	public static void updateStudentById() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// xml 配置方式
		String stement = "cn.delingw.pojo.studentConfig.updateStudentById";
		Student student = new Student();
		student.setId(14);
		student.setName("王小卖部");
		student.setAge(22);
		session.update(stement, student);		
		// 因为transactionManager的类型是jdbc需要自动提交
		session.commit();
		session.close();		
	}

	public static void main(String[] args) throws Exception {
	//		selectStudentById();
	//		addStudent();
	//		deleteStudentById();
	//		updateStudentById();
		        selectStudentList();
	}
}
基本原理
1. 应用程序找Mybatis要数据
2. mybatis从数据库中找来数据
2.1 通过mybatis-config.xml 定位哪个数据库
2.2 通过studentConfig.xml.xml执行对应的select语句
2.3 基于studentConfig.xml.xml把返回的数据库记录封装在Student对象中
2.4 把多个Student对象装在一个Student集合中
3. 返回一个Student集合

动态代理方法开发CRUD

1、在src下面创建cn.delingw.Mapper包,然后在包下面创建接口StudentMapper.java

StudentMapper.java

package cn.delingw.Mapper;
import java.util.List;
import cn.delingw.pojo.Student;
/*
 * 1、接口中的方法名要和StudentMapperConfig.xml中id一致
 * 2、接口的方法中的参数要和StudentMapperConfig.xml中的parameterType(输入参数类型)一致
 * 3、接口的返回类型要和StudentMapperConfig.xml中的resultType(输出参数类型)一致
 * 4、如果StudentMapperConfig.xml中如果没有resultType,则没有返回类型
 * 5、接口的项目路径要和StudentMapperConfig.xml中的namespace一致
 */
 public interface StudentMapper {	
         // 通过id查询
	Student selectStudentById(int id);	
	// 查询全部
	List<Student> listSelect(Student student);	
	// 添加数据
	void addStudent(Student student);	
	// 通过id删除
	void deleteStudentById(int id);	
	// 通过id更新
	void updateStudentById(Student student);
}

2、在已创建的cn.delingw.Mapper下面创建StudentMapperConfig.xml,用它执行相对应的select语句

<?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">
    <!--
     1、namespace 就是接口的位置 
     2、id就是接口的方法名
     3、parameterType就是接口方法的参数类型
     4、 resultType就是接口方法的返回类型
    -->
    <mapper namespace="cn.delingw.Mapper.StudentMapper">
	<!-- 通过id查询 -->
	<select id="selectStudentById" parameterType="int"
		resultType="student">
		select * from student where id=#{id}
	</select>
	<!-- 查询全部 -->
	<select id="listSelect" parameterType="student"
		resultType="student">
		select * from student	</select>
	<!-- 添加数据 -->
	<insert id="addStudent" parameterType="student">
		insert into
		student(name,age) values(#{name},#{age})	
		</insert>
	<!-- 通过id删除 -->
	<delete id="deleteStudentById" parameterType="int">
		delete from student
		where id=#{id}
	</delete>
	<!-- 通过id更新 -->
	<update id="updateStudentById" parameterType="student">
		update student set
		name=#{name},age=#{age} where id=#{id}
	</update></mapper>

3、测试类(还是上面的cn.delingw.test下的test类),但是内容变了

package cn.delingw.test;
import java.io.Reader;
import java.util.List;
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 cn.delingw.Mapper.StudentMapper;
import cn.delingw.pojo.Student;

public class StudentTest {	
        // 通过id来查询
	public static void selectStudentById() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// 接口开发
		// 利用session中的getMapper方法, (反射的方式获取StudentMapper接口)
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = mapper.selectStudentById(2);		System.out.println(student);
		session.commit();
		session.close();
	}	
	// 查询全部
	public static void selectStudentList() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// 接口开发
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = new Student();
		List<Student> stus = mapper.listSelect(student);
		for (Student st : stus) {			System.out.println(st);
		}

	}	
	// 添加
	public static void addStudent() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// 接口方法
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = new Student();
		student.setName("农夫山泉");
		student.setAge(20);
		mapper.addStudent(student);
		session.commit();
		session.close();
	}	
	// 通过id删除
	public static void deleteStudentById() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();		
		// 接口方式
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		mapper.deleteStudentById(18);
		session.commit();
		session.close();

	}	
	// 通过id更新
	public static void updateStudentById() throws Exception {
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sqlSessionFactory.openSession();	
		// 接口方法
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = new Student();
		student.setId(17);
		student.setName("怡宝");
		student.setAge(1913);
		mapper.updateStudentById(student);
		session.commit();
		session.close();

	}

	public static void main(String[] args) throws Exception {
	//		selectStudentById();
	//		addStudent();
	//		deleteStudentById();
	//		updateStudentById();
		selectStudentList();
	}
}

注意:

这个测试博主将代码都写在了同一个test类中!别看外观相同 但是里面不同额!


Tags: MyBatis

很赞哦! (5)

相关文章

留言

来说点儿什么吧...

您的姓名: *

选择头像: *

留言内容:

    2019年2月25日 13:35嘿嘿

    2019年2月26日 13:20ok

    可以可以!

    2019年3月18日 09:2311

    1

    2019年3月28日 09:24www.ikeguang.com

    可以可以

    2019年5月29日 18:47qwe

    666

    2019年5月30日 16:52BlankYk

    he,tui~

    2019年5月30日 17:04123

    321

    2019年6月26日 10:02周树人

    厉害厉害

    2019年6月26日 10:34sdlakrj

    sdaag

    2019年6月29日 15:31sdagafdbaf

    dgafdgdfh

    站长回复:你这是什么什么高级语言,我表示看不懂哈哈

    2019年7月6日 16:37啦啦

    写的真好!谢谢博主

    站长回复:谢谢!

    2019年8月14日 12:35傻傻

    厉害 小林

    2019年9月11日 20:05sdfw

    fgbhjksdgjdfhag

    2019年9月11日 22:18baba

    keke tui

    2019年11月5日 20:09666

    666