mybatis 入门基础练习
首先 导入jar包 1,mybatis-3.5.2.jar 2,log4j-1.2.17.jar 日志包。3,mysql-connector-java-5.1.35.jar
然后建立项目
首先配置jdbc 加载驱动文件
未配置的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 事务管理器-->
<transactionManager type="JDBC"/>
<!--dataSource 数据源-->
<!--POOLED 连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--mapper 映射-->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
配置后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/wu5"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
<mapper resource="OrgMybatis/mapper/Stumentmapper.xml"/>
</mappers>
</configuration>
终极版的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">
<configuration>
<!--properties 这个标签加载读取文件-->
<properties resource="db.properties"/>
<typeAliases>
<!--1.自己起名字-->
<!-- <typeAlias type="OrgMybatis.domain.Student" alias="stu"/>-->
<!--name 2.批量起名 mybatis 规定该类下的包名 -->
<!--<package name="OrgMybatis.domain"/>-->
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--修改的位置 反射获取key 得到vule-->
<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="org/mybatis/example/BlogMapper.xml"/>-->
<mapper resource="OrgMybatis/Dao/Stumentmapper.xml"/>
<!-- 批量注册mapper映射文件文件 未来开发的模式 -->
<!-- <package name="OrgMybatis.Dao"/>-->
</mappers>
</configuration>
被读取的文件 db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/wu2
jdbc.username=root
jdbc.password=1234
Dao 层
ClassStudentDao 接口
package OrgMybits01.Dao;
import OrgMybits01.entrty.ClassStu;
public interface ClassStudentDao {
//查询单条的方法
ClassStu select(String id);
}
ClassStudent.xml (主要写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">
<!--mapper namespace="连接池",当前接口的路径--> 有些东西就是死的记住
<mapper namespace="OrgMybits01.Dao.ClassStudentDao">
<!-- 查询单条记录 resultType返回结果集 包含在实体类反射加载实体类 OrgMybits01.entrty.ClassStu"-->
<select id="select" parameterType="java.lang.String" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu WHERE id= #{id}
</select>
</mapper>
封装的工具类
package OrgMybits01.Util;
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;
public class SqlSessionUtil {
//私有化构造方法
public SqlSessionUtil(){}
private static SqlSessionFactory sqlSessionFactory;
/* 静态代码块的特色(在代码中优先执行一次)*/
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
private static ThreadLocal<SqlSession> t = new ThreadLocal<SqlSession>();
//1.获取SqlSession 对象;
public static SqlSession getSession(){
SqlSession Session = t.get();//不一定能获取
if(Session==null){
Session = sqlSessionFactory.openSession();
t.set(Session);
}
return Session;
}
//1.关闭SqlSession 对象;
public static void myclose(SqlSession Session){
if(Session!=null){
Session.close();
}
//一定要销毁分配(玻璃)的线程 方便下次分配的线程是干净的
t.remove();
}
}
测试类
package OrgMybits01.Test;
import OrgMybits01.Dao.ClassStudentDao;
import OrgMybits01.Util.SqlSessionUtil;
import OrgMybits01.entrty.ClassStu;
public class Test {
public static void main(String[] args) {
ClassStudentDao classStu= SqlSessionUtil.getSession().getMapper(ClassStudentDao.class);
//查询单条记录
ClassStu stu = classStu.select("103");
System.out.println(stu);
}
}
ClassStu{id='103', name='wutian', age='4', address='包子山'}
还有一个实体类自己写
接下来上面的框架基本就是搭建好了 我只在测试类和接口 ClassStudentDao 文件 ClassStudent.xml 写代码。
/1. 项目需求 查询年龄 返回一个班级的集合
List<ClassStu> list = classStu.select1(23);
for (ClassStu s:list
) {
System.out.println(s);
}
//接口的方法
List<ClassStu> select1(int age);
//ClassStudent.xml (主要写sql 标签)
<!-- 查询单条记录age-->
<select id="select1" parameterType="int" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu WHERE age= #{age}
</select>
/2. 项目需求 查询 姓名= ‘’ 年龄的 age=’’;*
//测试类
ClassStu ss = new ClassStu();
ss.setName("wukong");
ss.setAge(23);
ClassStu stu2 = classStu.select3(ss);
System.out.println(stu2);
//接口的方法
ClassStu select3(ClassStu ss);
//ClassStudent.xml (主要写sql 标签)
<!-- 查询单条记录 name ====age-->
<select id="select3" parameterType="OrgMybits01.entrty.ClassStu" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu WHERE name=#{name} and age=#{age}
</select>
/3. 项目需求 方法2 查询 姓名= ‘’ 年龄的 age=’’ 封装传入参数 map 传入值返回集合
// 查询 姓名= '' 年龄的 age='' 封装传入参数 map 传入值返回集合
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","wukong");
map.put("age",23);
List<ClassStu> list = classStu.select4(map);
for (ClassStu s:list
) {
System.out.println(s);
}
//接口的方法
List<ClassStu> select4(Map<String, Object> map);
<!-- 查询单条记录 name ====age-->
<select id="select4" parameterType="map" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu WHERE name=#{name} and age=#{age}
</select>
//4.like 模糊查询的使用查询名字中含有s 的
//like 模糊查询的使用查询名字中含有s 的
List<ClassStu> list = classStu.select5("k");
for (ClassStu s:list
) {
System.out.println(s);
}
//接口的方法
List<ClassStu> select5(String s);
<!-- 查询单条记录 name ==带==k-->
<select id="select5" parameterType="String" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu WHERE name like '%' #{name} '%'
</select>
// 5 查询有多少条记录
//查询有多少条记录
int count= classStu.select6();
System.out.println(count);
//接口的方法
int select6();
<!-- 查询多少条记录 -->
<select id="select6" resultType="int">
SELECT COUNT(*) FROM ClassStu
</select>
//6 查询所有的学生
// 查询所有的学生
List<ClassStu> list= classStu.select7();
for (ClassStu s :list) {
System.out.println(s);
}
}
// dao
List<ClassStu> select7();
<!-- 所有条记录 -->
<select id="select7" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu
</select>
//7 查询所有放到map 中
//当第一次获取到的Student 单条数据放到MaP 中 当第二次获取到的Student单条数据放到MaP1 中
//Mybatis 会自动创建map 的所有对象放到 List 集合中
List<Map<String,Object>> mapList = classStu.select8();
for (Map<String,Object> s:mapList
) {
Set<String> strings = s.keySet();
System.out.println(strings);
for (String s1:strings
) {
System.out.println("key=========="+s1);
System.out.println("value========"+s.get(s1));
}
}
//
List<Map<String, Object>> select8();
<!-- 所有条记录 -->
<select id="select8" resultType="map">
SELECT * FROM ClassStu
</select>
// 8 字段名(字段名与数据库名不一样是的查询);方法 重名名字段名
//1 字段名(字段名与数据库名不一样是的查询);方法 重名名字段名
List<ClassStu> list= classStu.select9();
for (ClassStu s :list) {
System.out.println(s);
}
//
List<ClassStu> select9();
<!-- 所有条记录 fname你查询的fname 人家到ClassStu 找不到 然后就插入不了值-->
<select id="select9" resultType="OrgMybits01.entrty.ClassStu">
SELECT id,fname as name,age FROM ClassStu
</select>
<!--fname as name 重命名-->
// 9 字段名(字段名与数据库名不一样是的查询);方法 map 配置
// 开发一定尽量表名的字段名尽量 和类属性名一致
//字段名(字段名与数据库名不一样是的查询);方法 map 配置
List<ClassStu> list= classStu.select10();
for (ClassStu s :list) {
System.out.println(s);
}
//
List<ClassStu> select10()
<!--id 标签 配置主键的 result 配置普通字段
一个id两个普通字段 所以要 id一个 result两个 property 类属性
column 数据库字段名-->
<resultMap id="cls" type="OrgMybits01.entrty.ClassStu" >
<id property="id" column="id"></id>
<result property="name" column="fname"></result>
<result property="age" column="age"></result>
</resultMap>
<select id="select10" resultMap="cls">
SELECT * FROM ClassStu
</select>
// 10 动态sQL的测试 where + if 标签(只能输入英文 不能汉子)
ClassStu dd = new ClassStu();
dd.setName("wukong");
dd.setAddress("44");
List<ClassStu> list= classStu.select13(dd);
for (ClassStu s:list
) {
System.out.println(s);
}
<!--/* 当where标签使用的时候 必须使用if 标签
通过if 进行条件判断如果有条件附件的 where条件显示否则 不显示
*/-->
<select id="select13" parameterType="OrgMybits01.entrty.ClassStu" resultType="OrgMybits01.entrty.ClassStu">
SELECT * FROM ClassStu
<where>
<if test="name!=null and name!=''">
name like '%' #{name} '%'
</if>
<if test="address!=null and address!=''">
and address like '%' #{address} '%'
</if>
</where>
</select>
//11 sql 片段
ClassStu Stu= classStu.select11("wufan");
System.out.println(Stu);
//
ClassStu select11(String s);
</select>
<sql id="sql1">
select * from ClassStu
</sql>
<select id="select11" parameterType="OrgMybits01.entrty.ClassStu" resultType="OrgMybits01.entrty.ClassStu">
<include refid="sql1"/> where name =#{name}
</select>
//12 // 动态sQL的测试 foreach 标签
//
String arr[] ={"101","wufan","12"};
List<ClassStu> li = classStu.select12(arr);
for (ClassStu s:li
) {
System.out.println(li);
}
//
List<ClassStu> select12(String[] arr);
<!-- /* foreach 用来便利传入的数组
array 数组
list 集合
item 每次便利出的元素。在使用改元素的时候,需要在#{}中
id就是每次便利出来的元素
collection 标识传递参数的类型
open 拼接元素的开始符号
close 拼接元素的结束符号
separator 元素与元素之间的分割符合
*/-->
<select id="select12" parameterType="OrgMybits01.entrty.ClassStu" resultType="OrgMybits01.entrty.ClassStu">
select * from ClassStu where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
13 //测试多表连接查询 查询姓名 班级
//测试多表连接查询 查询姓名 班级
List<Map<String,Object>> s= StudentDao.select16();
for (Map<String,Object> map: s
) {
Set<String> strings = map.keySet();//获取key的集合
for (String key:strings
) {
System.out.println("key:--->"+key);
System.out.println("value:--->"+map.get(key));
}
System.out.println("===============================");
}
//
List<Map<String,Object>> select16();
<select id="select16" resultType="map">
SELECT
s.name,
w.classname
FROM stu s
JOIN xu w
ON w.idd = s.calssr
</select>
14//测试多表连接查询 查询姓名 班级 vo的使用 创建一个类 属性自己定义
List<StudentVo> s =StudentDao.select17();
for (StudentVo ss:s
) {
System.out.println(ss);
}
List<StudentVo> select17();
<!--vo的使用 创建一个类 属性自己定义-->
<select id="select17" resultType="OrgMybatis.VO.StudentVo">
SELECT
s.id,
s.name,
s.age,
s.address,
w.idd,
w.classname
FROM stu s
JOIN xu w
ON w.idd = s.calssr
</select>
15 测试多表连接查询 查询姓名 班级 指定姓名
List<StudentVo> s =StudentDao.select18("we");
for (StudentVo ss:s
) {
System.out.println(ss);
}
List<StudentVo> select18(String name);
<!--vo的使用 创建一个列 属性自己定义-->
<select id="select18" resultType="OrgMybatis.VO.StudentVo">
SELECT
s.id,
s.name,
s.age,
s.address,
w.idd,
w.classname
FROM stu s
JOIN xu w
ON w.idd = s.calssr
where s.name like '%' #{name} '%'
</select>