发表于: 2019-10-15 19:37:48

1 720


今天做的事情

之前做JDBC的数据是用网站的例子

今天重新做了一下把报名帖的格式带了进去

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TestJDBC {
public static void main(String[] args) {

try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

try (
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2j?characterEncoding=UTF-8",
"root", "root");
Statement s = c.createStatement();
)
{
String sql = "insert into category_ values(null,'金石开','1050376715', '产品经理', 20180710,'北京师范大学',1359,'http://www.jnshu.com/school/28015/daily','如果我不能在IT特训营拼尽全力,为自己以后的修行路上打好基础,就让我变胖2','李天宇','朋友介绍')";
s.execute(sql);

} catch (SQLException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
}
}
}

效果


Mybatis连接数据库


MyBatis工作原理

读取 MyBatis 配置文件 mybatis-config.xmlo mybatis-config.xml 作为 MyBatis 的全局配 置文件,配置了 MyBatis 的运行环境等信息,其中主要内容是获取数据库连接。

加载映射文件 Mapper.xmlo Mapper.xml 文件即 SOL 映射文件,该文件中配置了操作 数据库的 SOL 语句,需要在 mybatis-config.xml 中加载才能执行。 mybatis-config.xml 可以加 载多个配置文件,每个配置文件对应数据库中的一张表。

构建会话工厂。 通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。


创建 SqlSession 对象。 由会话工厂创建 SqlSession 对象,该对象中包含了执行 SOL 的所有方法。

MyBatis 底层定义了一个 Executor 接口来操作数据库,它会根据 SqlSession 传递的参 数动态地生成需要执行的 SOL 语句,同时负责查询缓存的维护。

在 Executor 接口的执行方法中,包含一个 MappedStatement 类型的参数, 该参数是对映射信息的封装 ,用于存储要映射的 SOL 语句的 id、参数等。 Mapper.xml 文件中一个 SOL 对应一个. MappedStatement 对象 , SOL 的 id 即是 MappedStatement 的 id。

7.输入参数映射。 在执行方法时, MappedStatement 对象会对用户执行 SOL 语句的输入 参数进行定义(可以定义为 Map、List 类型、基本类型和 POJO 类型 ), Executor 执行器会通过 MappedStatement 对象在执行 SOL 前,将输入的 Java 对象映射到 SOL 语句中 。 这里对输入参 数的映射过程就类似于 JDBC 编程中对 preparedStatement 对象设置参数的过程。

输出结果映射。 在数据库中执行完 SOL 语句后, MappedStatement 对象会对 SOL 执 行输出的结果进行定义(可以定义为 Map 和List 类型、基本类型、 POJO 类型 ), Executor 执行 器会通过 MappedStatement 对象在执行 SOL 语句后,将输出结果映射至 Java 对象中。 这种将 输出结果映射到 Java 对象的过程就类似于 JDBC 编程中对结果的解析处理过程。


SqlSessionFactory

SqlSessionFactory 是 MyBatis 框架中十分重要的对象,它是单个数据库映射关系经过编译 后的内存镜像,其主要作用是创建 SqlSession。

SqlSessionFactory 对象的实例可以过SqlSessionFactoryBuilder 对象来构建,而 SqlSessionFactoryBuilder 则可以通过 XML 配置文件 或一个预先定义好的 Configuratiori 实例构建出 SqlSessionFactory 的实例。

Sq ISessionFactory 对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。 如果我 们多次地创建同一个数据库的 SqlSessionFactory,那么此数据库的资源将很容易被耗尽。 为了解决 此问题,通常每一个数据库都会只对应一个 SqlSessionFactory


添加JAR包

去maven网站搜索下载






mav配置mybatis_conf.xml文件



configuration>

    <!-- 引入外部的properties文件,只能引入一个 -->

    <properties resource="jdbc.properties" />

    

    <settings>

        <setting name="mapUnderscoreToCamelCase" value="false"/>

    </settings>

    

    <!-- 定义类型别名(全局),在所有的Mapper.xml中都可以用 -->

    <typeAliases>

        <typeAlias type="com.lanou3g.mybatis.bean.Teacher" alias="Teacher" />

        <typeAlias type="com.lanou3g.mybatis.bean.Student" alias="Student" />

    </typeAliases>

    <!-- 配置多套环境的数据库连接参数(如:开发环境、生产环境) -->

    <environments default="zhangguosheng">

    <environment id="zhangguosheng">

        <!-- 事务管理器:

            MANAGED: 这个配置就是告诉mybatis不要干预事务,具体行为依赖于容器本身的事务处理逻辑。

            JDBC: 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

         -->

        <transactionManager type="MANAGED"/>

        <dataSource type="POOLED">

            <property name="driver" value="${jdbc.driver}"/>

            <property name="url" value="${jdbc.url}"/>

            <property name="username" value="${jdbc.user}"/>

            <property name="password" value="${jdbc.password}"/>

        </dataSource>

    </environment>

        <environment id="zhangguosheng">

            <transactionManager type="MANAGED"/>

            <dataSource type="POOLED">

                <property name="driver" value="${zhangguosheng.jdbc.driver}"/>

                <property name="url" value="${zhangguosheng.jdbc.url}"/>

                <property name="username" value="${zhangguosheng.jdbc.user}"/>

                <property name="password" value="${zhangguosheng.jdbc.password}"/>

            </dataSource>

        </environment>

</environments>

