mybatis学习日志一
Mybatis 介绍
MyBatis 是支持 普通 SQL 查询 , 存储过程 和 高级映射 的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以 及对结果集的检索封装。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录.
JDBC- dbutils- MyBatis- Hibernate
使用步骤:
一、加入相关的jar包
mybatis-3.2.2.jar
mysql-connector-java-5.1.47.jar
二、创建相应的实体类bean
public class User {
private int id;
private String name;
private int age;
}
三、创建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.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> </configuration>
四、创建mybatis的映射文件
<?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:表示名称空间。现在的目的是区分id的. -->
<mapper namespace="com.zhiyou100.xz.mapper.UserMapper">
<!-- 查询所有 -->
<select id="selectAll" resultType="com.zhiyou100.xz.bean.User">
select * from users
</select>
<!-- 根据id查询用户。id:标识该标签。
parameterType:参数类型。可以写 也可以省略
resultType:返回结果的类型。
#{id}:类似于EL表达式。 解析id的值
-->
<select id="getUser" parameterType="int" resultType="com.zhiyou100.xz.bean.User">
select * from users where id=#{id}
</select>
<!--
parameterType:表示user类的对象。
相当于方法:
public void addUser(User user){
user.getName();
user.getAge();
}
-->
<insert id="addUser" parameterType="com.zhiyou100.xz.bean.User">
insert into users(name,age) values(#{name},#{age})
</insert>
<delete id="deleteUser" parameterType="int">
delete from users where id=#{id}
</delete>
<update id="updateUser" parameterType="com.zhiyou100.xz.bean.User">
update users set name=#{name},age=#{age} where id=#{id}
</update>
</mapper>
五、mybatis的映射文件要引入到配置文件中
<!-- 把映射文件引入到配置文件中 -->
<mappers>
<mapper resource="com/zhiyou100/xz/mapper/UserMapper.xml"/>
</mappers>
六、测试
public class Test {
//测试根据id查询用户
public static void main(String[] args) throws Exception {
//解析配置文件conf.xml
Reader reader=Resources.getResourceAsReader("conf.xml");
//获取SessionFactory对象
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
//获取Session对象,表示jdbc中connection,操作数据库的
SqlSession session=sessionFactory.openSession();
//getUser是为了得到select中的sql语句
//映射sql的标识字符串
User user=session.selectOne("com.zhiyou100.xz.mapper.UserMapper.getUser", 1);
System.out.println(user);
}
}
七、优化
1.如果映射文件中的查询条件有多个,则可以使用Map集合作为参数
<!-- 查询年龄在10~30之间的用户
1、查询条件不在实体类中。参数类型封装到map中。#{参数}===map的键
2、封装一个实体类。min max
如果在xml文件中出现了特殊字符?1.使用转义字符<:< 2.CDATA
-->
<select id="selectByAge" parameterType="map" resultType="com.zhiyou100.xz.bean.User">
<![CDATA[select * from users where age>=#{min} and age<=#{max}]]>
</select>
2.将属性文件单独列出db.recourses,需要将属性文件导入Mybatis配置文件中,之后使用${}
<!-- 引入数据源文件 -->
<properties resource="db.properties"/>
<!-- 为实体类取别名 -->
<typeAliases>
<!-- <typeAlias type="com.zhiyou100.xz.bean.User" alias="u"/> -->
<!-- 以下方法以该包下的所有类的类名作为别名 -->
<package name="com.zhiyou100.xz.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 习惯把数据源的信息放到一个属性文件中,后缀名为.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>
3.为实体类起别名,为包下所有类起别名,别名为类名(不建议使用,不方便别人解读代码)
<!-- 为实体类取别名 -->
<typeAliases>
<!-- <typeAlias type="com.zhiyou100.xz.bean.User" alias="u"/> -->
<!-- 以下方法以该包下的所有类的类名作为别名 -->
<package name="com.zhiyou100.xz.bean"/>
</typeAliases>
4.加入日志信息log4j.properties,方便我们查错,步骤如下:
把jar包引入;
引入日志文件:log4j.properties
代码如下:
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
八、使用接口结合xml文件:
1.创建一个接口,该接口要和映射文件匹配。方法名=ID名
public interface UserDao {
/**
* 根据id查询
* @param id
* @return
*/
public User getUser(int 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">
<!-- namespace:表示名称空间。这里的namespace一定要与接口所在的包以及接口的名字一样 -->
<mapper namespace="com.zhiyou100.xz.dao.UserDao">
<!-- 这里的id一定要与接口中方法的名字进行对照
-->
<select id="getUser" parameterType="int" resultType="com.zhiyou100.xz.bean.User">
select * from users where id=#{id}
</select>
</mapper>
2.映射文件中,命名空间要与映射文件路径一直,例如:com.zhiyou100.klb.dao.UserDao,如上图
3.测试程序运行状况,在junit下创建TestMybatis
import java.io.Reader;
import java.util.List; 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.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import com.zhiyou100.xz.bean.User;
import com.zhiyou100.xz.dao.UserDao; class TestMybatis {
static SqlSession session=null;
final String str="com.zhiyou100.xz.mapper.UserMapper";
static UserDao userDao;
@BeforeAll
static void setUpBeforeClass() throws Exception {
//解析配置文件conf.xml
Reader reader=Resources.getResourceAsReader("conf.xml");
//获取SessionFactory对象
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader); //获取Session对象,表示jdbc中connection,操作数据库的
session=sessionFactory.openSession();
//得到接口的实现类
userDao=session.getMapper(UserDao.class);//相当于创建一个Dao对象
} @Test
void testSelectByAge() {
List<User> list=userDao.selectByAge(10, 30);
System.out.println(list); }
@Test
void testId1() {
User user=userDao.getUser(1);
System.out.println(user); }
@Test
void testAdd() {
userDao.addUser(new User("孔子",2000));
}
@Test
void testDelete() {
userDao.deleteUser(5); }
@Test
void testUpdate() {
userDao.updateUser(new User(6,"孔子",20)); }
@AfterAll
static void tearDownAfterClass() throws Exception {
session.commit();//提交数据 事物管理:要么都执行,要么都不执行
} }
九、解决数据库中的字段与类中的属性不匹配问题
1.在SQL语句中为字段起别名,别名与类的属性名一致
2.利用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">
<!-- namespace:表示名称空间。这里的namespace一定要与接口所在的包以及接口的名字一样 -->
<mapper namespace="com.zhiyou100.xz.dao.ClazzDao"> <!-- resultMap:引用resultMap标签 -->
<!-- <select id="selectById" resultMap="clazzMapper">
select * from class c,teacher t where c.teacher_id=t.t_id and c_id=#{cid}
</select>
-->
<!-- resultMap:写属性与字段的对应关系
type:表示哪个实体类与表的对应关系
-->
<resultMap type="com.zhiyou100.xz.bean.Clazz" id="clazzMapper">
<!-- id:标签标识表中的主键与实体类的值属性对应关系 -->
<id column="c_id" property="cid"/>
<result column="c_name" property="cname"/>
<result column="teacher_id" property="tid"/>
<!-- 该类中引入的一的一方的属性
property:属性名
javaType:该属性的Java类型
-->
<!-- 链表查询
<association property="teacher" javaType="com.zhiyou100.xz.bean.Teacher">
<id column="t_id" property="tid"/>
<result column="t_name" property="tname"/>
</association>
-->
<association property="teacher" javaType="com.zhiyou100.xz.bean.Teacher">
<id column="t_id" property="tid"/>
<result column="t_name" property="tname"/>
</association>
<!-- ofType:集合中泛型的类型 -->
<collection property="students" ofType="com.zhiyou100.xz.bean.Student">
<id property="sid" column="s_id"/>
<result property="sname" column="s_name"/>
</collection> <!-- column:外键列
select="selectByTeacherId"
-->
<!-- 嵌套查询
<association property="teacher" javaType="com.zhiyou100.xz.bean.Teacher"
column="teacher_id" select="com.zhiyou100.xz.dao.TeacherDao.selectByTeacherId">
</association>
-->
</resultMap>
<!-- 嵌套查询
<select id="selectById" resultMap="clazzMapper">
select * from class where c_id=#{cid}
</select>
<select id="selectByTeacherId" resultType="com.zhiyou100.xz.bean.Teacher">
select t_id tid,t_name tname from teacher where t_id=#{tid}
</select>
-->
<select id="selectById2" resultMap="clazzMapper">
select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and
c.c_id=#{cid}
</select>
</mapper>
十、Mybatis中${ }和#{ }的区别
- $: 解析时不会为内容添加”” 它是sql语句的拼接存在sql注入的危害。传入的为表结构时
<!-- $ Preparing:insert into users(name,age) values('吴立琪',18):完成sql拼接。Statement sql注入的缺陷
如果你传入的为列名或表名时可以使用$
# insert into users(name,age) values(?,?):防止sql的注入。PreparedStatement -->
<insert id="addUser" parameterType="com.zhiyou100.xz.bean.User" >
insert into users(name,age) values(#{name},#{age})
</insert>
- #: 解析时会为内容添加””,它的sql是采用占位符,防止sql注入。
十一、添加对象时如何返回ID
<!--
useGeneratedKeys="true" 表示使用字段生成的key
keyProperyty:把生产的key赋值到哪个属性上。
-->
<insert id="addUser1" parameterType="com.zhiyou100.xz.bean.User" useGeneratedKeys="true" keyProperty="id">
insert into users(name,age) values(#{name},#{age})
</insert>
@Test
void testAdd() {
User user=new User("张三",20);
session.insert(str+".addUser1", user);
int id=user.getId();//通过user对象中的getId()方法获取添加记录后返回自增列的值
System.out.println(id);
}
mybatis学习日志一的更多相关文章
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- Mybatis学习--日志
学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/logging.html Logging Mybatis内置的日志工厂提供日志功能,具 ...
- mybatis学习日志之总结
一.介绍mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- Mybatis学习-日志与分页
日志 为什么需要日志 如果一个数据库操作出现了异常,需要排错,那么日志就是最好的助手 Mybatis通过使用内置的日志工厂提供日志功能,有一下几种实现方式: SLF4J Apache Commons ...
- mybatis学习——日志工厂
为什么要使用日志工厂? 我们想一下,我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?答案是肯定的,如果一个 数据库相关的操作出现了问题,我们就可以根据输出的S ...
- mybatis学习日志二
一.动态sql语句 if语句 if+where语句 if+set语句 choose(when,otherwise)语句 trim语句 sql片段 foreach语句 总结 bean部分的User类代码 ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...
- 【MyBatis学习笔记】
[MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...
- Mybatis学习笔记(二) 之实现数据库的增删改查
开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...
随机推荐
- c++中的静态成员
引言 有时候需要类的一些成员与类本身相关联,而不是与类的每个对象相关联.比如类的所有对象都要共享的变量,这个时候我们就要用到类的静态成员. 声明类的静态成员 声明静态成员的方法是使用static关键字 ...
- 结对开发_石家庄地铁查询web系统_psp表
结对开发_石家庄地铁查询_博客地址:https://www.cnblogs.com/flw0322/p/10680172.html PSP0: PSP0 Personal Software Proce ...
- 【剑指offer】77.调整数组顺序使奇数位于偶数前面
77.调整数组顺序使奇数位于偶数前面 知识点:数组:快速排序:冒泡排序: 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部 ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集-补充-热部署项目到tomcat中,但是数据库配置文件错误,中途停止部署,导致执行shutdow.sh报错异常: Could not contact localhost:8005. Tomcat may not be running error while shutting down】
1,经过千辛万苦的尝试和百度,终于一个博客:http://stackmirror.caup.cn/page/skxugjqj0ldc关于catalina.sh文件的执行引起了我的注意: 2,我执行ca ...
- vue2.x移动端ui框架选型
前言 最近公司准备做移动端spa项目,需要选一个ui框架.优先考虑谷歌Material Design设计风格.针对市面上的框架进行了一次调研,简单总结如下. 选型原则:1. 优先考虑md风格. 2. ...
- Innodb 锁的介绍
如下博文是参考如下博文内容,再加整理. http://blog.chinaunix.net/uid-24111901-id-2627857.html http://blog.csdn.net/wang ...
- SAML 2.0简介(1)
1.什么是SAML: SAML是Web浏览器用来通过安全令牌启用单点登录(SSO)的标准协议 2.优点: 跨多个应用程序管理用户身份和授权. 3.单点登录(SSO)是什么: 它使用户仅使用一组凭据(用 ...
- Python基础之创建文件夹与删除文件夹。
参考链接:https://blog.csdn.net/weixin_43826242/article/details/87101436 创建目录结构 # 创建文件目录结构 def create_fol ...
- endnote x9.3.3 for windows安装教程
EndNote X9.3.3 是一款非常nice的实用型文献管理软件,EndNote X9功能极其强劲,便捷好用.本文提供EndNote X9.3.3安装破解激活教程.方法,内附EndNote x9. ...
- Salesforce Integration 概览(二) Remote Process Invocation—Request and Reply(远程进程调用--请求和响应)
本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在项目中,经常 ...