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
原创粉丝点击