<!-- 将mapper SQL映射文件包含进来 -->

    <mappers>

        <mapper class="com.lanou3g.mybatis.dao.StudentDao" />

        <mapper resource="mapper/TeacherMapper.xml" />

        <mapper resource="mapper/StudentMapper.xml" />

        <mapper class="com.lanou3g.mybatis.dao.CourseDao" />

    </mappers>




SRC配置文件




配置properties


jdbc.url=jdbc:mysql://localhost:3306/ZGS?characterEncoding=utf8

jdbc.driver=com.mysql.jdbc.Driver

jdbc.user=root

jdbc.password=zxcvbnm.

zhangguosheng.jdbc.url=jdbc:mysql://localhost:3306/ZGS?characterEncoding=utf8

ZGS.jdbc.driver=com.mysql.jdbc.Driver

ZGS.jdbc.user=root

ZGS.jdbc.password=zxcvbnm.


以xml方式为例进行数据库操作

建立一个接口如Teacher接口:


public interface TeacherDao {

    List<Teacher> queryAll();

    /**

    

   // List<Teacher> queryByIdAndAge(@Param("TID") int id, @Param("Tage") int age);

    int insertTeacher(Teacher teacher);

    int insertTeacherByParam(@Param("Tname") String tname, @Param("Tage") int age);

   /* Teacher queryById(int id);

    Teacher queryByAge(int age);*/

    int updateTeacherById(Teacher teacher);

    int deleteTeacherById(int id);

}


建一个对应的Teacher实体类:


public class Student {

    private String sname;

    private String ssex;

    public Student() {}

    public Student(String sname, String ssex) {

        this.sname = sname;

        this.ssex = ssex;

    }

    

    public String toString() {

        return "{" +

                "sname='" + sname + '\'' +

                ", sex='" + ssex + '\'' +

                "}\n";

    }

}

创建一个Mapper—TeacherMapper.xml


<mapper namespace="com.lanou3g.mybatis.dao.TeacherDao">

    <resultMap id="teacher" type="Teacher">

        <result property="id" column="TID" />

        <result property="age" column="Tage" />

        <result property="tname" column="Tname" />

    </resultMap>

    <!-- 此处的id是查询语句的名称,对应接口中的方法名 -->

<select id="queryAll" resultMap="teacher">

        select * from teacher;

      </select>

       <!-- 带一个简单类型的参数, 这种情况下parameterType属性可以省略,mybatis可以自动推断出类型 -->

   <!-- <select id="queryById" parameterType="int" resultMap="teacher">

        select * from teacher where TID = #{id};

    </select>

    <select id="queryByAge" parameterType="int" resultMap="teacher">

        select *from  teacher where Tage = #{age};

    </select>-->

    <!-- 带两个参数,需要在接口中通过@Param注解指定名称(因为编译时参数名不会保留) -->

   <!-- <select id="queryByIdAndAge" resultMap="teacher">

        select * from teacher where TID = #{TID} and Tage &lt;= #{Tage};

    </select>-->

    <!-- insert、update、delete的返回值都是int(影响行数) -->

    <!-- 自定义类型参数,通过#{属性名}可以直接获取引入类型参数的属性值 -->

    <insert id="insertTeacher" parameterType="Teacher" >

       insert into teacher(Tname) values (#{tname});

    </insert>

  <insert id="insertTeacherByParam">

       insert into teacher(Tname, Tage) values (#{Tname}, #{Tage});

    </insert>

    <update id="updateTeacherById" parameterType="Teacher">

        update teacher set Tname = #{tname}, Tage = #{age} where TID = #{id}

    </update>

    <delete id="deleteTeacherById">

        delete from teacher where TID = #{id};

    </delete>

测试


public void testQueryAll() {

      

         //查询教师表

  /*TeacherDao teacherDao = MyBatisTools.getInstance().openSession().getMapper(TeacherDao.class);

        List<Teacher> teacherList = teacherDao.queryAll();

        log.info("teacherList: " + teacherList);*/

    }

   

    public void testInsert() {

        // 新增Teacher表

        System.out.println("--------------插入前:");

        List<Teacher> teacherList = teacherDao.queryAll();

        System.out.println(teacherList);

        int ret = teacherDao.insertTeacher(new Teacher("铜赛赛"));

        log.info("影响的行数: " + ret);

        // 比较low的写法(不推荐)

        /*int ret = teacherDao.insertTeacherByParam("哈哈嗝", 99);

        log.info("影响的行数: " + ret);*/

        System.out.println("--------------插入后:");

        teacherList = teacherDao.queryAll();

        System.out.println(teacherList);

    }

    /

    public void testQueryById() {

        Teacher teacher = teacherDao.queryById(6);

        System.out.println(teacher);

    }

   

    public void testQueryByAge() {

        Teacher teacher = teacherDao.queryByAge(24);

        System.out.println(teacher);

    }*/

    /**

     * 多个参数查询语句

     */

    /

    public void testQueryByIdAndAge() {

        List<Teacher> teacherList = teacherDao.queryByIdAndAge(6, 99);

        log.info("查询结果:"  + teacherList);

    }*/

   

    public void testUpdate() {

        Teacher teacher = new Teacher();

        teacher.setId(6);

        teacher.setAge(98);

        teacher.setTname("托尼托尼乔巴老师");

        int rows = teacherDao.updateTeacherById(teacher);

        log.info("更新行数:" + rows);

    }

    

    public void testDelete() {

        int rows = teacherDao.deleteTeacherById(30);

        log.info("删除行数:" + rows);

    }

}

测试结果

插入数据


查询数据




收获

刚开始有很多报错

和很多东西不理解

去网页一点一点搜

不会就问师兄


明天的计划 

推进任务



返回列表 返回列表
评论

    分享到