简述mybatis的优点,mybatis深入理解

  简述mybatis的优点,mybatis深入理解

  

目录

米巴提斯基础回顾与高级应用引入依赖JDBC。属性sqlmapconfig。可扩展置标语言案例一-查询用户案例二-添加用户案例三-编辑用户案例四-删除用户传统开发方式代理开发方式(使用爪哇岛开发工具包动态代理产生代理对象,由代理对象执行并且操作)动态结构化查询语言语句如果标签框架复杂映射一对一一对多多对多框架注解开发框架注解实现复杂映射开发框架缓存基础概念一级缓存返回结果为真实;测试一级缓存是默认开启的返回结果为错误的二级缓存如何使用二级缓存返回结果为错误的

 

  

Mybatis基础回顾与高级应用

数据库:mysql5.7

 

  jdk:15

  

引入依赖

!- 引入依赖-依赖!-我的巴蒂斯坐标-依赖关系groupIdorg.mybatis/groupId artifactIdmybatis/artifactId版本3 . 4 . 5/版本/依赖关系!- mysql驱动坐标-依赖关系groupId MySQL/groupId artifact id MySQL-connector-Java/artifact id版本5。1 .6/版本范围运行时/范围/依赖关系!- 单元测试坐标-依赖关系groupId JUnit/groupId工件Id JUnit/工件id版本4.12/版本/依赖关系groupIdorg.projectlombok/groupId工件id lombok/工件id版本1 .18 .22/版本/依赖关系/依赖关系用户实体

 

  @Datapublic类用户{私有整数id;私有字符串用户名;}

  

jdbc.properties

JDBC。driver=com。MySQL。JDBC。司机JDBC。URL=JDBC : MySQL ://127。0 .0 .1/zdy _ mybatisjdbc。用户名=根JDBC。密码=root

 

  

sqlMapConfig.xml

?可扩展标记语言版本=1.0 编码=UTF八号?文档类型配置PUBLIC -//mybatis。org//DTD配置3.0//EN http://mybatis。org/DTD/mybatis-3-Config。 DTD 配置!- 加载外部的性能文件-properties resource= JDBC。properties /properties!- 给实体类的全限定类名给别名-键入别名!- 给单独的实体起别名- !-中尉

 

  ;typeAlias type="com.yun.pojo.User" alias="user"></typeAlias>-->        <!--批量起别名:该包下所有的类的本身的类名:别名还不区分大小写-->        <package name="com.yun.pojo"/>    </typeAliases>    <!--environments:运行环境-->    <environments default="development">        <environment id="development">            <!--当前事务交由JDBC进行管理-->            <transactionManager type="JDBC"></transactionManager>            <!--当前使用mybatis提供的连接池-->            <dataSource type="POOLED">                <property name="driver" value="${jdbc.driver}"/>                <property name="url" value="${jdbc.url}"/>                <property name="username" value="${jdbc.username}"/>                <property name="password" value="${jdbc.password}"/>            </dataSource>        </environment>    </environments>    <!--引入映射配置文件-->    <mappers>        <mapper resource="UserMapper.xml"></mapper>    </mappers></configuration>

 

  

案例一-查询用户

UserMapper.xml

 

  

