标签:utc sele 持久层 数据持久化 事务管理 ltm 文件包含 类型 tar
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
数据持久化
为什么需要持久化
Dao层,Service层,Controller层....
最重要的一点!使用的人多
思路:搭建环境 --> 导入Mybatis --> 编写代码 --> 测试
搭建数据库
create database mybatis;
use mybatis;
create table user (
id int(20) not null,
name varchar(30) default null,
pwd varchar(30) default null,
primary key (`id`)
)engine = InnoDB default charset = utf8;
insert into user value
(1,‘张磊‘,‘123456‘),
(2,‘纪烁‘,‘123456‘),
(3,‘王彬‘,‘123456‘),
(4,‘王雁明‘,‘123456‘),
(5,‘袁国伟‘,‘123456‘),
(6,‘苏志辉‘,‘123456‘);
新建项目
1.新建maven项目
2.导入maven依赖
<!-- 父工程-->
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
编写Mybatis的核心配置文件
<?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>
<!-- -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1870535196"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
编写Mybatis的工具类
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//获取SqlSessionFactory对象
String resource = "Mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//有了SqlSessionFactory,就可以获得SqlSession实例了
//SqlSession 完全包含了面向数据库执行sql命令所需的所有方法
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
实体类
package cn.imut.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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name=‘" + name + ‘\‘‘ +
", 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;
}
}
Dao接口
public interface UserDao {
List<User> getUserList();
}
接口实现类
<?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="cn.imut.dao.UserDao">
<!-- id 代表方法名 resultType 代表返回结果(全限定)-->
<select id="getUserList" resultType="cn.imut.pojo.User">
select * from user;
</select>
</mapper>
public class MyTest {
@Test
public void test() {
//1.获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2.执行sql
//方式一、getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for(User user : userList){
System.out.println(user);
}
//方式二、
// List<User> userList1 = sqlSession.selectList("cn.imut.dao.UserMapper.getUserList");
//
// for(User user : userList){
// System.out.println(user);
// }
//关闭
sqlSession.close();
}
}
namespace中的包名要和Mapper/Dao接口的包名一致!
选择,查询语句
编写接口
//根据id查询
User getUserById(int id);
编写mapper中的sql语句
<select id="getUserById" resultType="cn.imut.pojo.User" parameterType="int">
select * from user where id = #{id};
</select>
测试
@Test
public void getUserById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
? 同上
? 同上
? 同上
注意:增删改需要提交事务
标签匹配
resource绑定mapper,需要使用路径
程序配置文件必须符合规范
NullPointerException,没有注册到资源
输出的xml文件中存在乱码问题
maven资源导出问题
假设,实体类,数据库表,字段或者参数过多时,应当考虑使用map
//万能Map
void addUser2(Map<String,Object> map);
<!-- Map #{}可以随便写-->
<insert id="addUser" parameterType="cn.imut.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
//Map测试
@Test
public void addUser2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("userid",7);
map.put("username","map测试");
map.put("ppwd","123456");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在sql中取出key即可!
对象传递参数,直接在sql中取出对象是属性即可!
只有一个基本类型参数的清空下,可以直接在sql中取到!
多个参数使用Map,或者注解!
//模糊查询
@Select("select * from user where name like #{value};")
List<User> getUserLike(String value);
//模糊查询
@Test
public void getUserLike() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("%爷%");
for(User user: userList){
System.out.println(user);
}
sqlSession.close();
}
1.Java代码执行时,传递通配符% %
List<User> userList = mapper.getUserLike("%爷%");
2.在sql拼接中使用通配符
select * from user where name like "%"#{value}"%"
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
Mybatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
学会使用配置多套运行环境!
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1870535196"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1870535196"/>
</dataSource>
</environment>
</environments>
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
我们可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。[db.perperties]
编写一个配置文件
db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username = root
password = 1870535196
<!-- 引入外部配置文件-->
<properties resource="db.properties"/>
<!-- 起别名-->
<typeAliases>
<typeAlias type="cn.imut.pojo.User" alias="user"/>
</typeAliases>
也可以指定一个包名,Mybatis会在包下搜索Java Bean,
扫描实体类的包,默认别名为类名首字母小写
<!-- 起别名-->
<typeAliases>
<!-- <typeAlias type="cn.imut.pojo.User" alias="user"/>-->
<package name="cn.imut.pojo"/>
</typeAliases>
在实体类少时使用第一种
第一种可以自定义别名
注解:@Alias
Mybtais中的设置会改变Mybatis的运行时行为
MapperRegistry:注册绑定我们的Mapper文件
方式一、[推荐使用]
<mappers>
<mapper resource="cn/imut/dao/UserMapper.xml"/>
</mappers>
方式二、使用class文件绑定注册
<mappers>
<mapper class="cn.imut.dao.UserMapper"/>
</mappers>
注意点:
方式三、使用扫描包进行注入
<mappers>
<package name="cn.imut.dao"/>
</mappers>
生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发重要。
SqlSessionFactoryBuilder:
SqlSessionFactory:
SqlSession:
这里面的每一个Mapper,就代表一个具体的业务!
null,null,null,null,null
解决方法:
起别名
select id,name,pwd as password from user where id = #{id};
结果集映射
id name pwd
id name password
<!-- 结果集映射-->
<resultMap id="UserMap" type="user">
<!-- column 数据库中的字段 property 实体类中的属性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserList" resultMap="UserMap" >
select * from user;
</select>
日志就是最好的助手!
在mybatis中具体使用哪一个日志,在设置中设定
STDOUT_LOGGING标准日志输出
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/lz.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
什么是Log4j?
导包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
配置log4j为日志的实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
log4j的使用
简单使用
导包
import org.apache.log4j.Logger;
日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(MyTest.class);
日志级别
logger.info("info:进入了Log4j");
logger.debug("debug:进入了Log4j");
logger.error("error:进入了Log4j");
思考:为什么要分页?
使用Limit分页
语法:select * from user limit startIndex,pageSize;
使用Mybatis实现分页
接口
List<User> getUserByLimit(Map<String,Integer> map);
Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="cn.imut.pojo.User">
select * from user limit #{startIndex}, #{pageSize};
</select>
测试
@Test
public void getUserByLimit() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList = mapper.getUserByLimit(map);
for(User user: userList) {
System.out.println(user);
}
sqlSession.close();
}
不再使用sql实现分页
接口
List<User> getUserByRowBounds();
mapper.xml
<select id="getUserByRowBounds" resultMap="userMap">
select * from user;
</select>
测试
@Test
public void getUserByRowBounds() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
RowBounds rowBounds = new RowBounds(1, 2);
List<User> list = sqlSession.selectList("cn.imut.dao.UserMapper", null, rowBounds);
for(User user: list) {
System.out.println(user);
}
sqlSession.close();
}
PageHelper
原因:
解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更号。
关于接口的理解:
三个面向的区别:
注解在接口上实现
@Select("select * from user");
List<User> getUsers();
在核心配置文件中绑定接口
<!-- 绑定接口>
<mappers>
<mapper class = "cn.imut.dao.UserMapper"/>
</mappers>
测试
可以在工具类中实现自动提交事务
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
关于@Param()注解
#{} ${} 区别
$不安全,用#就OK
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩。
永远不要再编写另一个getter或equals方法,带有一个注释的类将具有功能全面的生成器,自动执行日志记录变量等等。
使用步骤
IDEA中安装Lombok插件
项目中导入Lombok的jar包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
@Data:无参构造,get,set、tostring、hashcode、equals
@AllArgsConstructor
@NoArgsConstructor
什么是动态SQL?
根据不同的条件,生成不同的SQL语句
动态SQL
if
choose (when, otherwise)
trim (where, set)
foreath
create table blog (
id varchar(50) not null comment ‘博客id‘,
title varchar(100) not null comment ‘博客标题‘,
author varchar(30) not null comment ‘博客作者‘,
create_time datetime not null comment ‘创建时间‘,
views int(30) not null comment ‘浏览量‘
)engine = InnoDB default charset = utf8;
IF
<select id="queryBlogIF" parameterType="map" resultType="cn.imut.pojo.Blog">
select * from blog where 1 = 1
<if test="title != null">
and title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</select>
什么是缓存[ Cache ] ?
为什么使用缓存
什么样的数据能使用缓存
二级缓存也叫全局缓存,一级缓存的作用域太低,所以就诞生了二级缓存
基于namespace级别的缓存,一个名称空间,对应一个二级缓存
工作机制
只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
查出的数据都会被默认先放在一级缓存中
只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中
标签:utc sele 持久层 数据持久化 事务管理 ltm 文件包含 类型 tar
原文地址:https://www.cnblogs.com/yfyyy/p/12554221.html