Mybatis快速上手

1. 什么是Mybatis
  • MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
  • MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;
  • MyBatis使用简单的XML或注解做配置和定义映射关系将Java的POJOs ( Plain Old Java Objects )映射成数据库中的记录。
2. 开发流程
  • 导入MyBatis开发包和数据库驱动包
  • 在src下添加MyBatis主配置文件SqlMapConfig.xml。①修改连接数据库的参数;②配置映射文件,路径是辅配置文件的包名.文件名
  • 在src下创建包并添加辅配置文件。①添加namespace=“” ;②在< mapper>中添加标签(DDL,DML,TCL等);③观察sql语句有没有返回值和参数;④需要一个id
  • 获取SqlSession对象。①读取配置文件;②创建SqlSessionFactoryBuilder并加载配置文件;③创建SqlSessionFactory; ④创建SqlSession;⑤执行后面的系列操作
3. 简单测试案例

在这里插入图片描述
Ⅰ 通过SqlMapper.xml定义sql语句
(1)SqlMapConfig.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>
    <!--配置properties-->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&amp;characterEncoding=utf8"
  ></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </properties>
    <!--配置环境-->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"></property>
                <property name="username" value="${username}"></property>
                <property name="password" value="${password}"></property>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 配置辅映射文件的位置,与其联系起来-->
    <mappers>
       <!-- 注意:包名的.要换成/ -->
        <mapper resource="com/hqyj/sql/SqlMapper.xml"></mapper>
    </mappers>
</configuration>

(2) user.java

package com.hqyj.entity;

public class User {

	private String cn_user_id;
	private String cn_user_name;
	private String cn_user_password;
	private String cn_user_token;
	private String cn_user_nick;
	public String getCn_user_id() {
		return cn_user_id;
	}
	public void setCn_user_id(String cn_user_id) {
		this.cn_user_id = cn_user_id;
	}
	public String getCn_user_name() {
		return cn_user_name;
	}
	public void setCn_user_name(String cn_user_name) {
		this.cn_user_name = cn_user_name;
	}
	public String getCn_user_password() {
		return cn_user_password;
	}
	public void setCn_user_password(String cn_user_password) {
		this.cn_user_password = cn_user_password;
	}
	public String getCn_user_token() {
		return cn_user_token;
	}
	public void setCn_user_token(String cn_user_token) {
		this.cn_user_token = cn_user_token;
	}
	public String getCn_user_nick() {
		return cn_user_nick;
	}
	public void setCn_user_nick(String cn_user_nick) {
		this.cn_user_nick = cn_user_nick;
	}
	@Override
	public String toString() {
		return "User [cn_user_id=" + cn_user_id + ", cn_user_name=" + cn_user_name + ", cn_user_password="
				+ cn_user_password + ", cn_user_token=" + cn_user_token + ", cn_user_nick=" + cn_user_nick + "]";
	}
}

(3) SqlMapper.xml
映射定义文件,用于定义SQL语句和映射信息

