MyBatis学习一 mybatis的原理,操作流程

一.MyBatis简介

MyBatis就是一个持久层的框架,它让程序员只关注sql本身,而不需要关注连接的创建,statement的创建,MyBatis将输入参数,输出结果进行映射

二.MyBatis的原理(执行流程)

三.MyBatis操作流程

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>

<!--引入database配置文件  -->
<properties resource="db.properties">
</properties>

<!--配置mybatis的环境,如果和spring结合,则由spring管理  -->
<environments default="development">
  <environment id="development">
  <!-- 事物管理,配置JDBC表示 -->
    <transactionManager type="JDBC"></transactionManager>
    <!--配置数据源,采用mybatis连接池,使用POOLED方式  -->
    <dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>
<!-- 映射XMl文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>

从上面可以看出,我们引入了database配置文件,也可以不引入,直接在value中写值

db.properties文件如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
username=root
password=123

pojo类:

public class User implements Serializable{
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	
	//订单信息
	private List<Orders> orders;
	
	public List<Orders> getOrders() {
		return orders;
	}
	public void setOrders(List<Orders> orders) {
		this.orders = orders;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", sex=" + sex
				+ ", birthday=" + birthday + ", address=" + address + "]";
	}
	
}

映射文件:

<?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="test">
<!--
select:表示一个MappedStatement对象
id:Statement的唯一标示
parameterType:传入参数的java类型,parameterType只能有一个,所以入参只能有一个
resultType:输出结果所映射的java类型
#{}:表示一个占位符
#{id}:里面的参数表示输入的参数名称,如果是基本类型,则参数名称任意,如果是其它类型,则必须写对应的参数名
  -->
<select id="findByUserId" parameterType="int" resultType="com.study.mpo.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>

测试代码:

@Test
	public void test1() throws IOException{
		
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession session=sqlSessionFactory.openSession();
		//调用session的增删改查
		User customer=session.selectOne("test.findByUserId", 1);
		System.out.println(customer.getUsername());
		
	}

2.模糊查询或者排序时,使用${}连接符

<!--  
模糊查询
${} :表示一个sql的连接符,即参数传递什么,它就会显示什么
使用该链接符有sql注入风险,但是有些必须使用该链接符,比如${}
-->
 <select id="findLikeByUser" parameterType="java.lang.String" resultType="com.study.mpo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>

测试代码:

	@Test
	public void test2() throws IOException{
		
		String resource="SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//建立sqlsessionFactory
		SqlSessionFactory  sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
		//创建session
		SqlSession session=sqlSessionFactory.openSession();
		//调用session的增删改查
		List<User> customerList=session.selectList("test.findLikeByUser", "小");
		session.close();
		System.out.println(customerList.toString());
		
	}
	

3.添加用户

<!-- 添加用户
value的值根据ONGL表达式来查询
-->
	<insert id="insertUser" parameterType="com.study.mpo.User">
		INSERT INTO USER
		(username,birthday,sex,address)
		VALUES(#{username},#{birthday},#{sex},#{address})
	</insert>
测试代码:

@Test
	public void insertUserTest() throws Exception{
		//读取配置文件
		//全局配置文件的路径
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		User user = new User();
		user.setUsername("xsa");
		user.setAddress("xsaxasx");
		
		//调用SqlSession的增删改查方法
		//第一个参数:表示statement的唯一标示
		sqlSession.insert("test.insertUser", user);
		
		System.out.println(user.getId());
		//提交事务
		sqlSession.commit();
		//关闭资源
		sqlSession.close();
	}

项目中有时候再插入数据的时候,要得到它的id,怎么实现了

3.1自增主键返回ID

<!-- 添加用户 -->
	<!-- selectKey:查询主键,在标签内需要输入查询主键的sql -->
	<!-- order:指定查询主键的sql和insert语句的执行顺序,相当于insert语句来说 -->
	<!-- LAST_INSERT_ID:该函数是mysql的函数,获取自增主键的ID,它必须配合insert语句一起使用 -->
	<insert id="insertUser" parameterType="com.study.mpo.User">
		<selectKey keyProperty="id" resultType="int" order="AFTER">
			SELECT LAST_INSERT_ID() 
		</selectKey>
	
		INSERT INTO USER
		(username,birthday,sex,address)
		VALUES(#{username},#{birthday},#{sex},#{address})
	</insert>

3.2自增主键之UUID

<insert id="insertUser2" parameterType="com.study.mpo.User">
		<selectKey keyProperty="id" resultType="string" order="BEFORE">
			SELECT UUID() 
		</selectKey>
	
		INSERT INTO USER
		(id,username,birthday,sex,address)
		VALUES(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>

四.mapper代理开发

前面我们所看到的都是dao的开发方式,MyBatis提供了Mapper代理的开发方式

使用Mapper代理的开发规范:

1、  mapper接口的全限定名要和mapper映射文件的namespace值一致。

2、  mapper接口的方法名称要和mapper映射文件的statement的id一致。

3、  mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。

4、  mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。


mapper接口:

public interface UserMapper {
	// 1、 根据用户ID查询用户信息
	public User findUserById(int id) throws Exception;
}

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">
<!--namespace必须和mapper接口的全限定名一致-->
 <mapper namespace="com.study.mybatis.mapper.UserMapper">
	<!-- 根据用户ID查询用户信息 -->
	<select id="findUserById" parameterType="int" resultType="User">
		SELECT
		* FROM USER WHERE id =#{id}
	</select>
</mapper>

测试:

// 创建UserMapper对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 由mybatis通过sqlsession来创建代理对象
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);

		User user = mapper.findUserById(1);

		System.out.println(user);

		sqlSession.close();



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值