文章目录
1 Mybatis_01
1.1 Junit
1.1.1 junit的使用
package com.chenlan01.junit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @Description Junit:使用@Test注解在方法上,可以直接执行方法
* @Author chenlan
* @Date 2020/10/9 17:25
* <p>
* junit使用步骤:
* 01 使用@Test导入junit环境
* 02 选中方法的名称运行测试
* <p>
* junit要求:
* 01 方法不能是private修饰符修饰
* 02 方法不能是static修饰
* 03 测试的方法不能有返回值,即必须为void
*/
public class JunitTest {
@Test
public void print() {
System.out.println("JunitTest.print");
}
@Test
public void div() {
System.out.println(1 / 0);
}
@Test
public void addTest() {
int i = 1 + 1;
System.out.println("i = " + i);
// 断言测试:如果期望值与实际结果值一致,则断言测试通过
Assert.assertEquals(2, i);
}
private Math math;
@Before
// 在@Test注解的方法之前运行,可以初始化资源
public void init() {
System.out.println("JunitTest.init");
math = new Math();
}
@After
// 在@Test注解的方法之后运行,可以关闭资源
public void after() {
System.out.println("JunitTest.after");
}
@Test
public void test01() {
int addVar = math.add(1, 2);
System.out.println("addVar = " + addVar);
Assert.assertEquals(3, addVar);
}
@Test
public void test02() {
int divVar = math.div(2, 2);
System.out.println("divVar = " + divVar);
Assert.assertEquals(1, divVar);
}
}
1.1.2 配置单元测试模板
1.2 XML
1.2.1 XML概述
可扩展标记语言(Extensible Markup Language),是一种标记语言,XML 的设计宗旨是传输数据,而非显示数据。
<?xml version="1.0" encoding="utf-8"?>
<!--版本号和编码,第一行-->
<!--
基本语法:
01 必须要有开始标签和结束标签
02 标签区分大小写
03 必须要有根标签
04 属性值加""
05 标签名可以自定义
-->
<students>
<student sid = "001">
<name>alex</name>
<age>20</age>
</student>
<student sid = "002">
<name>ben</name>
<age>20</age>
</student>
</students>
1.2.2 XML约束
dtd:
<!ELEMENT students (student*) >
<!--ELEMENT 元素 元素标签students可以有多个 student 标签-->
<!ELEMENT student (name,age,sex)>
<!--ELEMENT 元素 元素标签 student可以有标签 name,age,sex, 顺序也不能错误 -->
<!ELEMENT name (#PCDATA)>
<!-- 元素 name 标签 中可以写文本 -->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student sid CDATA #REQUIRED>
<!-- 多个student标签 必须有number 属性 -->
<!--上面就是 dtd 的约束规则-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students SYSTEM "E:\IdeaProjects\2008-j\java28_mybatis\src\com\chenlan02\xml2\student.dtd">
<students>
<student sid="001">
<name>coco</name>
<age>19</age>
<sex>female</sex>
</student>
<student sid="002">
<name>alex</name>
<age>12</age>
<sex>male</sex>
</student>
</students>
xsd:
1.2.3 XML解析
Dom4j解析:
package com.chenlan04.xml4;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.File;
import java.util.List;
/**
* @Description dom4j解析
* @Author chenlan
* @Date 2020/10/9 19:40
* <p>
* 步骤:
* 01 导入jar包
* 02 获取解析器
* 03 读取xml文件
* 04 获取root节点
* 05 获取root节点下的子节点列表
* 06 解析子节点
*/
public class Dom4jTest {
@Test
public void test() throws DocumentException {
// 获取解析器
SAXReader reader = new SAXReader();
// 读取xml文件
Document doc = reader.read(new File("src\\students.xml"));
// 获取root节点:students
Element rootElement = doc.getRootElement();
System.out.println(rootElement.getName());
// 获取root节点下的所有子节点:student
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println(element.getName());
// 获取属性节点sid
String sid = element.attribute("sid").getText();
System.out.println("sid = " + sid);
// 获取节点name
String name = element.element("name").getText();
System.out.println("name = " + name);
// 获取节点age
String age = element.element("age").getText();
System.out.println("age = " + age);
}
}
}
1.2.4 XML应用
1.3 Mybatis概述
1.3.6 入门示例
1.配置mybatis-config.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">
<!--mybatis约束文件-->
<configuration>
<!--根节点 配置标签-->
<environments default="development">
<!--环境标签 可以配置多个环境 通过属性节点default的属性值指定环境-->
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--
mappers标签: 配置映射器
由于在自动查找资源方面,java并没有很好的解决方案,所以需要配置映射器告诉mybatis映射文件在哪里
01 resource 配置xml文件的资源
<mapper resource="com/chenlan07/mybatis/mapper/UserMapper.xml"/>
02 class 配置类的全限定名 mybatis注解开发需要使用此配置
<mapper class="com.chenlan07.mybatis.mapper.UserMapper"/>
03 package 将包内所有的映射器接口全部注册为映射器
<package name="com.chenlan07.mybatis.mapper"/>
-->
<mappers>
<mapper resource="com/chenlan07/mybatis/mapper/UserMapper.xml"/>
<!--<mapper class="com.chenlan07.mybatis.mapper.UserMapper"/>-->
<!--<package name="com.chenlan07.mybatis.mapper"/>-->
</mappers>
</configuration>
2.写mapper层接口
package com.chenlan07.mybatis.mapper;
import com.chenlan07.mybatis.po.User;
public interface UserMapper {
int insertUser(User user);
User selectUserById(Integer i);
}
3.编写对应mapper.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">
<!--
xml配置与接口绑定要求:
01 namespace 命名空间值必须与接口的全限定名一致
02 sql 标签的id 节点值必须与接口的方法名一致
03 sql 标签的参数类型必须与方法中的参数类型一致
04 sql 标签中的返回结果类型必须与接口中的返回值类型一致
获取方法的参数使用ognl语法
#{XXX}
-->
<mapper namespace="com.chenlan07.mybatis.mapper.UserMapper">
<insert id="insertUser" parameterType="com.chenlan07.mybatis.po.User">
insert into user values (default,#{name},#{password},#{age})
</insert>
<select id="selectUserById" parameterType="int" resultType="com.chenlan07.mybatis.po.User">
select * from user where id = #{id}
</select>
</mapper>
4.编写java代码进行测试
package com.chenlan07.mybatis;
import com.chenlan07.mybatis.mapper.UserMapper;
import com.chenlan07.mybatis.po.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @Description TODO
* @Author chenlan
* @Date 2020/10/9 22:46
*
* 步骤:
* 01 导入jar包
*
* 02 创建配置文件mybatis-config.xml
*
* 03 写mapper层接口
*
* 04 写xml文件与接口进行映射
*
* 06 写java代码进行测试
* 01 读取配置文件:返回一个流
* InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
*
* 02 获取SqlsessionFactory对象:
* SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
*
* 03 获取SqlSession对象:
* SqlSession sqlSession = sqlSessionFactory.openSession();
*
* 04 获取mapper代理对象
*
* 05 通过代理对象直接调用方法,拿到sql执行的结果
*
*/
public class AppTest {
@Test
public void test() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("alex");
user.setPassword("123");
user.setAge(20);
int i = mapper.insertUser(user);
System.out.println(i > 0 ? "成功" : "失败");
User user1 = mapper.selectUserById(1);
System.out.println(user1.toString());
sqlSession.commit();
if (sqlSession != null) {
sqlSession.close();
}
}
}
1.4 log4j日志框架的配置
1.4.1 文件配置
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置 可以控制 包/类的日志输出
# 前缀(log4j.logger)+点(.)需要记录日志的命名空间 = 日志级别
log4j.logger.com.chenlan01.mybatis1.mapper.UserMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出的格式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# %5p 日志级别
# [%t] 线程名称
# %m 日志的输入信息
# %n 换行
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
1.5 Mybatis完成CRUD操作
1.5.1 单行查询
映射文件:
<select id="selectUserById" parameterType="integer" resultType="com.chenlan01.mybatis1.po.User">
select * from user where id = #{id}
</select>
mybatis工具类:
package com.chenlan01.mybatis1.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;
/**
* @Description mybatis工具类
* @Author chenlan
* @Date 2020/10/10 19:31
* <p>
* 作用域和生命周期:
* <p>
* SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域
* <p>
* SqlSessionFactory 最佳的作用域是应用作用域,最简单的就是使用单例模式或者静态单例模式
* <p>
* SqlSession 最佳的作用域是请求或方法作用域
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
// config在static代码块中加载,只加载一次
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 获取SqlSession对象
*
* @return
*/
public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 自动提交事务
*
* @param autoCommit
* @return
*/
public static SqlSession getSqlSession(boolean autoCommit) {
SqlSession sqlSession = sqlSessionFactory.openSession(autoCommit);
return sqlSession;
}
/**
* 关闭sqlSession
*
* @param sqlSession
*/
public static void close(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
/*public static SqlSession getSqlSession() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}*/
}
测试方法:
@Test
public void testSelect() {
// 获取sqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
// sqlSession 获取的 mapper是 mybatis进行了动态代理后的 mapper对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用方法
User user = mapper.SelectUserById(1);
System.out.println(user.toString());
// 关闭资源
MybatisUtils.close(sqlSession);
}
1.5.2 多行查询
映射文件:
<!--
多行查询
返回结果类型配置集合中的泛型即可
List<User> : resultType="User"
-->
<select id="selectUserAll" resultType="com.chenlan01.mybatis1.po.User">
select * from user
</select>
测试方法:
@Test
public void testSelectAll() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUserAll();
for (User user : users) {
System.out.println(user.toString());
}
MybatisUtils.close(sqlSession);
}
1.5.3 删除操作
映射文件:
<delete id="deleteUserById" parameterType="integer" >
delete from user where id = #{id}
</delete>
测试方法:
@Test
public void testDelete() {
SqlSession sqlSession = MybatisUtils.getSqlSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUserById(8);
System.out.println(i > 0 ? "删除成功" : "删除失败");
MybatisUtils.close(sqlSession);
}
1.5.4 修改操作
映射文件:
<update id="updateUserById" parameterType="com.chenlan01.mybatis1.po.User">
update user set name = #{name},password = #{password},age = #{age} where id = #{id}
</update>
测试方法:
@Test
public void testUpdate() {
SqlSession sqlSession = MybatisUtils.getSqlSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(9);
user.setName("coco");
user.setPassword("123");
user.setAge(18);
int i = mapper.updateUserById(user);
System.out.println(i > 0 ? "修改成功" : "修改失败");
MybatisUtils.close(sqlSession);
}
1.6 ResultMap手动映射
映射文件:
<?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.chenlan02.mybatis2.mapper.UserMapper">
<select id="selectUserById" parameterType="integer" resultMap="rs_map">
select id u_id,name u_name ,password u_pwd ,age from user where id = #{id}
</select>
<resultMap id="rs_map" type="user">
<id column="u_id" jdbcType="INTEGER" property="id" javaType="integer"></id>
<result column="u_name" property="name"></result>
<result column="u_pwd" property="password"></result>
<result column="age" property="age"></result>
</resultMap>
</mapper>
测试类:
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.SelectUserById(1);
System.out.println(user.toString());
MybatisUtils.close(sqlSession);
}