文章目录
Mybatis
环境:
JDK1.8
Mysql5.7
Maven3.6.1
IDEA
2、第一个mybatis程序
2.1搭建环境
搭建数据库
Create database `mybatis`;
Use `mybatis`;
Create table `user`(
`id` int (20) not null primary key,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)enging=ingodb default charset=utf8;
Insert into `user` (`id`,`name`,`pwd`)values
(1,`狂神`,`123456`),
(2,`张三`,`1234567`),
(3,`李四`,`1234568`)
新建项目
1.新建一个普通的maven项目Mybatis-Study
2.删除src目录
3.导入maven依赖
<!--父工程-->
<groupId>com.muzi</groupId>
<artifactId>Mybatis-Study</artifactId>
<version>1.0-SNAPSHOT</version>
<!--导入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<!--在build中配置resource,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.2创建一个模块(注意这是再在工程下建子模块maven项目mybatis01)
刚刚的依赖全是在父工程的pom.xml中配置,于是子工程也能使用并且不用重复导入,此时的子工程也是一个模块。
编写mybatis的核心配置文件pom.xml
<?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&useUcode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
此时应该点击
填写
然后测试
测试成功后,在这里点击所创建的数据库。
一切顺利的话就会有它
编写mybatis工具类MybatisUtils
封装了连接数据库的内容
package com.muzi.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @author muzi
* @create 2020-03-02 13:27
*/
//sqlSessionFactory -->sqlSession
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();//工厂来打开连接,返回一个数据库连接
}
}
2.3、编写代码
实体类User
package com.muzi.pojo;
/**
* @author muzi
* @create 2020-03-02 13:45
*/
//实体类
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;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
Dao接口UserDao
package com.muzi.dao;
import com.muzi.pojo.User;
import java.util.List;
/**
* @author muzi
* @create 2020-03-02 13:47
*/
public interface UserDao {
List<User> getUserList();
}
接口实现类由原来的UserDaoImpl转换为一个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接口-->
<mapper namespace="com.muzi.dao.UserDao">
<!-- select查询语句 -->
<select id="getUserList" resultType="com.muzi.pojo.User">
SELECT * FROM mybatis.user
</select>
</mapper>
2.4、测试
package com.muzi.dao;
import com.muzi.pojo.User;
import com.muzi.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author muzi
* @create 2020-03-02 14:03
*/
public class UserDaoTest {
@Test
public void test(){
//获取sqlSession对象
SqlSession sqlSession=MybatisUtils.getSqlSession();//利用工具类获得一个数据库连接
try {
UserDao mapper=sqlSession.getMapper(UserDao.class);//利用连接得到关于Dao接口的实现类对象
List<User> userList = mapper.getUserList();//Dao接口的实现类对象调用得到用户的方法从而得到用户集合
for(User user:userList){
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭SqlSession
sqlSession.close();
}
}
}
注意:在父工程,以及子工程的pom.xml文件中要加上
<!--在build中配置resource,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
注意:在子工程的pom.xml中加上
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/muzi/dao/UserMapper.xml"/>
</mappers>
测试结果:
工程结构:
3、CRUD
1、Namespace
Namespace中的包名要和Dao/Mapper接口的包名一致!
2、Select
选择,选择语句;
id:就是对应的namespace中的方法名。
resultType:sql语句执行的返回值!
parameterType:参数类型!
(1)编写UserMapper接口
//根据ID查询用户
User getUserById(int id);
(2)编写对应的Mapper中的sql语句
<select id="getUserById" parameterType="int" resultType="com.muzi.pojo.User">
SELECT * FROM mybatis.user WHERE id=#{id}
</select>
(3)测试
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(2);
System.out.println(userById);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
3.Insert
(1)编写UserMapper接口
//insert一个用户
int addUser(User user);
(2)编写对应的Mapper中的sql语句
<insert id="addUser" parameterType="com.muzi.pojo.User">
INSERT into mybatis.user(id,name,pwd) VALUES (#{id},#{name},#{pwd});
</insert>
(3)测试
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res=mapper.addUser(new User(4,"王五","123456789"));
if(res>0){
System.out.println("插入成功");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
4.Update
(1)编写UserMapper接口
//修改用户
int updateUser(User user);
(2)编写对应的Mapper中的sql语句
<update id="updateUser" parameterType="com.muzi.pojo.User">
update mybatis.user SET name=#{name},pwd=#{pwd} WHERE id=#{id};
</update>
(3)测试
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.updateUser(new User(1, "肖晓冉", "5211314"));
if(res>0){
System.out.println("修改成功");
}
sqlSession.commit();
sqlSession.close();
}
5.Delete
(1)编写UserMapper接口
//删除用户
int deleteUser(int id);
(2)编写对应的Mapper中的sql语句
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
(3)测试
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(4);
if(i>0){
System.out.println("删除成功");
}
sqlSession.commit();
sqlSession.close();
}
注意点:
增删改需要提交事务
6.分析错误
标签不要匹配错
Resource绑定mapper,需要使用路径!
程序配置文件不许符合规范
Nullpointexception,没有注册到资源。
输出的xml文件中存在乱码问题。
Maven资源没有导出问题。
7.万能的map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map
User getUserById2(Map<String,Object> map);
<select id="getUserById2" parameterType="map" resultType="com.muzi.pojo.User">
SELECT * FROM mybatis.user WHERE id=#{id} OR name=#{NAME};
</select>
@Test
public void getUserById2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("id",1);
User userById2 = mapper.getUserById2(map);
System.out.println(userById2);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
Map传递参数,直接在sql中取出key即可!
对象传递参数,直接在sql中取对象的属性即可。
只有一个基本类型参数的情况下,可以直接在sql中取到。
多个参数用map,或者注解
8.思考题
(1)Java代码执行的时候,传递通配符%%
List<User> userList=mapper.getUserLike(“%李%”);
(2)在sql拼接中使用通配符。
Select * from mybatis user where name like “%”#{value}”%”
4、配置解析
1、核心配置文件
Mybatis-config.xml
MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。
configration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandLers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactonManager(事务管理器)
dataSource(数据源)
dataseIdProvder(数据库厂商标识)
Mappers(映射器)
2、环境配置
MyBatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
学会使用配置多套运行环境。
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
3、属性(properties)
我们可以通过properties属性来实现引用配置文件。
这些属性都是可外部配置且动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。【db.properties】
编写一个配置文件
Db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUcode=true&characterEncoding=UTF-8
username=root
password=root
在核心配置文件中引用
<!--引入外部配置文件-->
<properties resource="db.properties"/>
可以直接引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的。
4、类型别名(typeAliases)
类型别名是为Java类型设置一个短的名字。
存在的意义仅在于用来减少类完全限定名的冗余。
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.muzi.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean,比如:
扫描实体类的包,它的默认别名就为这个类的类名,首字母小写。
<typeAliases>
<package name="com.muzi.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式。
如果实体类十分多,建议使用第二种。
第一种可以diy别名,第二种不行,如果非要改,需要在实体上增加注解
@Alias("user")
public class User。。。
5、映射器(mappers)
MapperRegistry:注册绑定我们的Mapper文件;
方式一:
`<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/muzi/dao/UserMapper.xml"/>
</mappers>`
方式二:使用class文件绑定注册
<mappers>
<mapper class="com.muzi.dao.UserMapper"/>
</mappers>
注意点:
接口和它的Mapper配置文件必须同名。
接口和它的Mapper配置文件必须在同一个包下。
方式三:使用扫描包进行注入绑定
<mappers>
<package name="com.muzi.dao"/>
</mappers>
注意点:
接口和它的Mapper配置文件必须同名。
接口和它的Mapper配置文件必须在同一个包下。