1.介绍Mybatis
MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.
好处:方便开发使用
2.为什么使用mybatis
简化jdbc的操作以及占位符赋值以及查询结果集的封装。(以前的代码冗长)
3.Mybatis的使用
(1)第一步:引入mybatis和mysql的jar包(在pom.xml中配置依赖即可)
<dependencies>
<dependency>
<groupId>repMaven.org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
(2)第二步:创建mybatis的配置文件(取名为conf.xml 在resources目录下如下图)记得改value值 value值与自己的数据库匹配即可
<?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>
<!--为指定包下的实体类起别名 别名就是实体类名-->
<typeAliases>
<package name="com.wx.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
(3)第三步:创建数据库表
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`userid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, 'admin', '管理员');
INSERT INTO `tb_user` VALUES (2, 'ykq', '闫克起');
INSERT INTO `tb_user` VALUES (3, 'ldh', '刘德华');
INSERT INTO `tb_user` VALUES (4, 'zxy', '张学友');
INSERT INTO `tb_user` VALUES (5, 'gfc', '郭富城');
(4)第四步:创建实体类
public class User {
private int userid;
private String username;
private String realname;
//get、set、toString 构造方法这里省略 自己通过快捷键创建即可
}
(5)第五步:创建mybatis和数据库的映射文件
在resources下创建一个文件夹mapper 在里面创建一个叫userMapper.xml的文件(名字自取)
作用: 映射实体和表之间的映射关系。
<?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:命名空间
可以随便起名,但是后期我们要求命名空间的值必须和所对应的dao相同
-->
<mapper namespace="qy151.user">
<!--查询 根据id查询用户信息
select标签用于查询的标签
id:标签的唯一标识
resultType: 定义返回的类型 把sql查询的结果封装到哪个实体类钟
#{id}===表示占位符等价于? 这是mybatis框架的语法
-->
<select id="findById" resultType="com.ykq.entity.User">
select * from tb_user where userid=#{id}
</select>
</mapper>
把把映射文件注册到配置文件上 conf.xml上
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
(6)第六步:单元测试(记得在pom.xml中添加junit相关依赖)
@Test
public void testQueryOne() throws Exception{
//1.读取mybatis配置文件的内容----未来不需要写tomcat 解析配置文件
//读取的文件为conf.xml
Reader ra = Resources.getResourceAsReader("conf.xml");
//2. 获取SqlSessionFactory对象
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
//3. 获取SqlSession对象----封装了对数据库操作的各种方法
SqlSession session = factor.openSession();
//selectOne()中传入两个方法
//1.String statement, 命名空间+id----指向sql标签(UserMapper.xml中的namespace和查询语句中的id)
//2.Object parameter 需要实参(传入的id值)
User u = session.selectOne("com.wx.user.findById", 2);
System.out.println(u);
//关闭资源
session.close();
}
4.lombok插件的使用
(1)作用;帮助自动生成实体类的get(),set(),toString() ,构造方法。
下载完毕 重启即可使用
(2)在pom.xml中添加相关依赖
<dependency>
<groupId>repMaven.org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
(3)在实体层添加注解
@Data //get() set() toString()
@AllArgsConstructor //有参构造(所有的参数)
@NoArgsConstructor //无参构造
public class User {
int userid;
String username;
String realname;
}
5.使用mybatis完成增删改查的完整代码
(1)sql语句
<?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="com.wx.user">
<!--查询一条记录 -->
<select id="findById" parameterType="int" resultType="com.wx.entity.User">
select * from tb_user where userid=#{id}
</select>
<!--添加一条记录-->
<insert id="add" parameterType="User">
insert into tb_user(username,realname) values(#{username},#{realname})
</insert>
<!--删除-->
<delete id="del" parameterType="int">
delete from tb_user where userid=#{id}
</delete>
<!--修改-->
<update id="update" parameterType="User">
update tb_user set username=#{username},realname=#{realname} where userid=#{userid}
</update>
<!--查询全部-->
<select id="findAll" resultType="User">
select * from tb_user
</select>
</mapper>
(2)单元测试代码
public class TestAll {
@Test
public void testQueryOne() throws Exception{
//1.读取mybatis配置文件的内容----未来不需要写tomcat 解析配置文件
//读取的文件为conf.xml
Reader ra = Resources.getResourceAsReader("conf.xml");
//2. 获取SqlSessionFactory对象
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
//3. 获取SqlSession对象----封装了对数据库操作的各种方法
SqlSession session = factor.openSession();
//selectOne()中传入两个方法
//1.String statement, 命名空间+id----指向sql标签(UserMapper.xml中的namespace和查询语句中的id)
//2.Object parameter 需要实参(传入的id值)
User u = session.selectOne("com.wx.user.findById", 2);
System.out.println(u);
//关闭资源
session.close();
}
@Test
public void testAdd() throws Exception{
Reader ra = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
SqlSession session = factor.openSession();
User user = new User();
user.setUsername("zs");
user.setRealname("张三");
int row = session.insert("com.wx.user.add", user);
System.out.println(row);
session.commit();
session.close();
}
@Test
public void testDelete() throws Exception{
Reader ra = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
SqlSession session = factor.openSession();
int row = session.delete("com.wx.user.del", 1);
System.out.println(row);
session.commit();
session.close();
}
@Test
public void testUpdate() throws Exception{
Reader ra = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
SqlSession session = factor.openSession();
User user = new User(2, "ls", "李四");
int row = session.update("com.wx.user.update", user);
System.out.println(row);
session.commit();
session.close();
}
@Test
public void testQueryAll() throws Exception{
Reader ra = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory factor = new SqlSessionFactoryBuilder().build(ra);
SqlSession session = factor.openSession();
List<User> user = session.selectList("com.wx.user.findAll");
System.out.println(user);
session.close();
}
}
6.部分代码优化
在conf.xml中添加
<typeAliases>
<!--单独为某个实体类起别名 -->
<typeAlias type="com.ykq.entity.User" alias="u"/>
<!--为指定包下的实体类起别名该别名就是实体类名-->
<package name="com.ykq.entity"/>
</typeAliases>
7.在控制台添加日志方便查看sql语句
如果报错则在控制台可直接观看到sql语句的错误 方便修改
(1)在pom.xml中添加相关依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)在resources下创建一个文件为log4j.properties (文件名字必须叫这个名字)
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
其余的配置文件如下
#将等级为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=D:/qy151/log/qy151.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
配置完相关文件后直接运行相关代码即可(以查询语句为例)