发表于: 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 <= #{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);
}
}
测试结果
插入数据
查询数据
收获
刚开始有很多报错
和很多东西不理解
去网页一点一点搜
不会就问师兄
明天的计划
推进任务
评论