<?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">
<!-- namespace命名空间,作用就是对sql进行分类化管理(sql隔离) -->
<!-- 辅配置文件 -->
<mapper namespace="com.hqyj.dao.UserDao">
	<select id="findAll" resultType="com.hqyj.entity.User">
	     select * from cn_user; <!-- 注意:加不加分号都可以 -->
	</select> 
	
	<select id="findByName" resultType="com.hqyj.entity.User" parameterType="string">
	     select * from cn_user where cn_user_name=#{cn_user_name} <!-- 注意:只有一个参数时,#{}内的内容可以随便写 -->
	</select>
	
	<!-- 由于是插入了所有信息,参数类型可以直接用对象即可,但是values值必须与对象的属性相同,不能随便写 -->
	<insert id="save" parameterType="com.hqyj.entity.User">
	     insert into cn_user(cn_user_id,cn_user_name,cn_user_password,cn_user_token,cn_user_nick) 
	     values(#{cn_user_id},#{cn_user_name},#{cn_user_password},#{cn_user_token},#{cn_user_nick})
	</insert>
	
	<delete id="delete" parameterType="string">
       delete from cn_user where cn_user_name = #{user_name}
   </delete>
   
   <update id="update" parameterType="com.hqyj.entity.User">
       update cn_user set cn_user_nick = #{cn_user_nick} where cn_user_name = #{cn_user_name}
   </update>
</mapper>

(4)TestMybatis.java (测试类)

package com.hqyj.test;

import java.io.IOException;
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 org.junit.Test;
import com.hqyj.dao.UserDao;
import com.hqyj.entity.User;

public class TestMybatis {
  
	@Test //查询所有信息
	public void test01() throws IOException{
		//读取主配置文件,为了连接数据库
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		//创建SqlSessionFactoryBuilder对象.可以加载主配置文件
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		//获取的session可以执行SQL语句
		SqlSession session=ssf.openSession();
		
		List<User> users=session.selectList("findAll");
		for(int i=0;i<users.size();i++){
			System.out.println(users.get(i).getCn_user_name());
		}
	}
	
	@Test  //按名字查找
	public void test02() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=session.selectOne("findByName","demo");
		System.out.println(user.getCn_user_id());
		
	}
	
	@Test  //增加新用户
	public void test03() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=new User();
		user.setCn_user_id("122");
		user.setCn_user_name("xxx");
		user.setCn_user_password("123456");
		user.setCn_user_token("df");
		user.setCn_user_nick("ming");
		session.insert("save",user);
		//提交事务,必须放在最后。即当执行DML时,需要完成提交(delete、insert、update)
		session.commit();
	}
	
	@Test  //删除用户
	public void test04() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		session.delete("delete","demo");
		session.commit();
	}
	
	@Test  //修改用户
	public void test05() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=session.selectOne("findByName","xxx");
		user.setCn_user_nick("xin");
		session.update("update",user);
		session.commit();
	}
}

Ⅱ 升级:使用Mapper映射器(重点)
Mapper映射器是开发者创建绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。该接口中的函数与SqlMapper.xml中的相对应。
Mapper接口映射规则——重要
(1)id属性作为接口的方法名
(2)resultType类型为方法的返回值类型
(3)ParameterType为方法的参数类型
(4)namespace为接口路径:包名.接口名
※ 实例:
(1)SqlMapConfig.xml和User.java与上相同。
(2)UserDao.java——Mapper接口

package com.hqyj.dao;
import java.util.List;
import com.hqyj.entity.User;

public interface UserDao {
	/*
	 * Mapper接口映射规则
	   1.id就是方法名
	   2.resultType就是返回值类型
	   3.ParameterType就是参数
	   4.namespace就是我们的接口路径:包名.接口名
	*/
	
	public List<User> findAll();
	public User findByName(String name);
	public void save(User user);
	public void delete(String name);
	public void update(User user);
}

(3)TestMybatis.java——测试类

@Test  //按名字查找
	public void test06() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
 		User user=dao.findByName("flora");
 		System.out.println(user);
	}
	
	@Test  //查找所有
	public void test07() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    List<User> users=dao.findAll();
	    for (User user : users) {
	        System.out.println(user);
	    }
	}
	
	@Test  //增加用户
	public void test08() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=new User();
	    user.setCn_user_id("222");
		user.setCn_user_name("mmm");
		user.setCn_user_password("1234");
		user.setCn_user_token("dff");
		user.setCn_user_nick("mi");
	    dao.save(user);
	    session.commit();
	}
	
	@Test //删除用户
	public void test09() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=new User();
	    dao.delete("demo1");
	    session.commit();
	}
	
	@Test  //修改用户
	public void test10() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=dao.findByName("pc");
	    user.setCn_user_nick("tian");
	    dao.update(user);
	    session.commit();
	}
4. 问题解决

(1) Error:
Unknown initial character set index ‘255’ received from server. Initial client character set can be forced via the ‘characterEncoding’ property.

  • 可知出错信息是字符集设置出现问题
  • 原书写语句:< property name=“url” value=“jdbc:mysql://localhost:3306/cloud_note”></ property>
  • 修改为下面的语句即可:
<property name="url" value="jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&amp;characterEncoding=utf8"></property>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值