目录
?
?MyBatis 的介绍
MyBatis 的基本使用
? ? ? ? 1.准备数据库信息
????????2.创建一个maven的项目
? ? ? ? 3.在pom.xml文件里引入相应的jar包
? ? ? ? 4.创建相应的实体类users
? ? ? ? 5.完成mybatis的配置文件
? ? ? ? ?6.进行测试
总结
MyBatis 的实际使用
与dao接口结合
传递多个参数
特殊字符
总结:
? ? ? ?mybatis的优化
? ? ? ?引入db属性文件
? ? ? ?引入日志文件
? ? ? ?解决数据库的列名和实体类的属性名 不一致
? ? ? ?事务
? ? ? 总结:
?MyBatis 的介绍
????????先来认识一下什么是MyBatis,包括以下3点:
? ? ? ? ? ? ? ?1. MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀==ORM框架? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ?2.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。? ? ? ? ? ? ? ? ? ?3.MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 半自动化框架。必须写sql语句。
? ? ? 总结起来就是:? MyBatis就是封装与数据库交互的半成品。
MyBatis 的基本使用
? ? ? ? 在了解完MyBatis后当然要学会怎么使用了
? ? ? ? 1.准备数据库信息
-- 创建数据库
create database mybatis_kk;
-- 使用数据库
use mybatis_kk;
-- 在数据库中创建users表
CREATE TABLE users(uid INT PRIMARY KEY AUTO_INCREMENT, uname
VARCHAR(20), uage INT);
-- 向表中插入数据
INSERT INTO users(uname, uage) VALUES('kk', 21);
INSERT INTO users(uname, uage) VALUES('Will', 18);
????????2.创建一个maven的项目
? ? ? ? 3.在pom.xml文件里引入相应的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mybatis_k</groupId>
<artifactId>mybatis_k</artifactId>
<version>1.0-SNAPSHOT</version>
<!--引入jar包-->
<dependencies>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--简化实体类中的set和get方法以及tostring方法和构造方法。(需要安装lombok插件)-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
</project>
? ? ? ? 4.创建相应的实体类users
@Data //实体类中的set和get方法以及tostring方法和构造方法
@NoArgsConstructor //无参构造函数
@AllArgsConstructor //所有参数的构造函数
public class Users {
private int uid;
private String uname;
private int uage;
}
// 注意!!!!
// 如果没有应用lombok的jar包 需要自己补上:
//实体类中的set和get方法以及tostring方法和构造方法 和 构造函数
? ? ? ? 5.完成mybatis的配置文件
? ? ? ? (1)在resources下创建 mapper文件夹和MyBatis.xml文件,并在mapper文件夹下创建UsersMapper.xml文件
?????????(2)MyBatis.xml(配置文件)的配置内容(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.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_kk?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
</configuration>
? ? ? ? (3)在UsersMapper.xml(映射)文件里 完成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="kkk">
<!--namespace:命名空间:它的值现在可以随便写。
以后必须和dao接口对应。
-->
<select id="selectUserById" resultType="com.kk.entity.Users">
select * from users where id=#{uid}
</select>
<!-- id:唯一标签-->
<!-- resultType: 返回结果的类型。 mybatis框架帮你把结果封装到User类型中。-->
<!-- #{}:====>占位符。并且或解析uid的值-->
</mapper>
? ? ? ? (4)把映射文件UsersMapper.xml引入到MyBatis.xml配置文件中
? ? ? ? ?6.进行测试
? ? ? ? 创建测试类MyTest
public class MyTest {
public static void main(String[] args) throws Exception{
//1.读取mybatis的配置文件。 连接数据库---
Reader reader = Resources.getResourceAsReader("MyBatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
//2.获取Session对象---->Connection对象
SqlSession session=sqlSessionFactory.openSession();
//3.执行相应的功能
Users u = session.selectOne("kkk.selectUserById", 1);
System.out.println(u);
}
}
?结果:
总结
mybatis的使用步骤: ? ?1. 创建实体类(Lombok简化set和get方法) ? ?2. 引入相关的依赖 ? ?3. 创建mybatis的配置文件。 ? ?4. 创建映射文件 sql与实体类之间的映射关系。 ? ?5. 在mybatis配置文件中注册映射文件。 ? ?6. 测试。
?????????????????现在已经成功完成了mybatis的基本使用,可以自行练习一下CRUD操作来熟练掌握
MyBatis 的实际使用
与dao接口结合
????????当然在实际开发中会使用dao来操作,用dao接口结合映射文件。
? ? ? ? 1.创建dao接口
????????
public interface UsersDao {
public List<Users> selectAll();
public Users selectUserById(int id);
public int insertUser(Users user);
public int updateUser(Users user);
public int deleteById(int id);
}
? ? ? ? 2.在映射文件UsersMapper.xml里写SQL
注意!!!!? ?namespace要和接口名一致 ?
????????????????id要和接口中的方法名一致。
<?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.kk.dao.UsersDao">
<!--namespace:命名空间: 与dao接口位置对应
-->
<select id="selectAll" resultType="com.kk.entity.Users">
select * from users
</select>
<select id="selectUserById" resultType="com.kk.entity.Users">
select * from users where uid=#{uid}
</select>
<insert id="insertUser">
insert into users values(#{uid},#{uname},#{uage})
</insert>
<update id="updateUser">
update users set uage=#{uage} where uid=#{uid}
</update>
<delete id="deleteById">
delete from users where uid=#{uid}
</delete>
</mapper>
? ? ? ? ? ? ? ?3.测试:
public class MyTest {
private SqlSession session;
@Before
public void getsession() throws IOException {
Reader reader=Resources.getResourceAsReader("MyBatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
session=sqlSessionFactory.openSession();
}
@Test
public void method1(){
UsersDao ud=session.getMapper(UsersDao.class);
List<Users> list=ud.selectAll();
for (Users u:list){
System.out.println(u);
}
}
@Test
public void method2(){
UsersDao ud=session.getMapper(UsersDao.class);
Users u= ud.selectUserById(2);
System.out.println(u);
}
@Test
public void method3(){
UsersDao ud=session.getMapper(UsersDao.class);
Users u=new Users(3,"王五",22);
int row =ud.insertUser(u);
System.out.println("受影响行数:"+row);
session.commit();
}
@Test
public void method4(){
UsersDao ud=session.getMapper(UsersDao.class);
Users u=new Users(3,"王五",44);
int row =ud.updateUser(u);
System.out.println("受影响行数:"+row);
session.commit();
}
@Test
public void method5(){
UsersDao ud=session.getMapper(UsersDao.class);
int row =ud.deleteById(3);
System.out.println("受影响行数:"+row);
session.commit();
}
}
传递多个参数
在上面的实例中 dao里添加和修改的方法传的都是对象,如果传的是多个参数的话就会出现一个坑
? ? ? ? 当传递的是多个参数时默认mybatis会给这些参数起名:param1 param2.....
public int update(String uid, int umane);
-->
实际接收的是param1,param2
update id="updateUser">
update users set uanme=#{param1} where uid=#{param2}
</update>
解决方法:使用自定义参数名 @Param("参数名")
public int update(@Param("uid") String uid, @Param("uname") int uname);
-->
<update id="updateUser">
update users set uname=#{uname} where uid=#{uid}
</update>
特殊字符
当使用特殊字符时也会出现坑
?解决方法:使用<![CDATA[ 特殊字符或SQL语句 ]]>
<select id="selectUserByage" resultType="com.kk.entity.Users">
<![CDATA[ select * from users where uage>#{min} and uage<#{max}]]>
</select>
总结:
??????????1.dao接口结合映射文件。namespace要和接口名一致 ? id要和接口中的方法名一致。
? ? ? ? ? 2.多个参数的。@Param("参数名") ? #{参数名}
? ? ? ? ? 3.转义符: <![CDATA[sql]]>
接下来进行mybatis的优化~~~
mybatis的优化
引入db属性文件
????????1.定义一个数据库属性文件. properties
jdbc.drivername=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_kk?serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.userpassword=123456
?????????2.在MyBatis配置文件中引入属性文件并使用相应的key
<?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>
<!--引入属性文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!--${获取属性文件的key值}-->
<property name="driver" value="${jdbc.drivername}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.userpassword}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
</mappers>
</configuration>
引入日志文件
? ? ? ? 1.在pom.xml中引入日志jar包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
????????2.引入日志的配置文件 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 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/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 =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
? ? ? ? ?3.效果:
?这样能够更好的显示SQL语句!!!
解决数据库的列名和实体类的属性名 不一致
? ? ? ? 方法一:为查询的列起别名;让别名和属性名一致
<select id="selectUserById" resultType="com.kk.entity.Users">
select users_uid uid,users_uname uname,users_uage uage from users where users_uid=#{uid}
</select>
? ? ? ? 方法二:使用resultMap标签 来完成属性和列的映射关系。(我的property和column一样是因为在创建实体类的时候,就把属性名和数据库列名对应了)
<resultMap id="map1" type="com.kk.entity.Users" >
<!--id必写-->
<id property="uid" column="uid"/>
<result property="uname" column="uname"/>
<result property="uage" column="uage"/>
</resultMap>
<!--注意:使用了resultMap不能在使用resultType-->
<select id="selectUserById" resultMap="map1" >
select * from users where uid=#{uid}
</select>
<!--
id:唯一标识
type: 类型 ; 表与哪个实体类的映射
<id 主键的映射关系 column="列名" property="属性名"/>
<result 普通字段/>
autoMapping=true 表示自动映射。默认true
-->
事务
事务是由一系列动作组成,这些动作要么都完成,要么都不完成。
jdbc默认事务是自动提交。现在mybatis事务需要手动提交(session.commit();)。
在上面的测试中已经实现了提交:
?总结:
? ? ? ? ? 1.引入数据库属性文件 ? ? ? ? ? 2.引入日志文件? ? ? ? ? ??3. 解决列名和属性名不一致。
?????????????????(1)起别名--与属性名一致
?????????????????(2)resultMap完成列和属性映射
????????4.事务的提交----session.commit()
|