Mybatis环境搭建

一、Mybatis概述

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程

mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

学习mybatis的官网:https://mybatis.org/mybatis-3/zh/getting-started.html

二、搭建Mybatis开发环境

0、建表

此处只用到用户表和权限表(其实权限表后面没用)如下:
在这里插入图片描述
用户表:
在这里插入图片描述
权限表:
在这里插入图片描述

1、创建maven工程

表创建完成就是创建maven工程,
在这里插入图片描述

2、导包(配置依赖)

在pom.xml中导入如下依赖。其中包括mybatis的 ,其他现在不用管,导进去没坏处

  <dependencies>
  
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.5</version>
	</dependency>
	
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
		<scope>test</scope>
	</dependency>
	
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.6</version>
		<scope>runtime</scope>
	</dependency>
	
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.12</version>
	</dependency>
</dependencies>

在这里插入图片描述

3、写pojo实体类

注意:必须要跟数据库字段类型一一对应(属性名可以不一样,但是后面要在resultMap中进行映射才行),为了方便,类型名也保持一致。在这只贴一个实体类代码。(本来都是笔记,又不是小抄,重要的是学会配置流程。)

import java.util.Date;

public class User {
	private Integer id; //id 
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private Date birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private Integer createdBy;   //创建者
	private Date creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private Date modifyDate;   //更新时间
	
	private Role role;
	
	
	
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUserCode() {
		return userCode;
	}
	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public Integer getGender() {
		return gender;
	}
	public void setGender(Integer gender) {
		this.gender = gender;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Integer getUserRole() {
		return userRole;
	}
	public void setUserRole(Integer userRole) {
		this.userRole = userRole;
	}
	public Integer getCreatedBy() {
		return createdBy;
	}
	public void setCreatedBy(Integer createdBy) {
		this.createdBy = createdBy;
	}
	public Date getCreationDate() {
		return creationDate;
	}
	public void setCreationDate(Date creationDate) {
		this.creationDate = creationDate;
	}
	public Integer getModifyBy() {
		return modifyBy;
	}
	public void setModifyBy(Integer modifyBy) {
		this.modifyBy = modifyBy;
	}
	public Date getModifyDate() {
		return modifyDate;
	}
	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", userCode=" + userCode + ", userName=" + userName + ", userPassword=" + userPassword
				+ ", gender=" + gender + ", birthday=" + birthday + ", phone=" + phone + ", address=" + address
				+ ", userRole=" + userRole + ", createdBy=" + createdBy + ", creationDate=" + creationDate
				+ ", modifyBy=" + modifyBy + ", modifyDate=" + modifyDate + "]";
	}
	
}

4、写接口(mapper层即dao层)UserMapper.java

里面的方法都是之前写的,初学者(虽然没人看!!!)看这篇博客可以先忽略,但有一点要注意!!!
类名必须和自己在mapper.xml文件中写的sql语句的id一致才可以!这样才能映射到相应的sql语句。

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.zhiyou.pojo.User;

//mapper 映射
//maper --- dao层
public interface UserMapper {
	
	//获取总记录数
	public int count();
	
	//查询是所有
	public List<User> getAll();
	
	
	//根据User的id 更新
	//参数太多,不知道那个参数对应sql中的哪个占位符
	//用@Param实现数据的绑定
	public int updateUserById(@Param("id")int id,@Param("userPassword")String userPassword);
	
	//如果参数特别多  传对象
	public int updateUserById(@Param("user")User user);
	
	//删除
	public int deleteById(int id);
	
	//新增
	public int insertUser(@Param("user")User user);

}

5、写接口对应的mapper(xml)文件

目前为了简便,直接写在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">
  <!-- 此文件是映射文件 此文件存放sql语句 -->
  
  <!-- namespace 跟包名.类名对应 -->
