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

    xiaoxiao2021-03-25  57

    一.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();

    转载请注明原文地址: https://ju.6miu.com/read-35683.html

    最新回复(0)