victory的博客

长安一片月,万户捣衣声

0%

MyBatis三种查询方式

1.项目目录

2.EmpSelectMapper.java

package com.atguigu.mapper;

import java.util.Map;

import org.apache.ibatis.annotations.MapKey;

import com.atguigu.bean.Emp;

public interface EmpSelectMapper {
    //根据eid查询一个员工信息
    Emp getEmpByEid(String eid);
    
    //获取所有的员工数量
    Integer getCount();
    
    //以map集合获取一个员工信息
    Map<String, Object> getEmpMapByEid(String eid);
    
    //以map集合获取所有员工信息
    
    @MapKey("eid")//设置map的建,因为在查询时传出所有的员工信息,可以把员工信息作为值,但是必须设置键
    Map<String, Object> getAllEmpMap();
}

3.EmpSelectMapper.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">
 
<mapper namespace="com.atguigu.mapper.EmpSelectMapper">
    
    
    <!-- //根据eid查询一个员工信息
    Emp getEmpByEid(String eid); -->
    <select id="getEmpByEid" resultType="Emp">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- //获取所有的员工数量
    Integer getCount(); -->
    <select id="getCount" resultType="Integer">
        select count(eid) from emp
    </select>
    
    <!-- //以map集合获取一个员工信息
    Map<String, Object> getEmpMapByEid(String eid); -->
    <select id="getEmpMapByEid" resultType="java.util.HashMap">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- //以map集合获取所有员工信息
    @MapKey("eid")//设置map的建,因为在查询时传出所有的员工信息,可以把员工信息作为值,但是必须设置键
    Map<String, Object> getAllEmpMap(); -->
    <select id="getAllEmpMap" resultType="Emp">
    select eid,ename,age,sex from emp
    </select>
    
</mapper>

4.TestSelect.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import javax.annotation.Resource;

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 com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpSelectMapper;

public class TestSelect {
    @Test
    public void testSelect() throws IOException{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpSelectMapper mapper = sqlSession.getMapper(EmpSelectMapper.class);
        //若查询出的数据有多条,则绝不能将接口中方法的返回值设置为Javabean
//        Emp emp = mapper.getEmpByEid("3");
//        System.out.println(emp);
        
        //获取员工总记录数
//        Integer i = mapper.getCount();
//        System.out.println(i);
        
        //以map获取单个emp
//        Map<String, Object> map = mapper.getEmpMapByEid("6");
//        System.out.println(map);
        
        //以map获取所有emp
        Map<String, Object> map = mapper.getAllEmpMap();
        System.out.println(map);
    }
}

MyBatis CRUD

按照MyBatis搭建过程进行项目搭建,
并在mybatis-config.xml中将按如下方式引入映射文件:

<!-- 引入映射文件 -->
<mappers>
    <!-- <mapper resource="EmpMapper.xml" />
    <mapper resource="DeptMapper.xml"></mapper> -->
    
    <!-- 此种写法要求mapper接口和mapper映射文件在同一个包下 -->
    <package name="com.atguigu.mapper"/>
    
</mappers>

CRUD 案例

1.项目目录

2.Emp.java

package com.atguigu.bean;

public class Emp {
    private Integer eid;
    private String ename;
    private Integer age;
    private String sex;
    public Integer getEid() {
        return eid;
    }
    public void setEid(Integer eid) {
        this.eid = eid;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + "]";
    }
    public Emp(Integer eid, String ename, Integer age, String sex) {
        super();
        this.eid = eid;
        this.ename = ename;
        this.age = age;
        this.sex = sex;
    }
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    
    
}

3.EmpMapper.java

package com.atguigu.mapper;

import java.util.List;

import com.atguigu.bean.Emp;

public interface EmpMapper {
    //根据eid查询员工信息
    Emp getEmpByEid(String eid);
    
    //获取所有的员工信息
    List<Emp> getAllEmp();
    
    //添加员工信息
    void addEmp(Emp emp);
    
    //修改员工信息
    void updateEmp(Emp emp);
    
    //删除员工信息
    Integer deleteEmp(String id);
}

4.EmpMapper.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">
 