<mapper namespace="com.zhiyou.mapper.UserMapper">

	<!-- id跟方法名对应 -->	
	<select id="count" resultType="int">
		select count(*) from smbms_user
	</select>
	
	<!-- 根据User的id 更新 -->
	<update id="updateUserById" parameterType="User">
		update smbms_user set userPassword=#{user.userPassword} where id=#{user.id}
	</update>
	
	<!-- 自定义返回值类型   映射-->
	<resultMap type="User" id="UserAndRole">
		<id property="id" column="ID"/>
		<result property="userCode" column="USERCODE"/>
		<result property="userName" column="USERNAME"/>
		<result property="userPassword" column="USERPASSWORD"/>
		<!-- 一对一关系 -->
		<association property="role" javaType="com.zhiyou.pojo.Role">
			<id property="id" column="ID"/>
			<result property="roleCode" column="ROLECODE"/>
			<result property="roleName" column="ROLENAME"/>
		</association>
	</resultMap>
	
	<select id="getUserAndRole" resultMap="UserAndRole">
		select userName,roleName from smbms_user u,smbms_role r where u.userRole = r.id
	</select>
	
	<!-- 自己定义返回值的映射关系 -->
	<!-- property 存放类的属性名  column 存放表的字段名 -->
	<!-- resultMap 主要做多张表的映射 单张表不需要这样写 -->
	<resultMap type="User" id="UserMap">
		<id property="id" column="ID"/>
		<result property="userCode" column="userCode"/>
		<result property="userName" column="userName"/>
		<result property="birthday" column="birthday"/>
	</resultMap>
	
	<!-- 根据id进行查询 -->
	<select id="getById" parameterType="int" resultMap="UserMap">
		select * from smbms_user where id=#{id}
	</select>
	
	<!-- 查询所有用户 -->
	<select id="getAll" resultType="com.zhiyou.pojo.User">
		select * from smbms_user 
	</select>
	
	<!-- 更新  -->
	<update id="updateById">
		update smbms_user set userPassword=#{userPassword} where id=#{id}
	</update>
	
	<delete id="deleteById">
		delete from smbms_user where id=#{id}
	</delete>
	
	<!-- 插入 -->
	<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
		insert into smbms_user (userCode,userName,userPassword,birthday) values (#{user.userCode},#{user.userName},#{user.userPassword},#{user.birthday})
	</insert>
	
	<!-- 根据角色获取所有的用户 -->
	<select id="getUserByRole" resultMap="UserAndRole">
		select userName,roleName from smbms_user u,smbms_role r where u.userRole = r.id and r.roleName='普通员工'
	</select>
	
	
	
	<!-- 分步查询 -->
	<!-- 根据角色名字获取角色id -->
	<select id="getIdByroleName" resultType="Role">
		select id from smbms_role where roleName=#{roleName}
	</select>
	<!-- 根据角色id查询所有用户信息 -->
	<select id="getUserByRoleId" resultType="User">
		select userName,birthday from smbms_user where userRole=#{userRole}
	</select>
	
</mapper>

6、写Mybatis的配置文件

下面就要编写mybatis的配置文件了

<!-- 约束必须有 不多做解释-->
<?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>

<!-- 引入database.properties 文件
有时候我们可能要更换数据库,或者更改了数据库用户名或者密码,这样我们就必须找到
mybatis文件去修改,那么我们可以把配置数据库连接的驱动、url、用户名和密码单独拉出来,
写到database.properties文件上,这样我们修改的时候就会更加方便
 -->
<properties resource="database.properties"></properties>

  	<!-- 给type起一个别名  方便调用-->
	<typeAliases>
	<typeAlias type="com.zhiyou.pojo.User" alias="User"/>
	<typeAlias type="com.zhiyou.pojo.Role" alias="Role"/>
	</typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
<!--
此注释是不使用 database.properties 配置文件   
<environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/smbms?useSSL=true&amp;serverTimezone=GMT"/>
        <property name="username" value="root"/>
        <property name="password" value="1230"/>
      </dataSource>
    </environment>
  </environments> -->
  

  
  <!-- 指定映射文件的位置 必须指定映射文件的位置,这样能调用mapper(dao)层,
  从而调用mapper.xml文件中的sql语句-->
  <mappers>
    <mapper resource="com/zhiyou/mapper/UserMapper.xml"/>
    <mapper resource="com/zhiyou/mapper/RoleMapper.xml"/>
  </mappers>
  
  
</configuration>

7、编写测试类测试

下面咱们来写一个测试类来测试一下:

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
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 com.zhiyou.pojo.Role;
import com.zhiyou.pojo.User;

public class Test {
	
	public static void main(String[] args) throws IOException {
		
		//1.读配置文件
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//2.创建 SqlSessionFactory 的构建者对象
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		//3.使用构建者创建工厂对象 SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new builder.build(inputStream);
		//4.使用 SqlSessionFactory 生产 SqlSession 对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//下面就是通过SqlSession创建dao接口的代理对象,
		例子如下:(自己慢慢看把,创建流程完毕)
		//最后一彩蛋 ,可以一观
		//查询
		//找sql语句
/*		int count = sqlSession.selectOne("com.zhiyou.mapper.UserMapper.count");
		System.out.println("count:"+count);*/
		
/*		User user = sqlSession.selectOne("com.zhiyou.mapper.UserMapper.getById", 2);
		System.out.println(user.getBirthday());*/
		
/*		List<User> list = sqlSession.selectList("com.zhiyou.mapper.UserMapper.getAll");
		System.out.println(list.size());
		System.out.println(list.get(8).getUserName());*/

		
		
		//更新
	/*	User user2 = new User();
		user2.setUserPassword("1234");
		user2.setId(15);
		
		//1.传参
		int i = sqlSession.update("com.zhiyou.mapper.UserMapper.updateById", user2);
		sqlSession.commit();
		System.out.println(i);
		*/
		
		//删除
		/*int count = sqlSession.delete("com.zhiyou.mapper.UserMapper.deleteById",11);
		sqlSession.commit();
		System.out.println(count);*/
		
		//插入
/*		User user = new User();
		user.setUserCode("zhangyixing");
		user.setUserName("张艺兴");
		user.setUserPassword("1234");
		user.setBirthday(new Date());
		int i = sqlSession.insert("com.zhiyou.mapper.UserMapper.insertUser",user );
		sqlSession.commit();
		System.out.println(i);*/
		
		
		/*List<User> list = sqlSession.selectList("com.zhiyou.mapper.UserMapper.getUserAndRole");
		System.out.println(list.size());
		for (User user : list) {
			System.out.println(user.getUserName()+"\t"+user.getRole().getRoleName());
		}*/
		

		
		/*List<User> list = sqlSession.selectList("com.zhiyou.mapper.UserMapper.getUserByRole");
		System.out.println(list.size());
		for (User user : list) {
			System.out.println(user.getUserName()+"\t"+user.getRole().getRoleName());
		}*/
		
/*		//1.根据Role表的roleName得到id
		//查询返回值是一个role对象,用string接就会类型转换异常
		Role role = sqlSession.selectOne("com.zhiyou.mapper.UserMapper.getIdByroleName","普通员工");
		System.out.println(role.getId());
		int id = role.getId();
		
		//2.根据角色的id查询所有的用户信息
		List<User> list = sqlSession.selectList("com.zhiyou.mapper.UserMapper.getUserByRoleId", id);
		System.out.println(list.size());
		for (User user : list) {
			System.out.println(user.getUserName());
		}*/
		
		List<Role> list = sqlSession.selectList("com.zhiyou.mapper.RoleMapper.getAllUsersByRoleName");
		System.out.println(list.size());
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i).getList().get(0).getUserName());
		}
		//关闭资源
		sqlSession.close();
		
	}

}

彩蛋----代码优化:
可以把创建SqlSession对象写成一个工具类。然后每次调用工具类创建SqlSession对象的类就可以了,代码如下:

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;

public class SqlSessionUtil {
	
	public static SqlSession getSqlSession() {
		SqlSession sqlSession =null;
		try {
			//读配置文件
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			//创建工厂类
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			//创建SqlSession
			sqlSession = sqlSessionFactory.openSession();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			sqlSession.rollback();
		}
		return sqlSession;
	}

}

还有一种创建sql语句的注解的方式 后面再谈。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值