一:Mybatis
1、mybatis简介
1.1、 mybatis历史
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
1.2、MyBatis特性
-
MyBatis是一个开源、轻量级的数据持久层框架,它支持定制SQL语句的高级映射。
-
MyBatis是一个半自动对象关系映射(object relational mapping, ORM)框架,它使用简单的XML文件或注解在对象模型和关系型数据库之间建立映射关系,通过对象去操作数据库表中的数据。
-
MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement等烦琐的过程。
-
MyBatis具有以下特点。
(1)MyBatis是免费开源的,它是最简单的持久层框架,小巧且简单易学。
(2)MyBatis与JDBC相比,减少了至少50%的代码量。
(3)MyBatis在XML文件中编写SQL语句,和程序逻辑代码分离,降低了耦合度。这样就不会对应用程序或数据库的现有设计有任何影响,便于统一管理和优化,也提高了代码的可重用性。
(4)MyBatis提供了XML元素,支持编写动态SQL语句。(5)MyBatis提供了映射元素,支持Java对象属性与数据库字段的关系映射。
1.3、MyBatis下载
MyBatis下载地址:Releases · mybatis/mybatis-3 · GitHub Assets
1.4、 与Java web中的DAO层的对比
需要手动传参数以及使用ResultSet手动获取结果集,还需要手动拼接动态数据。很麻烦。
public int addToCart(Cart cart) {
// TODO Auto-generated method stub
//设置参数
String sql = "insert into cart values(?,?,?,?,?,?,?,?)";
//手动传参
Object[] params =new Object[] {cart.getId(),cart.getGood_id(),cart.getUser_name(),cart.getIntro(),cart.getAmount(),cart.getPrice(),cart.getTotal_price(),cart.getCover()};
//手动执行数据库语句
int result = exceuteUpdate(sql, params);
return result;
}
@Override
public List<Goods> findGoodList(Goods goods){
Goods goosGoods =null;
//数据库语句
String sql = "select g.*,t.name as typename from goods g LEFT JOIN type t on g.type_id = t.id where 1=1";
//条件拼接 格式太复杂
if (goods.getName()!=null&&!"".equals(goods.getName().trim())) {
sql += " and g.name like'%"+goods.getName()+"%'";
}
if (goods.getId()!=0) {
sql += " and g.id='"+goods.getId()+"'";
}
if (goods.getType_id()!=0) {
sql += " and g.type_id='"+goods.getType_id()+"'";
}
//手动执行数据库语句
ResultSet rs = querySql(sql);
List<Goods> list = new ArrayList<>();
if(rs!=null) {
try {
while (rs.next()) {
//依次手动获取结果集
goosGoods = new Goods(rs.getInt("id"),rs.getString("typename"),rs.getString("name"), rs.getString("cover"), rs.getString("image1"), rs.getString("image2"), rs.getFloat("price"), rs.getString("intro"), rs.getInt("stock"), rs.getInt ("type_id"));
list.add(goosGoods);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
1.5 mybatis的工作流程
(1)读取核心配置文件。mybatis-config.xml是MyBatis的全局配置文件,名称可自定义。 (2)加载映射文件。mapper.xml是SQL映射文件,名称可自定义,需要在核心配置文件中加载。 (3)创建会话工厂。根据MyBatis的核心配置文件创建会话工厂SqlSessionFactory。 (4)创建会话对象。通过SqlSessionFactory创建会话对象SqlSession,提供执行SQL语句的所有方法。 (5)创建执行器。创建执行器Executor用于操作数据库。 (6)封装映射信息。Executor将待执行的SQL语句的信息封装到MappedStatement对象中,存储要映射的SQL语句的唯一标识、参数等,同时动态生成需要执行的SQL语句。 (7)操作数据库。根据动态生成的SQL语句操作数据库。 (8)输出结果映射。执行SQL语句后,通过MappedStatement对象将输出结果映射到Java对象中
2、搭建mybatis
2.1 开发环境
1、 mysql 5.x.x
2、 Mybatis 3.5.2
注意:
MySQL不同版本的注意事项
1、驱动类driver-class-name
MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver
MySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver
2、连接地址url
MySQL 5版本的url:
jdbc:mysql://localhost:3306/ssm
MySQL 8版本的url:
jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
否则运行测试用例报告如下错误:
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or
represents more
2.2 创建web项目导入jar包
mysql-connector-java-5.1.13.jar
mybatis-3.5.2.jar
2.3、创建MyBatis的核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring
之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是Java resources/src目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--数据库配置-->
<environments default="development"> <!--运行环境-->
<environment id="development">
<transactionManager type="JDBC"/> <!--事务管理器为 JDBC-->
<dataSource type="POOLED"> <!--数据源-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatistest?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 引入mybatis的映射文件所在路径 xxx.xml -->
<mappers>
<!-- 1. <mapper resource="com/mapper/AdminMapper.xml"/>-->
<!-- 2.
映射文件必须与接口(数据库操作方法接口)在同一个包里
映射文件名必须与接口名一致 (AdminMapper)
-->
<package name="com.mapper"></package>
</mappers>
</configuration>
2.4、创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要
提供实现类。
public interface UserMapper {
/**
* 添加用户信息
*/
int insertUser();
}
2.5、创建MyBatis的映射文件
1、映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置与mapper接口同一个包里
2、 MyBatis中可以面向接口操作数据,要保证两个一致:
a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致
b>mapper接口中方法的方法名和映射文件中编写SQL的标签的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.mapper.UserMapper"> <!-- mapper接口中的全类名与namespace一致 -->
<!--int insertUser(); mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致-->
<insert id="insertUser">
insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
</insert>
</mapper>
2.6、创建JavaBean bean里的属性对应数据库字段,要一样。
数据库字段:
对应的JavaBean:
package com.mybatis.pojo;
public class User {
int id;
String userName;
String userPassword;
String sex;
int age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(int id, String userName, String userPassword, String sex, int age) {
super();
this.id = id;
this.userName = userName;
this.userPassword = userPassword;
this.sex = sex;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", userPassword=" + userPassword + ", sex=" + sex
+ ", age=" + age + "]";
}
}
2.7、测试 创建测试类
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配
//映射文件中的SQL标签,并执行标签中的SQL语句
int result = userMapper.insertUser();
//sqlSession.commit();
System.out.println("结果:"+result);
}
2.8、加入log4j日志功能
-
加入jar包: log4j-1.2.17.jar log4j-api-2.11.2.jar log4j-core-2.11.2.jar slf4j-api-1.7.26.jar slf4j-log4j12-1.7.26.jar
-
加入log4j的配置文件:log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
控制台就可以输出执行日志
3、优化核心配置文件
3.1优化核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入properties配置文件,以后所有的数据库操作都可以通过 ${key}来读取信息,
实现配置集合 -->
<properties resource="jdbc.properties">
</properties>
<!--驼峰命名规则-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--未配置properties时写的数据库连接方式,放在前面讲
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/buyerapp?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/> -->
<!-- 写完jdbc.properties后数据库的连接方式 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入mybatis的映射文件 -->
<mappers>
<!-- <mapper resource="com/mapper/AdminMapper.xml"/>-->
<!--
映射文件必须与接口在同一个包里
映射文件名必须与接口名一致 (AdminMapper)
-->
<package name="com.mapper"></package>
</mappers>
</configuration>
创建 jdbc.properties文件,与mybatis-config.xml同一目录下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/buyerapp?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
jdbc.initialPoolSize=5
jdbc.minPoolSize=1
jdbc.maxPoolSize=10
3.2、优化读取配置文件
分装工厂类 SqlSessionUtil
public static SqlSession getSession() {
SqlSession sqlSession = null;
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sessionFactoryBuilder.build(is);
sqlSession=sqlSessionFactory.openSession(true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sqlSession;
}
读取
//调用SqlSessionUtil类静态方法
SqlSession session = SqlSessionUtil.getSession();
//通过session获取接口实例话对象
UserMapper userMapper = session.getMapper(UserMapper.class);
int result = userMapper.insertUser();
4、MyBatis 的增删改查
4.1 新增
<!-- int insertUser(); -->
<insert id="insertUser">
insert into t_user values(null,'liming','123456','男',25)
</insert>
4.2 删除
<!-- int deleteUser(); -->
<delete id="deleteUser">
delete from t_user where id=1
</delete>
4.3修改
<!-- int updataUser(); -->
<update id="updataUser">
update t_user set userName='czh',userPassword='654321' where id=2
</update>
4.4查询
-
查询一条数据
<!-- User selectUser(); --> <select id="selectUser" resultType="com.mybatis.pojo.User"> select * from t_user where id=2 </select>
-
查询多条数据
<!-- List<User> selectAllUser(); --> <select id="selectAllUser" resultType="com.mybatis.pojo.User"> select * from t_user </select>
注意:
1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射
关系。
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
parameterType和 parameterMap与上面情况一致。用于表示参数类型。方法有参数时需要加上。
有哪里出错或有疑问的评论区留言哦~有问必答,有错必改。