谈谈学习之路:
javacore -->前端–>数据库–>Javaweb
以后在做项目(专注于业务,不应该专注于
)
第二阶段:
SSM企业级开发框架
解释Spring:原来我们需要自己创建对象,现在我们只要集成了Spring,我们就可以在Spring中拿取对象
学习了框架之后,我们开发方式就会发生变化,越来越简单
前后端分离
后端:SpringBoot提供一些数据
前端:Vue,视图层框架,接收后台给他的json数据,响应并加载到前端页面
现在开始初识MyBatis,
首先!MyBatis就是与数据库打交道的!
在官网,百度百科都有介绍,先了解是个啥
前身:iBatis!在后面编写代码时,导入包的时候,会发现iBatis这个词。
下载:Github
版本:最新3.5.4
在特性中说到,它是一个持久层的框架,那
说一说什么是Java的持久层?
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.4version>
dependency>
搭建环境,导入包,写代码,测试
这里现在IDEA中建立一个Maven项目
1、准备一个数据
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;
在插入自己的一些数据
2、准备jar包(Maven仓库中找)
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
3、第一步写配置文件mybatis-config.xml,此文件建在src/resources下
<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=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
configuration>
4、编写工具类,操作数据库
在src/项目路径/utils下建立MyBatisUtils工具类
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();
}
}
// 获取sqlSession的连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
5、配置实体类,引入Lombok
建立刚与数据库表中所对应的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
//private String pwd;
private String password;//用来测试结果集映射
}
//这里使用了lombok依赖,用注解构建了有参无参,getset等方法
//也是将lombok依赖导入pom.xml中即可
6、编写持久层的操作接口
在src/项目路径/mapper下建立操作接口
// 操作用户的接口类
public interface UserMapper {
List<User> getUserList();
}
7、之前需要编写接口实现类,使用MyBatis后,专注编写sql,使用配置文件
在resources目录下须建立与Java目录下相同的目录结构:建立UserMapper.xml
<mapper namespace="com.feng.mapper.UserMapper">
<select id="getUserList" resultType="com.feng.pojo.User">
select * from user;
select>
mapper>
8、这个配置文件一定要注册到MyBatis的配置文件中
在mybatis-config.xml中一定要把刚才UserMapper.xml注册上
<mappers>
<mapper resource="com/feng/mapper/UserMapper.xml"/>
mappers>
9、在Test类中进行测试
public class Test {
public static void main(String[] args) {
// 如何获取接口
// 1、 获取SqlSession, 执行sql使用的
SqlSession session = MyBatisUtils.getSession();
// 2、通过 session.getMapper(Class ) 获得接口
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
第一个程序运行结果:
当第一个程序成功之后,那这些数据库的操作就变得轻松一些,在增删改查中会有一些注意点,在下面会说到。先来测试下对数据库的增删改查效果。
1、在上面的栗子中,将接口进行继续编写所要执行的方法
public interface UserMapper {
List<User> getUserList();
User selectById(int id); // 在xml 中获取这个id #{id}
// 多个参数如何操作,必须要增加注解 @Param
User selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);
// 新增一个用户 , 对象的情况下,直接可以拿到对象的属性
int addUser(User user);
// 修改用户信息
int updateUser(User user);
// 删除用户
int deleteUserByID(int id);
}
2、在接口对应的SQL配置文件内中,也要进行编写,并要确保配置文件与SQL的正确性
这里的resultType="User"写成这样是因为在mybatis-config.xml文件中,将mapping映射改为
<mappers>
<package name="com.feng.mapper"/>
mappers>
<mapper namespace="com.feng.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from user;
select>
<select id="selectById" resultType="User">
select * from user where id = #{id}
select>
<select id="selectByUsernamePwd" resultType="User">
select * from user where name = #{username} and pwd = #{pwd}
select>
<insert id="addUser" parameterType="User">
insert into `user`(`id`,`name`,`pwd`) values (#{id},#{name},#{pwd});
insert>
<update id="updateUser" parameterType="User">
update `user` set `name` = #{name},pwd = #{pwd} where id = #{id} ;
update>
<delete id="deleteUserByID" parameterType="int">
delete from user where id = #{id}
delete>
mapper>
3、在Test类中进行测试
public class Test {
public static void main(String[] args) {
// 如何获取接口
// 1、 获取SqlSession, 执行sql使用的
SqlSession session = MyBatisUtils.getSession();
// 2、通过 session.getMapper(Class ) 获得接口
UserMapper mapper = session.getMapper(UserMapper.class);
// 查看所有用户
// for (User user : mapper.getUserList()) {
// System.out.println(user);
// }
// 通过id查用户
// User user = mapper.selectById(1);
// System.out.println(user);
// 通过用户名与密码查用户
// User user = mapper.selectByUsernamePwd("小子", "123111");
// System.out.println(user);
// 增加用户
// int user = mapper.addUser(new User(4, "小蓝", "000000"));
// session.commit();
// if (user>0){
// System.out.println("增加成功");
// }
// 修改用户
// int user = mapper.updateUser(new User(4, "小黑", "000000"));
// session.commit();
// if (user>0){
// System.out.println("修改成功");
// }
// 通过id删除用户
// int id = mapper.deleteUserByID(4);
// session.commit();
// if (id>0){
// System.out.println("删除成功");
// }
}
}
注意点
1、多个参数一定要增加 @Param 注解
2、增删改一定要增加事务提交
3、增删改,标签一定要对应,参数类型必须要写
4、增删改不用写返回值,查询,必须写返回值,集合、泛型中的内容(具体的对象)
测试结果:
MyBatis的核心配置文件就是mybatis-config.xml了,我们来康康MyBatis的核心配置结构:
配置文件在前面,知道要配置JDBC连接,SqlMap映射文件等信息,当然这都是非常基本的配置,现在要探究一下mybatis-config.xml的详细配置,如图:
这些配置都是有次序的!!按照图上结构放置!
< properties>元素的配置,它提供了允许在主配置文件之外的一个“名值对”列表,可以将其中的配置信息加载进来,而这些配置信息可以放在任何一个地方。使用properties元素,其中有两个属性,分别是:resource和url。
1、可配置db.properties 让配置文件读取:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
mybatis-config.xml中部分配置为:
<properties resource="db.properties"/>
...
...
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
< settings>元素的配置,这个元素即设置MyBatis的全局配置信息:
2、通过settings配置日志
<settings>
<!--配置日志,就可以看到具体的SQL信息,从而找到出错的原因!
name="logImpl" value="LOG4J"/>
settings>
3、配置mapper映射器,为扫描包的
<mappers>
<package name="com.feng.mapper"/>
mappers>
< typeAlias>元素,就是起别名,很容易理解,我们不想使用过长的类名时,可以用它来起个别名,之后我们使用别名就可以了。比如:
4、通过配置类型的别名来简化开发
<typeAliases>
<package name="com.feng.pojo"/>
typeAliases>
假设存在一个问题:实体类的属性和数据库中所对应的名字不一致时,如何返回正确的查找对象??
如果属性名和数据库的列名,一致 ,这个时候mybatis 会帮我们自动推断!=>自动映射
如果属性名和数据库的列名,不一致 ,手动实现映射
手动映射步骤:
1、先修改实体类的属性名和数据库中的不一致
public class User {
private int id;
private String name;
//private String pwd;
private String password;//用来测试结果集映射
}
2、新增一个接口
public interface RUserMapper {
User selectUserById(int id);
}
3、编写对应接口的SQL配置文件
<mapper namespace="com.feng.mapper.RUserMapper">
<resultMap id="UserMap" type="User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
resultMap>
<select id="selectUserById" resultMap="UserMap">
select id,name,pwd from user where id = #{id};
select>
mapper>
4、测试resultMap
public class Test1 {
// 注意导入包的问题 org.apache.log4j.Logger
//日志,这里可不用
static Logger logger = Logger.getLogger(Test1.class);
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
RUserMapper mapper = session.getMapper(RUserMapper.class);
// 属性名和数据库的列名,不一致 ,手动实现映射,结果集映射
User user = mapper.selectUserById(1);
System.out.println(user);
}
}
测试结果:
可以看到,数据库中虽然是pwd,但是打印出来还时password
一般,SQL配置文件中,主键一般使用id标签
先说说,日志Logging
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。
这里我们选择日志:Log4j
使用日志的原因:
如何使用Log4j:
1、导入依赖
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
2、编写log4j的配置文件,路径与mybatis-config.xml一致
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ./log/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =./log/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
3、在mybatis-config.xml修改日志实现为 Log4j,注意大小写问题即可
<settings>
<setting name="logImpl" value="LOG4J"/>
settings>
4、测试一下,假设要使用Log4j 的类去打印日志
public class Test1 {
// 注意导入包的问题 org.apache.log4j.Logger
static Logger logger = Logger.getLogger(Test1.class);
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
RUserMapper mapper = session.getMapper(RUserMapper.class);
// 属性名和数据库的列名,不一致 ,手动实现映射,结果集映射
User user = mapper.selectUserById(1);
System.out.println(user);
// 测试:使用log4j打印日志
System.out.println("1111222");//普通输出
// 通过log4j 可以将日志实现细粒度的控制
logger.error("0123");
logger.info("4567");
logger.debug("8989");
}
}
测试,控制台打印
重点在提高服务器性能!按照一小部分一小部分来处理数据
方法一:在SQl中有limit用来分页
-- 语法
Select * from user limit startIndex,Pagesize
1、在实现实体类的接口中编写方法
List<User> selectUserByLimit(Map<String,Integer> map);
2、在接口对应的配置文件中编写
<select id="selectUserByLimit" parameterType="map" resultMap="UserMap">
select * from user limit #{startIndex},#{pageSize}
select>
3、测试类编写
// map 中的key,必须要和 sql 中接收的参数一致
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
RMapper mapper = session.getMapper(RMapper.class);
int currentPage = 1; //第几页
int pageSize = 3; //每页显示几个
HashMap<String, Integer> map = new HashMap<String, Integer>();
// 分页 第几页 每页显示几个
map.put("startIndex",(currentPage-1)*pageSize);
map.put("pageSize",pageSize);
List<User> users = mapper.selectUserByLimit(map);
for (User user : users) {
logger.debug(user);
}
}
运行结果:
方法二:在 java 层面分页,使用Mybatis中的RowBounds (分页)对象
1、在实现实体类的接口中重新写方法
List selectUserByLimit();
2、在对应的配置文件中配置
<select id="selectUserByLimit" parameterType="map" resultMap="UserMap">
select * from user;
select>
3、在编写测试类
public class Test1 {
// 注意导入包的问题 org.apache.log4j.Logger
static Logger logger = Logger.getLogger(Test1.class);
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
int currentPage = 1; //第几页
int pageSize = 3; //每页显示几个
RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);
// selectList(方法的路径)
// 通过Java操作查询
//我们可以通过 selectXXX 执行具体的某一个方法,得到结果,在这种方式下,可以通过Java实现分页!
//session.selectList("com.feng.mapper.RUesrMapper.selectUserByLimit", null, rowBounds);
List<User> users = session.selectList("com.feng.mapper.RUesrMapper.selectUserByLimit", null, rowBounds);
for (User user : users) {
System.out.println(user);
}
}
}
运行测试:
方法三: 分页插件 PageHelper
这里还未学习,谅解