MyBatis学习一 mybatis的原理,操作流程
来源:互联网 发布:mac国家缩写 编辑:程序博客网 时间:2024/06/07 22:47
一.MyBatis简介
MyBatis就是一个持久层的框架,它让程序员只关注sql本身,而不需要关注连接的创建,statement的创建,MyBatis将输入参数,输出结果进行映射
二.MyBatis的原理(执行流程)
三.MyBatis操作流程
1.最基本的查询
从上面原理可以看出,首先我们要写配置文件
SqlMapConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-//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.Driverurl=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8username=rootpassword=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;}@Overridepublic 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>
测试代码:
@Testpublic void test1() throws IOException{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建sessionSqlSession 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>
测试代码:
@Testpublic void test2() throws IOException{String resource="SqlMapConfig.xml";//读取配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//建立sqlsessionFactorySqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);//创建sessionSqlSession 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>测试代码:
@Testpublic void insertUserTest() throws Exception{//读取配置文件//全局配置文件的路径String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//创建SqlSessionSqlSession 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 0
- MyBatis学习一 mybatis的原理,操作流程
- 【Mybatis学习总结一】Mybatis的helloworld
- Mybatis操作主体流程
- MyBatis原理--插入操作
- MyBatis原理--查询操作
- MyBatis的学习(一)
- myBatis的学习(一)
- Mybatis的学习(一)
- Mybatis 代码流程及实现原理解析(一)
- Mybatis原理篇一
- mybatis工作原理&执行流程
- Mybatis实现原理/工作流程
- Mybatis学习(二)Mybatis框架的原理
- springMVC+Mybatis 学习笔记-【1】Mybatis的框架原理
- 框架学习系列 mybatis 第二篇 mybatis的工作原理
- MyBatis学习(二)-- 简述MyBatis的原理
- Mybatis原理与学习
- 【Mybatis学习总结二】Mybatis操作数据表的CRUD实现
- x=a%pq与x=a%p,x=a%q的关系(pq互质)
- PAT(basin)
- 3039.顺序查找关键字
- Leetcode——04Median of Two Sorted Arrays
- pta basin 1001
- MyBatis学习一 mybatis的原理,操作流程
- F函数的极大极大算法
- 24. Swap Nodes in Pairs
- Blank space issue in tns names ora
- C++之引用
- 来说说深圳搬家公司网站的优化策略
- 谱聚类(spectral clustering) python可视化实现
- hadoop基础框架介绍
- 子沐教你Scrapy——浅谈Python爬虫