行业知识
Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存
Mybatis
入门
1.导入maven依赖
org.mybatis mybatis x.x.x
2.配置核心文件
3.从 XML 中构建 SqlSessionFactory
���写mybatis工具类
package com.utils;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;/*SqlSessionFactory --> sqlSession */public class MybatisUtils{ //提升作用域 private static SqlSessionFactory sqlSessionFactory; static{ try { String resource="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); /* SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession;*/ }} dao接口
public interface Userdao { List getUserList();} 接口实现类由原来的UserDaolmpl转变为-一个Mapper配置文件.
select * from mybatis.users
测试
public class UserdaoTest { @Test public void test(){ //第一步获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一getMapper /* Userdao userdao = sqlSession.getMapper(Userdao.class); List userList = userdao.getUserList();*/ //方式二 List userList = sqlSession.selectList("com.dao.Userdao.getUserList"); for (User user : userList) { System.out.println(user); } sqlSession.close(); } } 测试二
public class UserdaoTest { @Test public void test(){ //第一步获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //方式一getMapper Userdao userdao = sqlSession.getMapper(Userdao.class); List userList = userdao.getUserList(); for (User user : userList) { System.out.println(user); } } catch (Exception e) { e.printStackTrace(); }finally { //关闭sqlSession sqlSession.close(); } 实现步骤
CRUD
select
insert
update
dalete
创建实体类
package com.pojo;public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; }} 编写接口
public interface UserMapper { //查询所有用户 List getUserList(); //根据id查询客户 User getUserById(int id); //新增 int addUser(User user); //修改 int update(User user); //删除 int dalete(int id);} 编写对应sql语句
//查询所有用户 select *from user //根据id查询客户 select *from user where id = #{id}; //新增 insert into user (id,name,pwd) values (#{id},#{name},#{pwd}) //修改 update user set name =#{name},pwd = #{pwd} where id = #{id}; //删除 delete from user where id = #{id}; 测试
public class UserdaoTest { @Test public void test(){ //第一步获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //方式一getMapper UserMapper mapper= sqlSession.getMapper(UserMapper.class); List userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } } catch (Exception e) { e.printStackTrace(); }finally { //关闭sqlSession sqlSession.close(); } //方式二 /* List userList = sqlSession.selectList("com.dao.Userdao.getUserList");*/ } @Test public void getUserById(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); } @Test public void addUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res= mapper.addUser(new User(4,"王瑞","123")); if (res>0){ System.out.println("添加成功"); } sqlSession.commit(); sqlSession.close(); } @Test public void update(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int update = mapper.update(new User(4, "徐龙象", "1999")); /*if(update>0){v System.out.println("修改成功"); }*/ sqlSession.commit(); sqlSession.close(); } @Test public void dalete(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.dalete(4); sqlSession.commit(); sqlSession.close(); } 万能map
Map传递参数,直接在sq|中取出key即可! [parameterType=“map”]
对象传递参数,直接在sq|中取对象的属性即可! [parameterType=“Object”]
只有一个基本类型参数的情况下,可以直接在sq|中取到!
多个参数用Map,或者注解!
新增
接口
//mapint addUser2(Mapmap);
sql连接
insert into user (id,pwd) values (#{userid},#{password}) 测试
@Testpublic void addUser2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //HashMap Map map = new HashMap(); map.put("userid",5); map.put("password","123"); mapper.addUser2(map); sqlSession.commit(); sqlSession.close();} 查询
sql
select *from user where id = #{id} ; 接口
User getUserById2(Mapmap);
测试
@Testpublic void getUserById2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap map = new HashMap(); map.put("id",1); mapper.getUserById2(map); System.out.println(mapper.getUserById2(map)); sqlSession.close();} Mybatis模糊查询
Java代码执行的时候,传递通配符% %
List userListLike = mapper.getUserListLike("%xu%"); 2.在sq|拼接中使用通配符!
接口
List getUserListLike(String name);
sql
根据name查询
select *from user where name like "%"#{value}"%" 测试
@Testpublic void getUserListLike(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List userListLike = mapper.getUserListLike("xu"); for (User user : userListLike) { System.out.println(user); } sqlSession.close();} 配置解析
1.核心配置文件
mybaits-config.xml
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)
1.环境配置(environments)
尽管可以配置多个环境,但每个 SqlSessionFactory(创建SqlSession的工厂)实例只能选择一种环境。
Mybatis默认的事务管理器就是JDBC,
连接池:POOLED
2.properties(属性)
新建db. properties文件
driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8username=rootpassword=123456
mybatis-config.xml
或者
可以直接引入外部文件
可以在其中增加一-些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的!
3.类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写
2.指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
每一个在包 com.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.pojo` 的别名为 userhello;若有注解,则别名为其注解值。
@Alias("userhello")public class User { 4.设置(settings)
一个配置完整的 settings 元素的示例如下:
//全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 //延迟加载的全局开关 //是否允许单个语句返回多结果集 //使用列标签代替列名,实际表现依赖于数据库驱动 //允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。 //指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集 /* 指定发现自动映射目标未知列(或未知属性类型)的行为。 NONE: 不做任何反应 WARNING: 输出警告日志( org.apache.ibatis.session.AutoMappingUnknownColumnBehavior 的日志等级必须设置为 WARN) FAILING: 映射失败 (抛出 SqlSessionException) */ /* 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement), BATCH 执行器不仅重用语句还会执行批量更新。 支持 SIMPLE REUSE BATCH 默认 SIMPLE */ //设置超时时间,它决定数据库驱动等待数据库响应的秒数。 //控制每次从数据库获取数据的行数 //允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false //是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 /* MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 */ /* 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType常用值:NULL、VARCHAR 或 OTHER。 默认 OTHER */ /* 指定对象的哪些方法触发一次延迟加载。 支持 用逗号分隔的方法列表。 默认 equals,clone,hashCode,toString */ RowBounds rowBounds = new RowBounds(1,2); SqlSession sqlSession = MybatisUtils.getSqlSession(); List System.out.println(user); } sqlSession.close();} SqlSession sqlSession = MybatisUtils.getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); HashMap hashMap = new HashMap(); //hashMap.put("title","Java"); hashMap.put("author","陈平安"); List System.out.println(blog); } sqlSession.close(); } and views = #{views} ``` 以下属性是必须的:
**name:**Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
**maxElementsInMemory:**在内存中缓存的element的最大数目。
**maxElementsOnDisk:**在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
**eternal:**设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
**overflowToDisk:**如果内存中数据超过内存限制,是否要缓存到磁盘上。
以下属性是可选的:
**timeToIdleSeconds:**对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
**timeToLiveSeconds:**对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
**diskPersistent:**是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
**diskExpiryThreadIntervalSeconds:**对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
**diskSpoolBufferSizeMB:**DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy:如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
缓存的3 种清空策略:
FIFO,first in first out (先进先出).
LFU, Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
LRU,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
结束啦
上一篇:提升百度云下载速度的有效方法
下一篇:怎么拥有谷歌服务器?