<mapper namespace="com.atguigu.mapper.EmpMapper">
    <!-- Emp getEmpByEid(String eid); -->
    <select id="getEmpByEid" resultType="Emp">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- List<Emp> getAllEmp(); -->
    <select id="getAllEmp" resultType="Emp">
        select eid,ename,age,sex from emp
    </select>
    
    <!-- void addEmp(Emp emp); -->
    <insert id="addEmp">
        insert into emp values(null, #{ename}, #{age}, #{sex})
    </insert>
    
    <!-- void updateEmp(Emp emp); -->
    <update id="updateEmp" parameterType="Emp">
        update emp set ename=#{ename},age=#{age},sex=#{sex} where eid=#{eid}
    </update>
    
    <!-- void deleteEmp(String id);  -->
    <delete id="deleteEmp">
        delete from emp where eid=#{eid}
    </delete>
</mapper>

5.TestCRUD.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
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.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;

public class TestCRUD {
    @Test
    public void testCRUD() throws IOException{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//        SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        //测试:根据eid获取员工信息
//        Emp emp = empMapper.getEmpByEid("3");
//        System.out.println(emp);
        
        //测试:获取所有的员工信息
//        List<Emp> list = empMapper.getAllEmp();
//        System.out.println(list);
        
        //测试:添加员工信息
//        empMapper.addEmp(new Emp(null,"admin",23,"女"));
//        sqlSession.commit();//提交事务
        
        //测试:修改员工信息
        empMapper.updateEmp(new Emp(2, "张二", 33, "女"));
        
        //测试:删除员工信息
//        Integer rowNum = empMapper.deleteEmp("5");
//        System.out.println(rowNum);//返回值类型为Integer:返回受影响的行数 Boolean:·
    }
}

MyBatis搭建过程

1.导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包

myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar

2.创建MyBatis的核心(全局)配置文件mybatis-config.xml并配置(如何连接数据库)
3.创建映射文件XxxMapper.xml并配置(如何操作数据库)
4.创建mapper接口,实现两个绑定:
4.1接口全限定名要和映射文件的namespace保持一致
4.2接口中方法名和SQL语句的id保持一致
5.获取MyBatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

6、测试

阅读全文 »

迭代器

# 创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
class MyNumbers:
    def __iter__(self):
        self.a = 0
        return self

    def __next__(self):
        self.a = self.a + 1
        return self.a

# 奇数迭代器
class MyOddNumbers:
    def __iter__(self):
        self.num = 1
        return self

    def __next__(self):
        self.num = self.num + 2
        return self.num

# 偶数迭代器
class MyEvenNumbers:
    def __iter__(self):
        self.num = 0
        return self

    def __next__(self):
        self.num = self.num + 2
        return self.num

myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print("======================================")
my_odd_numbers = MyOddNumbers()
my_odd_numbers_iter = iter(my_odd_numbers)
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print("======================================")
my_even_numbers = MyEvenNumbers()
my_even_numbers_iter = iter(my_even_numbers)
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))

property和property装饰器

class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, new_name):
        self.__name = new_name

    name = property(get_name, set_name)

s = Student("张三")
s.name = "李四"
print(s.name)

class Student:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, new_name):
        self.__name = new_name

s = Student("张三")
s.name = "李四"
print(s.name)

强软弱虚四大引用

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class StudentClass{
    @Override
    protected void finalize() throws Throwable{
        System.out.println("student对象被回收了");
    }
}

public class ReferencesTest {
    public static void main(String[] args) {
        
        /**
         * 强引用
         * 只要某个对象有强引用与之关联,这个对象永远不会被回收,即使内存不足,JVM宁愿抛出OOM,也不会去回收。
         */
        //StudentClass student = new StudentClass();
        //student = null;//断开强引用与对象之间的关联
        //System.gc();
        
        
        /**
         * 软引用
         * 内存不足时,JVM会回收软引用关联的对象
         * 
         * 比较适合用作缓存,当内存足够,可以正常的拿到缓存,当内存不够,就会先干掉缓存,不至于马上抛出OOM。
         */
//        SoftReference<byte[]> softReference = new SoftReference<byte[]>(new byte[1024*1024*10]);
//        System.out.println(softReference.get());
//        System.gc();
//        System.out.println(softReference.get());
//        byte[] bytes = new byte[1024 * 1024 * 10];
//        System.out.println(softReference.get());
        
        /**
         * 弱引用
         * 不管内存是否足够,只要发生GC,都会被回收
         */
//        WeakReference<byte[]> weakReference = new WeakReference<byte[]>(new byte[1]);
//        System.out.println(weakReference.get());
//        System.gc();
//        System.out.println(weakReference.get());
        
//        [B@15db9742
//         null
        
        /**
         * 虚引用
         * 特点一:无法通过虚引用来获取对一个对象的真实引用
         * 特点二:虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。
         * 
         * 
         * Unlike soft and weak references, phantom references are not
 automatically cleared by the garbage collector as they are enqueued.  An
object that is reachable via phantom references will remain so until all
such references are cleared or themselves become unreachable.
         */
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        List<byte[]> bytes = new ArrayList<>();
        PhantomReference<StudentClass> reference = new PhantomReference<StudentClass>(new StudentClass(),referenceQueue);
        
        new Thread(() -> {
            for (int i = 0; i < 100;i++ ) {
                bytes.add(new byte[1024 * 1024]);
            }
        }).start();
 
        new Thread(() -> {
            while (true) {
                Reference poll = referenceQueue.poll();
                if (poll != null) {
                    System.out.println("虚引用被回收了:" + poll);
                }
            }
        }).start();
        Scanner scanner = new Scanner(System.in);
        scanner.hasNext();
    }
}

单例模式

单例模式(Singleton),保证一个类有一个实例,并提供一个访问它的全局访问点。

“通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身保存
它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

阅读全文 »

工厂方法模式

why 工厂方法模式?
简单工厂模式违背了开放封闭原则(开放了拓展,也开放了修改),如果需要增加功能就需要在工厂类中修改逻辑判断,于是工厂方法模式应运而生。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到子类。

阅读全文 »