MyBatis_Study_002(进阶,增删改查)
源码:https://github.com/carryLess/mbtsstd-002.git
1.主配置文件
<?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-3.4.4.pdf文件中搜索mybatis-3-config.dtd即可得到 -->
<configuration> <!-- 指定属性配置文件 -->
<properties resource="jdbc.properties" />
<!--
配置类的别名,我建议使用package这种写法
这样写会将该包中所有类的简单类名配置为别名,简单方便
,还有别的写法,自行google
-->
<typeAliases>
<package name="model" />
</typeAliases>
<!-- 配置MyBatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<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>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="dao/mapper.xml"/>
<!--
实际开发中可能有多个映射文件,而其中sql标签的id相同时候,执行过程就会报错
我们可以根据mapper映射文件中的namespace属性来区分,调用时候用如下方式
namespace.id
-->
<!--
<mapper resource="dao/mapper2.xml"/>
-->
</mappers> </configuration>
2.jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
3.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">
<!-- 文件头在解压的文件夹中mybatis-3.4.4.pdf文件中搜索mybatis-3-mapper.dtd即可得到 -->
<mapper namespace="model.Student">
<!-- parameterType属性,框架会根据SQLSession中传递的参数检测到,所以我们一般不用指定 -->
<insert id="insertStudent" parameterType="model.Student">
insert into student(name,age,score)
values(#{name},#{age},#{score})
</insert> <!--
resultType:获取的主键的类型
keyProperty:指出主键在java实体类中的属性名称
-->
<insert id="insertStudentCatchId">
insert into student(name,age,score)
values(#{name},#{age},#{score})
<selectKey resultType="int" keyProperty="id" order="AFTER">
select @@IDENTITY
<!-- select last_insert_id(); -->
</selectKey>
</insert> <delete id="deletById">
<!-- 这个#{xxx}是占位符,为delete方法的第二个参数,xxx随意填写 -->
delete from student where id = #{xxx}
</delete> <update id="updateStudent">
<!-- #{}占位符,里面字符串与实体类的属性名称一致 -->
update student set name = #{name},age=#{age},score=#{score} where id = #{id}
</update> <!--
resultType指定返回的结果集中每一条记录封装的对象的类型
这里的Student是配置的别名(主配置文件中配置),如果没有配置别名,可以写全限定类名
-->
<select id="selectAll" resultType="Student">
select * from student
</select> <select id="selectOne" resultType="Student">
<!-- 这个#{xxx}是占位符,xxx随意填写 -->
select * from student where id = #{xxx}
</select> <select id="selectByName" resultType="Student">
<!-- 模糊查询 -->
select * from student
where name like concat('%',#{xxx},'%')
<!--
或者写成如下形式
where name like '%' #{xxx} '%'
-->
<!--
上两种拼接参数会动态的传入sql中,还有以下写法是纯sql拼接,可能引起sql注入
必须写成如下形式 '%${value}%'
where name like '%${value}%'
-->
</select> <select id="selectByMap1" resultType="Student">
select * from student where age > #{age}
</select> <!-- 查询返回简单类型 -->
<select id="selectRowCount" resultType="Integer">
select count(1) from student
</select>
</mapper>
4.dao接口
package dao; import model.Student; import java.util.List;
import java.util.Map; /**
* Created by carryLess on 2017/11/29.
*/
public interface IStudentDao {
/**
* 插入数据
* @param student
*/
void insertStudent(Student student); /**
* 插入数据 获取id
* @param student
*/
void insertStudentCatchId(Student student); /**
* 根据id 删除数据
* @param id
*/
int deletById(int id); /**
* 修改数据 传入model
* @param student
*/
void updateStudent(Student student); /**
* 查询返回所有数据的集合
* @return
*/
List<Student> selectAll(); /**
* 查询返回map
* @return
*/
Map<String,Student> selectMap(); /**
* 根据id查询实体类
* @param id
* @return
*/
Student selectById(Integer id); /**
* 根据姓名查询
* @param name
* @return
*/
List<Student> selectByName(String name); /**
* 传递map为参数进行查询
* @param map
* @return
*/
List<Student> selectByMap(Map<String,Object> map); /**
* 返回简单类型 Integer
* @return
*/
Integer selectRowCount();
}
5.dao实现类
package dao; import model.Student;
import org.apache.ibatis.session.SqlSession;
import utils.MyBatisUtils; import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* Created by carryLess on 2017/11/29.
*/
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStudent(Student student) {
try {
sqlSession = MyBatisUtils.getSqlSession();
sqlSession.insert("insertStudent",student);
sqlSession.commit();
}finally {
//关闭sqlSession
if(sqlSession != null){
sqlSession.close();
}
}
} @Override
public void insertStudentCatchId(Student student) {
try {
sqlSession = MyBatisUtils.getSqlSession();
sqlSession.insert("insertStudentCatchId",student);
sqlSession.commit();
}finally {
//关闭sqlSession
if(sqlSession != null){
sqlSession.close();
}
}
} @Override
public int deletById(int id) {
int opCount;
try {
sqlSession = MyBatisUtils.getSqlSession();
opCount = sqlSession.delete("deletById",id);
sqlSession.commit();
}finally {
//关闭sqlSession
if(sqlSession != null){
sqlSession.close();
}
}
return opCount;
} @Override
public void updateStudent(Student student) {
try {
sqlSession = MyBatisUtils.getSqlSession();
sqlSession.update("updateStudent",student);
sqlSession.commit();
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
} @Override
public List<Student> selectAll() {
List<Student> selectAll = new ArrayList<>();
try {
sqlSession = MyBatisUtils.getSqlSession();
selectAll = sqlSession.selectList("selectAll");
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return selectAll;
} @Override
public Map<String, Student> selectMap() {
Map<String,Student> sMap;
try {
sqlSession = MyBatisUtils.getSqlSession();
/*第一个参数时映射文件中sql标签的id,第二个参数指定字段名称,以此为map的key*/
sMap = sqlSession.selectMap("selectAll", "id");
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return sMap;
} @Override
public Student selectById(Integer id) {
Student student;
try {
sqlSession = MyBatisUtils.getSqlSession();
student = sqlSession.selectOne("selectOne",id);
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return student;
} @Override
public List<Student> selectByName(String name) {
List<Student> students;
try {
sqlSession = MyBatisUtils.getSqlSession();
students = sqlSession.selectList("selectByName",name);
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return students;
} @Override
public List<Student> selectByMap(Map<String, Object> map) {
List<Student> students;
try {
sqlSession = MyBatisUtils.getSqlSession();
students = sqlSession.selectList("selectByMap1",map);
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return students;
} @Override
public Integer selectRowCount() {
Integer rowCount;
try {
sqlSession = MyBatisUtils.getSqlSession();
rowCount = sqlSession.selectOne("selectRowCount");
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return rowCount;
} }
6.实体类
package model; /**
* Created by carryLess on 2017/11/29.
*/
public class Student {
private Integer id;
private String name;
private Integer age;
private double score; public Student() {
} public Student(String name, Integer age, double score) {
this.name = name;
this.age = age;
this.score = score;
} @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public double getScore() {
return score;
} public void setScore(double score) {
this.score = score;
}
}
7.工具类
package 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; /**
* Created by carryLess on 2017/11/30.
*/
public class MyBatisUtils { /*
* SqlSession 由SqlSessionFactory对象创建,
* 而SqlSessionFactory对象为重量级对象
* 并且是线程安全的,所以我们将其设为单例
* */
private static SqlSessionFactory factory; /**
* 私有化构造方法,避免该工具类在外部被实例化
*/
private MyBatisUtils(){} /**
* 获取 SqlSession
* @return
*/
public static SqlSession getSqlSession(){
try {
if(factory == null){
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//创建工厂类
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
/*
* factory.openSession(true); 创建一个有自动提交功能的SqlSession
* factory.openSession(false); 创建一个没有自动提交功能的SqlSession,需要手动提交
* factory.openSession(); 同factory.openSession(false);
*/
return factory.openSession();
}
}
8.测试类
package test; import dao.IStudentDao;
import dao.StudentDaoImpl;
import model.Student;
import org.junit.Before;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by carryLess on 2017/11/29.
*/
public class MyTest { private IStudentDao dao; @Before
public void initDao(){
dao = new StudentDaoImpl();
} @Test
public void insertTest(){
Student student = new Student("张三",18,60.0);
IStudentDao dao = new StudentDaoImpl();
dao.insertStudent(student);
} @Test
public void insertCatchIdTest(){
Student student = new Student("李四",14,34.3);
System.out.println(student);
dao.insertStudentCatchId(student);
System.out.println(student);
} @Test
public void testDeletById(){
dao.deletById(8);
} @Test
public void testUpdate(){
Student student = new Student("wangmazi",24,54);
student.setId(2);
dao.updateStudent(student);
} @Test
public void testSelectAll(){
List<Student> students = dao.selectAll();
System.out.println(students);
} @Test
public void testSelectMap(){
Map<String, Student> selectMap = dao.selectMap();
System.out.println(selectMap);
} @Test
public void testSelectOne(){
Student student = dao.selectById(3);
System.out.println(student);
} @Test
public void testSelectByNames(){
List<Student> students = dao.selectByName("w");
System.out.println(students);
} @Test
public void testSelectByMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("age",10);
List<Student> students = dao.selectByMap(map);
System.out.println(students);
} @Test
public void testSelectRowCount(){
System.out.println(dao.selectRowCount());
}
}
9.建表sql
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
`score` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
MyBatis_Study_002(进阶,增删改查)的更多相关文章
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ...
- [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查
此文章也是关注网上好几篇技术文章后,今天分享出来.因为,总有在程序学习路上的小伙伴会感到迷茫.而迷茫存在的情况如下 第一种:在大学学习中出现的迷茫,不知道Java到底要学什么.学习Java的标准是什么 ...
- C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半 ...
- 关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...
- python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查
Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
- MongoDB 数据库的概念以增删改查
1,MongoDB概念解析: Mongo数据库基本概念是文档,集合,数据库,下表给予介绍 SQL术语概念 MongoDB术语概念 解释/说明 database database 数据库 table c ...
- CoreData 从入门到精通(二) 数据的增删改查
在上篇博客中,讲了数据模型和 CoreData 栈的创建,那下一步就是对数据的操作了.和数据库一样,CoreData 里的操作也无非是增删改查.下面我们将逐步讲解在 CoreData 中进行增删改查的 ...
随机推荐
- (转) bicabo Visual Studio 2012自动添加注释(如版权信息等)
如何使用Visual Studio 2012给程序文件的头部自动添加如下的注释? /********************************************************** ...
- 《高性能CUDA应用设计与开发》--笔记
第一章 1.2 CUDA支持C与C++两种编程语言,该书中的实例采取的是Thrust数据并行API,.cu作为CUDA源代码文件,其中编译器为ncvv. 1.3 CUDA提供多种API: 数据并行 ...
- CentOS7 忘了root密码怎么办
今天打开很久没开机的另2台虚拟机,发现不记得root密码了. 于是参考了google搜索到的第一个答案,https://www.unixmen.com/reset-root-password-cent ...
- 去掉每行最后n个字符
awk '{sub(/.{n}$/,"")}1' nation.tbl > nation.tbl2 把n替换成具体长度
- springboot+mybatis项目自动生成
springboot_data_access_demo基于rapid,根据自定义模版生成的基于mybatis+mysql的数据库访问示例项目.简单配置数据库信息,配置不同的生成策略生成可以直接运行访问 ...
- SNMP Introduction
Basic command of SNMP: GET: The GET operation is a request sent by the manager to the managed device ...
- presto-cli通过hive查询hdfs
1. 启动hive metastore 2. 启动hive thrift接口 参考:http://www.cnblogs.com/kisf/p/7497261.html 3. 下载presto se ...
- Log4j2报错ERROR StatusLogger Unrecognized format specifier
问题 使用maven-shade-plugin或者maven-assembly-plugin插件把项目打成一个可执行JAR包时,如果你引入了log4j2会出现如下问题: ERROR StatusLog ...
- [调参]batch_size的选择
链接:https://www.zhihu.com/question/61607442/answer/440944387 首先反对上面的尽可能调大batch size的说法,在现在较前沿的视角来看,这种 ...
- P4factory ReadMe 剩余部分
Building and Running a Target Each P4 program (called a 'target') is set up in a directory under tar ...