<mapper namespace="user"> <!--select--> <select id="findAll" resultType="com.yun.pojo.User"> select * from user </select></mapper>
@Test public void test1() throws IOException { //1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); //2.解析了配置文件,并创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.生产sqlSession // 默认开启一个事务,但是该事务不会自动提交 //在进行增删改操作时,要手动提交事务 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.sqlSession调用方法:查询所有selectList 查询单个:selectOne 添加:insert 修改:update 删除:delete List<User> users = sqlSession.selectList("user.findAll"); users.forEach(item ->{ System.out.println(item); }); sqlSession.close(); }

输出结果

 

  

User(id=1, username=Tom)User(id=2, username=Jerry)

 

  

 

  

案例二-添加用户

UserMapper.xml

 

  

<!--parameterType:参数类型--><insert id="saveUser" parameterType="com.yun.pojo.User"> insert into user Values (#{id},#{username})</insert>
@Test public void test2() throws IOException { InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(3); user.setUsername("jack"); sqlSession.insert("user.saveUser",user); sqlSession.commit(); sqlSession.close(); }

数据库结果:

 

  

 

  

 

  

案例三-编辑用户

UserMapper.xml

 

  

<update id="updateUser" parameterType="com.yun.pojo.User"> update user set username = #{username} where id = #{id}</update>
@Test public void test3() throws IOException { InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(3); user.setUsername("rose"); sqlSession.update("user.updateUser",user); sqlSession.commit(); sqlSession.close(); }

数据库结果:

 

  

 

  

 

  

案例四-删除用户

UserMapper.xml

 

  

<delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id =#{id}</delete>
 @Test public void test4() throws IOException { InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(3); sqlSession.delete("user.deleteUser",3); sqlSession.commit(); sqlSession.close(); }

数据库结果:

 

  

 

  

 

  

传统开发方式

public interface IUserDao { //查询所有用户 List<User> findAll() throws IOException;}

UserDaoImpl

 

  

public class UserDaoImpl implements IUserDao { @Override public List<User> findAll() throws IOException { InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> users = sqlSession.selectList("user.findAll"); sqlSession.close(); return users; }}
@Test public void test5() throws IOException { UserDaoImpl dao = new UserDaoImpl(); List<User> users = dao.findAll(); System.out.println(users); }

打印结果:

 

  

[User(id=1, username=Tom), User(id=2, username=Jerry)]

 

  

 

  

代理开发方式(使用JDK动态代理产生代理对象,由代理对象执行并且操作)

Mapper接口开发需要遵行以下规范:

 

  mapper.xml文件中的namespace与mapper接口的全限定名相同;2. mapper接口方法名和mapper.xml中定义的每个statement的id相同3. mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同4. mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

  根据上述的规范修改UserMapper.xml

  

<mapper namespace="com.yun.dao.IUserDao"> <!--select--> <select id="findAll" resultType="com.yun.pojo.User"> select * from user </select></mapper>
public interface IUserDao { //查询所有用户 List<User> findAll() throws IOException;}
@Testpublic void test6() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao mapper = sqlSession.getMapper(IUserDao.class); List<User> all = mapper.findAll(); all.forEach(item ->{ System.out.println(all); });}

输出结果:

 

  

User(id=1, username=Tom)User(id=2, username=Jerry)

 

  

 

  

动态sql语句 if标签

public interface IUserDao { //多条件组合查询:演示if public List<User> findByCondition(User user);}
<!--抽取sql片段--><sql id="selectUser"> select * from user</sql><!--多条件组合查询:演示if--><select id="findByCondition" parameterType="user" resultType="user"> <include refid="selectUser"></include> <where> <if test="id !=null"> and id = #{id} </if> <if test="username !=null"> and username = #{username} </if> </where></select>
@Test public void test7() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao mapper = sqlSession.getMapper(IUserDao.class); User user1 = new User(); user1.setId(1); user1.setUsername("Tom"); List<User> all = mapper.findByCondition(user1); for (User user : all) { System.out.println(user); } }

输出结果:

 

  

User(id=1, username=Tom)

 

  

动态sql语句 foreach标签

 

  

public interface IUserDao { //多值查询:演示foreach public List<User> findByIds(int[] ids);}
<!--多值查询:演示foreach--><select id="findByIds" parameterType="list" resultType="user"> <include refid="selectUser"></include> <where> <foreach collection="array" open="id in (" close=")" item="id" separator=","> #{id} </foreach> </where></select>
@Testpublic void test8() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao mapper = sqlSession.getMapper(IUserDao.class); int[] arr = {1,2}; List<User> all = mapper.findByIds(arr); for (User user : all) { System.out.println(user); }}

输出结果:

 

  

User(id=1, username=Tom)User(id=2, username=Jerry)

 

  

 

  

Mybatis复杂映射

 

  

一对一

User实体

 

  

@Datapublic class User { private Integer id; private String username; //该用户所具有的订单信息 private List<Order> orders; //该用户所具有的角色信息 private List<Role> roles;}

Order实体

 

  

@Datapublic class Order { private Integer id; private String orderTime; private BigDecimal total; //表明该订单属于哪个用户 private User user;}

Role实体

 

  

@Datapublic class Role { private Integer id; private String roleName;}
public interface IOrderMapper { /** * 查询订单的同时还查询该订单所属的用户 * @return */ public List<Order> findOrderAndUser();}
<resultMap id="orderMap" type="com.yun.pojo.Order"> <result property="id" column="id"></result> <result property="orderTime" column="order_time"></result> <result property="total" column="total"></result> <association property="user" javaType="com.yun.pojo.User"> <result property="id" column="uid"></result> <result property="username" column="username"></result> </association></resultMap><!--resultMap:手动来配置实体属性与表字段的映射关系--><select id="findOrderAndUser" resultMap="orderMap"> select * from orders o,user u where o.uid = u.id</select>
@Testpublic void test1() throws IOException { //1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); //2.解析了配置文件,并创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.生产sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); IOrderMapper mapper = sqlSession.getMapper(IOrderMapper.class); List<Order> orderAndUser = mapper.findOrderAndUser(); orderAndUser.forEach(order -> { System.out.println(order); });}

运行结果:

 

  

Order(id=1, orderTime=2022-05-01, total=1000.00, user=User(id=1, username=Tom, orders=null, roles=null))Order(id=2, orderTime=2022-05-10, total=2000.00, user=User(id=2, username=Jerry, orders=null, roles=null))Order(id=3, orderTime=2022-05-20, total=3000.00, user=User(id=2, username=Jerry, orders=null, roles=null))

 

  

 

  

一对多

public interface IUserMapper { /** * 查询所有用户信息,同时查询出每个用户关联的订单信息 * @return */ public List<User> findAll();}
<resultMap id="userMap" type="com.yun.pojo.User"> <id property="id" column="id"></id> <result property="username" column="username"></result> <collection property="orders" ofType="com.yun.pojo.Order"> <id property="id" column="oid"></id> <result property="orderTime" column="order_time"></result> <result property="total" column="total"></result> </collection></resultMap><!--resultMap:手动来配置实体属性与表字段的映射关系--><select id="findAll" resultMap="userMap"> select u.*,o.id oid,o.order_time,o.total,o.uid from user u left join orders o on u.id = o.uid</select>
@Test public void test2() throws IOException { //1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); //2.解析了配置文件,并创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.生产sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); IUserMapper mapper = sqlSession.getMapper(IUserMapper.class); List<User> users = mapper.findAll(); users.forEach(user -> { System.out.println(user.getUsername()); System.out.println(user.getOrders()); }); }

运行结果:

 

  

Tom[Order(id=1, orderTime=2022-05-01, total=1000.00, user=null)]Jerry[Order(id=2, orderTime=2022-05-10, total=2000.00, user=null), Order(id=3, orderTime=2022-05-20, total=3000.00, user=null)]

 

  

 

  

多对多

public interface IUserMapper { /** * 查询所有用户信息,同事查询出每个用户关联的角色信息 * @return */ public List<User> findUserAndRole();}
<resultMap id="userAndRoleMap" type="com.yun.pojo.User"> <result property="id" column="userId"></result> <result property="username" column="username"></result> <collection property="roles" ofType="com.yun.pojo.Role"> <result property="id" column="roleId"></result> <result property="roleName" column="rolename"></result> </collection></resultMap><select id="findUserAndRole" resultMap="userAndRoleMap"> SELECT * FROM USER u LEFT JOIN sys_user_role sur ON u.id = sur.user_id LEFT JOIN sys_role sr ON sur.role_id = sr.id</select>
@Testpublic void test3() throws IOException { //1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); //2.解析了配置文件,并创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.生产sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); IUserMapper mapper = sqlSession.getMapper(IUserMapper.class); List<User> users = mapper.findUserAndRole(); users.forEach(user -> { System.out.println(user.getUsername()); System.out.println(user.getRoles()); });}

运行结果:

 

  

Tom[Role(id=null, roleName=董事长), Role(id=null, roleName=经理)]Jerry[Role(id=null, roleName=董事长), Role(id=null, roleName=经理)]

 

  

 

  

Mybatis注解开发

Mybasits常用注解:
@Insert: 实现新增@Update: 实现更新@Delete: 实现删除@Select: 实现查询@Result: 实现结果集封装;他代替的是标签<resultMap>,该注解中可以使用单个@Result注解,也可以使用@Result集合, 使用格式:@Results({@Result(),@Result()}) 或 @Results(@Result())@Results: 可以与@Result一起使用,封装多个结果集@One: 实现一对一结果集封装@Many: 实现一对多结果集封装

测试案例

 

  

public interface IUserMapper { //添加用户 @Insert("insert into user values(#{id},#{username})") public void addUser(User user); //更新用户 @Update("update user set username = #{} where id = #{id}") public void updateUser(User user); //查询用户 @Select("select * from user") public List<User> getAllUser(); //删除用户 @Delete("delete from user where id=#{id}") public void delUser(Integer id);}
private IUserMapper mapper; @Before public void before() throws IOException { //1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream inputStream = Resources.getResourceAsStream("sqlMApConfig.xml"); //2.解析了配置文件,并创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.生产sqlSession true:事务自动提交 SqlSession sqlSession = sqlSessionFactory.openSession(true); mapper = sqlSession.getMapper(IUserMapper.class); } @Test public void addUser(){ User user = new User(); user.setId(3); user.setUsername("jack"); mapper.addUser(user); } @Test public void updateUser(){ User user = new User(); user.setId(3); user.setUsername("rose"); mapper.updateUser(user); } @Test public void getAllUser(){ List<User> userList = mapper.getAllUser(); userList.forEach(item ->&      

	  
	  
	  
	  
	  
	  
        

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: